矩阵按键数码管
选用芯片AT89S52
功能:16个矩阵按键分别对应0~F,在数码管显示。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
u16 i,j;
u16 k=0;
#define jk P1
#define smg P0
u8 code smgduan[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管显示0-F
void delayms(u16 ms) //毫秒延时
{
for(i=0;i<ms;i++)
{
for(j=115;j>0;j--);
}
}
void key_scan() //按键扫描
{
jk=0xf0; //先给行和列分别赋值高低电平,这样按下后才能检测到
if(jk!=0xf0)
{
delayms(20);
if(jk!=0xf0)
{
jk=0xf0;
switch(jk) //先扫描确定是哪一列
{
case(0xe0):k=0;break;
case(0xd0):k=1;break;
case(0xb0):k=2;break;
case(0x70):k=3;break;
}
jk=0x0f;
switch(jk) //再确定是哪一行,由此确定具体按键
{
case(0x0e):k=k;break;
case(0x0d):k=k+4;break;
case(0x0b):k=k+8;break;
case(0x07):k=k+12;break;
}
}
}
}
void main()
{
P2=0xfe;
while(1)
{
key_scan();
smg=smgduan[k];
}
}