基于AVR的4*4矩阵键盘扫描与LED显示程序
/**************
此程序在别人的基础上进行了一些修改,能应用到我的开发板中,
并与我自制的外接按键和LED灯配合使用,在此感谢原创者!!!
硬件:M16
作用:当按下按键时显示相对应的按键控制的LED灯
频率:8.000000MHZ
开发板:EasyAVR M16 v12
编译软件:ICCAVR6.31A
下载软件:AVRstudio4.14
编写人:伍建忠
编写日期:2011.10.14
修改日期:
************/
#includeiom16v.h>
#includemacros.h>
#define uchar unsigned char
#define uint unsigned int
uint key_num=20;
//以下为左右移动参数宏定义
#define crol(a,n)a=(a>(8-n))
#define cror(a,n)a=(a>>n)|(a(8-n))
void delay(void)
{
uint i;
for(i=1;i100;i++);
}
void delay_1ms(void)
{
uint i;
for(i=1;i(uint)(8*143-2);i++);
}
void delay_ms(uint time)
{
uint i=0;
while(i)
{
delay_1ms();
i++;
}
}
void port_init(void)
{
DDRA=0xff;
PORTA=0xff;
DDRB=0x00;
PORTB=0x00;
DDRC=0xff;//
PORTC=0xff;//
DDRD=0xf0;//D口低四位为输入,置高电平。
PORTD=0x00;//高四位为输出,置低电平。
}
uchar key_scan(void)
{
uchar i,j;
DDRD=0xf0;
PORTD=0x00;//初始运行时输出全为0
if((PIND0x0f)==0x0f)//判断有无按键按下
return 20;
else
{
delay_ms(10);
if((PIND0x0f)==0x0f)//第二次判断,必不可少
return 20;
else
{
for(i=4;i8;i++)//扫描行线
{
PORTD=~(1i)|0x0f;//行线上是否有拉低
for(j=0;j4;j++)//扫描列线
{
if((PIND(1j))==0)//列线上有无按键按下
key_num=((i-4)*4+j);//确定按键值
}
}
return key_num;//无键按下则返回初始状态
}
}
}
void led_display(void)//按键按下时在LED上显示相应的状态
{
switch(key_num)
{
case 0: PORTA=0xfe; PORTD=0xee; break;
case 1: PORTA=0xfc; PORTD=0xde; break;
case 2: PORTA=0xf8; PORTD=0xbe; break;
case 3: PORTA=0xf0; PORTD=0x7e; break;
case 4: PORTA=0xe0; PORTD=0xed; break;
case 5: PORTA=0xc0; PORTD=0xdd; break;
case 6: PORTA=0x07; PORTD=0xbd; break;
case 7: PORTA=0x55; PORTD=0x7d; break;
case 8: PORTA=0xaa; PORTD=0xeb; break;
case 9: PORTA=0xcc; PORTD=0xdb; break;
case 10: PORTA=0xbb; PORTD=0xbb; break;
case 11: PORTA=0x77; PORTD=0x7b; break;
case 12: PORTA=0xf0; PORTD=0xe7; break;
case 13: PORTA=0x66; PORTD=0xd7; break;
case 14: PORTA=0xee; PORTD=0xd7; break;
case 15: PORTA=0xdd; PORTD=0x77; break;
default: break;
key_num=16;
}
}
void main(void)
{
#ifdef debag1
key_code=2;
#endif
port_init();//调用端口初始化函数
while(1)
{
key_scan();//调用按键扫描函数
led_display();//调用显示函数
}
}
- Flash损耗均衡的嵌入式文件系统设计(06-01)
- 锁相环控制及初始化简析(08-27)
- 基于AVR单片机的ISP1362OTG设计(09-06)
- 基于AVR单片机的串口转FSK的通信模块设计(01-23)
- 案例分析:基于AVR32的隧道环境监测系统(03-18)
- 科技帮我们远离灾难:灾难检测飞行器(03-18)