微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机矩阵键盘程序(2种方法)

AVR单片机矩阵键盘程序(2种方法)

时间:11-29 来源:互联网 点击:
AVR矩阵键盘2种方法实现!

普通方法:

#include//
#include//
#define uchar unsigned char//
#define uint unsigned int//
#define setb(val,bitn) (val|=(1<(bitn)))//设置某IO口某位为1
#define clr(val,bitn) (val&=~(1<(bitn)))//设置某IO口某位为0
#define get(val,bitn) (val&(1<(bitn)))//读取某位状态如if(get(PORTC,7))即判断PC7口是否为1
#pragma data:code//数组存放位置
const table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e
};//共阳数码管0--9代码
ucharnum,yin,temp;//键值码及识别码
voiddelay(uchar);//延时函数
void disy();//显示函数
void skk()
{
for(yin=0;yin<2;yin++)
{
PORTD=0xfe;//将第一行置0,即检测第一行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay(10);//延时
temp=PIND;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PIND;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)//开关语句
{
case 0xee:num=0;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xde:num=1;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xbe:num=2;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0x7e:num=3;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PIND;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}

for(yin=0;yin<2;yin++)
{
PORTD=0xfd;//将第一行置0,即检测第一行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay(10);//延时
temp=PIND;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PIND;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)//开关语句
{
case 0xed:num=4;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xdd:num=5;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xbd:num=6;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0x7d:num=7;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PIND;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
for(yin=0;yin<2;yin++)
{
PORTD=0xfb;//将第一行置0,即检测第一行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay(10);//延时
temp=PIND;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PIND;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)//开关语句
{
case 0xeb:num=8;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xdb:num=9;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xbb:num=10;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0x7b:num=11;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PIND;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}
}
for(yin=0;yin<2;yin++)
{
PORTD=0xf7;//将第一行置0,即检测第一行
temp=PIND;//将值给tem
temp=temp&0xf0;//与0xf0与门一下,
while(temp!=0xf0)//判断是否为0xf0
{
delay(10);//延时
temp=PIND;//将P1值再给tem
temp=temp&0xf0;//将值再与门
while(temp!=0xf0)//再次判断是否为0xf0
{
temp=PIND;//确实按下了,将tem值装回,以便下次判断开关语句,否则没有它对应的值,如原来是ee,如果再按下是第二个键就不是de了
switch(temp)//开关语句
{
case 0xe7:num=12;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xd7:num=13;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0xb7:num=14;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
case 0x77:num=15;//与num值比较是否相等,如果相等就退出switch语句
break;//退出switch语句
}
while(temp!=0xf0)//松手判断,以便退出以上两个while
{
temp=PIND;//给temp赋值
temp=temp&0xf0;//与门一下
}
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top