实现按下16个不同按键后数码管显示不同数字或字母
使用矩阵按键时,跳线帽跳到左边
#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int
void delay(int ms);
void Key_scan();
u8 num;
u8 tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XC6,0xA1,0x86,0x8E,0x89,0xC7};//数码管码值
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//关闭蜂鸣器
P2=0XC0;P0=0X04;P2=0XFF;P0=0XFF;//开启数码管
while(1)
{
Key_scan();
P0=tab[num];
}
}
void delay(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Key_scan()
{
u8 temp;
//第一列
P44=0;P42=1;P3=0X7F;//0111 1111 第一位为低位
temp=P3;//0111 1110
temp=temp&0X0F;
if(temp!=0X0F)
{
delay(5);
temp=P3;
temp=temp&0X0F;//0111 1110& 0000 1111 == 0000 1111高位全部归为0
if(temp!=0X0F)
{
temp=P3;//不进行与操作
switch(temp)
{
case 0X7E: num=1;break; //1110
case 0X7D: num=2;break; //1101
case 0X7B: num=3;break; //1011
case 0X77: num=4;break; //0111
}
while(temp!=0X0F) //松手检测
{
temp=P3;
temp=temp&0x0f;
}
}
}
//第二列
P44=1;P42=0;P3=0XBF;//1011 1111 第二位为低位
temp=P3;//0111 1110
temp=temp&0XBF;
if(temp!=0XBF)
{
delay(5);
temp=P3;
temp=temp&0XBF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0
if(temp!=0XBF)
{
temp=P3;//不进行与操作
switch(temp)
{
case 0XBE: num=5;break; //1110
case 0XBD: num=6;break; //1101
case 0XBB: num=7;break; //1011
case 0XB7: num=8;break; //0111
}
while(temp!=0XBF) //松手检测
{
temp=P3;
temp=temp&0xBF;
}
}
}
//第三列
P44=1;P42=0;P3=0XDF;//1011 1111 第三位为低位
temp=P3;//0111 1110
temp=temp&0XDF;
if(temp!=0XDF)
{
delay(5);
temp=P3;
temp=temp&0XDF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0
if(temp!=0XDF)
{
temp=P3;//不进行与操作
switch(temp)
{
case 0XDE: num=9;break; //1110
case 0XDD: num=10;break; //1101
case 0XDB: num=11;break; //1011
case 0XD7: num=12;break; //0111
}
while(temp!=0XDF) //松手检测
{
temp=P3;
temp=temp&0xDF;
}
}
}
//第四列
P44=1;P42=0;P3=0XEF;//1011 1111 第四位为低位
temp=P3;//0111 1110
temp=temp&0XEF;
if(temp!=0XEF)
{
delay(5);
temp=P3;
temp=temp&0XEF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0
if(temp!=0XEF)
{
temp=P3;//不进行与操作
switch(temp)
{
case 0XEE: num=1;break; //1110
case 0XED: num=2;break; //1101
case 0XEB: num=3;break; //1011
case 0XE7: num=4;break; //0111
}
while(temp!=0XEF) //松手检测
{
temp=P3;
temp=temp&0xEF;
}
}
}
}
P42,P44对应CT107D上的P36、P37