AVR单片机矩阵键盘程序(2种方法)
}
}
void main()
{
DDRD|=0xff;//设置PB口为输出
PORTD|=0xff;//PB输出为高电位
DDRD&=0x0f;//设置高
while(1)//大循环
{
skk();
disy();//调用显示子程序
}
}
void delay(uchar z)//延时子函数
{
uchar x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void disy()//显示子函数
{
DDRC=0xff;
DDRB=0xff;
PORTB=table[num];
PORTC=0x00;
}
简单方法:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#pragma data:code//定义程序存在ROM里面
const table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e,0xff
};
/***********************************************/
/*******************延时子程序******************/
/***********************************************/
void delay(uchar z)
{
uchar x,y;
for(x=0;x<50;x++)
for(y=0;y
/***********************************************/
/*******************显示子程序******************/
/***********************************************/
void xian(uchar num)
{
uchar i;
PORTB=table[num];//十位
PORTC=0x00;
}
/***********************************************/
/***************按键按下处理程序***************/
/***********************************************/
uchar key_press()
{
uchar i;
DDRD=0XFF;//设置PD口全为输出
PORTD=0XF0;//设置PD高四位为高电平,以便进行判断
DDRD=0X0F;//设置高4位为输入,低4位为输出
i=PIND;//读出IO口状态
if(i==0XF0)//如果它等于0XF0就执返回0
{
DDRD=0XFF;//将IO口值读回来
return 0;
}
else//否则它就执返回1
{
DDRD=0XFF;
return 1;
}
}
/***********************************************/
/***************按键键值处理程序***************/
/***********************************************/
uchar key_scan()
{
uchar key,i=0X7F,j;//将变量I设置为01111111B
if(key_press())//判断按键是否被按下了
{
delay(10);//如果被按下了,消下抖
if(key_press())//再次判断下按键是否被按下了
{
do//先执行一次
{
i=(i<1|i>>7);/*将变量I内容左移1位,11111110
然后将I右移7位,11111110,即实现11111110
11111101 11111011 11110111*/
PORTD=i;//将移位后的值给PD口
DDRD=0X0F;//将PD口高位设为输入,低位设为输出
key=PIND;//将IO口高位值读一下
j=key&0XF0;//只需要读高4位
}
while(j==0XF0);//如果按键没有按下,则再执行上面的do语句
while(key_press());//如果有按下则释放一下
switch(key)//确定有按键按下了就判断下到底是哪个值
{
case 0xEE:
key=0x0;
break;
case 0xDE:
key=0x1;
break;
case 0xBE:
key=0x2;
break;
case 0x7E:
key=0x3;
break;
case 0xED:
key=0x4;
break;
case 0xDD:
key=0x5;
break;
case 0xBD:
key=0x6;
break;
case 0x7D:
key=0x7;
break;
case 0xEB:
key=8;
break;
case 0xDB:
key=9;
break;
case 0xBB:
key=0xA;
break;
case 0x7B:
key=0xB;
break;
case 0xE7:
key=0xC;
break;
case 0xD7:
key=0xD;
break;
case 0xB7:
key=0xE;
break;
case 0x77:
key=0xF;
break;
}
}
}
return key;//返回按键值
}
/***********************************************/
/*******************主程序*********************/
/***********************************************/
void main()
{
uchar ik=16;//定义局部变量
DDRB=0xff;//设置PB口为输出
DDRC=0xff;//设置PC口为输出
while(1)
{
ik=key_scan();//将按键返回值给变量IK
if(ik<16)//如果返回值小于16就在数码管上显示出来
xian(ik); //调用显示子程序
else//如果返回值不小于16,就显示黑屏
xian(16);
}
}
AVR单片机矩阵键 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)