矩阵键盘检测思路:行线设为输出、列线设为输入获得列码,行线设为输入、列线设为输出获得行码,由行列码确定键值。
本程序可改进的地方:按键状态机中,将等待按键释放语句移到第三个状态中,可进一步提高按键扫描程序效率。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P3^0;
sbit wela=P3^1;
#define keyport (P1)
#define keystate0 0 //按键确认状态
#define keystate1 1 //按键无动作状态
char keystate=1; //按键状态初始化为按键无动作状态
uchar keynum=0;
void delayms(uint x) //1ms
{
uint y,z;
for(y=x;y>0;y--)
for(z=111;z>0;z--);
}
uchar code table[]={ //共阳数码管
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void smg()
{
dula=0;
wela=0;
P2=0x01;
wela=1;
wela=0;
P2=table[keynum];
dula=1;
dula=0;
delayms(1);
P2=0x02;
wela=1;
wela=0;
P2=table[keynum];
dula=1;
dula=0;
delayms(1);
P2=0x04;
wela=1;
wela=0;
P