您的位置 首页 新品

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

AVR矩阵键盘2种方法实现!普通方法:includeiom16vh>includemacrosh>defineucharunsignedchardefineuintunsigned

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;//与门一下
}
}
}

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/255363.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部