|
发表于 2005-9-17 15:44:31
|
显示全部楼层
楼主在吗,为什么你的程序我改了用C口扫描之后就不能运行了,??????????
/*--------------------------------------------------------------------------------
**工程名称:键盘扫描测试程序
**编译器:ICCAVR6.31A pro
**日期:2005.04.14
**芯片类型:M16
**时钟频率:外接4M
接口:
MCU----(8个单个)LED(从左至右)
PA0----LED0
.
.
PA7----LED7
MCU----键盘
PD0----Y1 (列)
:
PD2----Y3
//////////////////
PD4----X1 (行)
:
PD7----X4
其它:
M16芯片,外接4M晶振,ICCAVR 6.31A编译通过。
说明:初始时8个LED全亮,按0号则0号LED熄灭,按1号1号LED灭……………………
键号大于7两个LED灭
键号安排
0 4 8
1 5 9
2 6 10
3 7 11
---------------------------------------------------------------------------------*/
#include <iom16v.h>
#include <macros.h>
/*------------------------------------函数声明----------------------------------*/
signed char get_key(void);
void delay_1us(void);
void delay_nus(unsigned int n);
void delay_1ms(void);
void delay_nms(unsigned int n);
/*----------------------------------主函数--------------------------------------*/
void main(void)
{
//端口初始化
DDRA=0xff;
PORTA=0x00;
DDRC=0x0F;
PORTC=0xFF;
//死循环,获取键值,并在发光二极管上提示
while(1)
{
signed char key;
key=get_key();
if(key!=0xff)
{
switch(key)
{
case 0:PORTA=0x01;break;
case 1:PORTA=0x02;break;
case 2:PORTA=0x04;break;
case 3:PORTA=0x08;break;
case 4:PORTA=0x10;break;
case 5:PORTA=0x20;break;
case 6:PORTA=0x40;break;
case 7:PORTA=0x80;break;
case 8:PORTA=0x03;break;
case 9:PORTA=0x06;break;
case 10:PORTA=0x0c;break;
case 11:PORTA=0x18;break;
default:break;
}
}
}
}
/*----------------------------------------------获取按键函数---------------------------------*/
//获取键值函数,返回0~11号按键,无按键按下则返回0xff
signed char get_key(void)
{
unsigned char i,tem;
DDRC=0x0f;//使能键盘口高四位的上拉电阻
PORTC=0xff;
for(i=0;i<3;i++)//若4*4键盘,这里应为i<4,因为现在PD3悬空,PD3没电平变化,所以你改i<4也不会出错^__^
{
PORTC=~(1<<i);//键盘线扫描,从PD0~PD2逐位电位变低
delay_nus(100);//延时等待电平稳定
tem=PINC&0xf0;//读键盘扫描信号(PD口高四位)状态,屏蔽低四位
if(tem!=0xf0)//若PD高四位不等于0xf0,则PD高四位引脚有可能被拉低(即有按键按下)
{
delay_nms(15);//延时消抖动
tem=PINC&0xf0;//再读键盘
if(tem!=0xf0)//确认按键按下
{
tem&=0xf0;
switch(tem)//计算键值
{
case 0x70:tem=15-(3-i)*4;break;//这里可以改tem=11-(2-i)*4,不过一改4*4键就不适用了^___^
case 0xb0:tem=14-(3-i)*4;break;
case 0xd0:tem=13-(3-i)*4;break;
case 0xe0:tem=12-(3-i)*4;break;
default:break;
}
return tem;//返回0~11号键
}
}
PORTC=0xff;
}
return 0xff;//无按键按下则返回0xff
}
/*--------------------------------------------延时函数------------------------------------*/
//1us延时函数
void delay_1us(void)
{
NOP();
}
//n us 延时函数
void delay_nus(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1us();
}
//1ms延时函数
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<600;i++);
}
//n ms延时函数
void delay_nms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1ms();
}就是这个程序,就不能在实验板上运行了,请问是那里有错??? |
|