线反转法键盘扫描,数码管显示健值(原创)。。《初学者,望指教》以下是程序。。。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keytab[4][4]={{11,12,13,14}, //键盘编码
{21,22,23,24},
{31,32,33,34},
{41,42,43,44}
};
uchar tabled[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段选显示数字编码
uchar code tablew[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选编码
void Delay(uint i);//延时函数申明
uchar keyscan();//键盘扫描函数申明
void table();//数码管显示函数申明
void main() //主函数
{
while(1)
{
table();
}
}
void Delay(uint i) //延时函数
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
uchar keyscan() //键盘扫描函数
{
uchar hang,lie,ltemp,htemp,KEY;
P1=0xf0;
while(1)
{
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
Delay(20);
if((P1&0xf0)!=0xf0)
{
htemp=P1;
switch(htemp)
{
case 0xe0: hang=0;break;
case 0xd0: hang=1;break;
case 0xb0: hang=2;break;
case 0x70: hang=3;break;
}
P1=0x0f;
Delay(10);
ltemp=P1;
switch(ltemp)
{
case 0x07: lie=0;break;
case 0x0b: lie=1;break;
case 0x0d: lie=2;break;
case 0x0e: lie=3;break;
}
KEY=keytab[hang][lie];
return KEY;
}
}
}
}
void table()//数码管显示函数
{
uint i,j;
uchar temp[1];
temp[0]=keyscan();
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(temp[0]==keytab[i][j])
{
P2=0;
P0=tabled[i*4+j];
};
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
能详细说下吗???我初学者,谢谢指教。。
一周热门 更多>