#include<reg51.h>
#include<intrins.h>
typedef unsigned char uchar;
uchar key_value = 16;
uchar code SEG_TAB[16]= {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar code KEY_CODE_TAB[16]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
void Delayms(uchar k)
{
unsigned char i,j;
for(;k>0;k--)
for(i=0;i<10;i++)
for (j=0;j<48;j++)
{;}
}
void scan_key(void)
{
unsigned char x,y,key_code,i;
P3=0xf0;
x = P3&0xf0;
if(x!=0xf0)
{
Delayms(10); //消抖
x = P3&0xf0;
if(x!=0xf0)
{
x=P3&0xf0; //读取P3口数据
P3=0x0f;
y=P3&0x0f;
key_code=x|y;
while(y!=0x0f)
y=P3&0x0f; //wait to release key
for(i=0;i<16;i++) //识别是哪个按键
{
if(key_code== KEY_CODE_TAB[i])
key_value =i;
}
}
}
}
void deal_key(void)
{
if(key_value < 16)
{
P0 = SEG_TAB[key_value];
Delayms(1);
}
}
//数码管函数
void display(void)
{
P0 = 0x80; //10000000
P2 = 0xC0; //11000000 //位选---个位
P2 = 0x00;
P0 = SEG_TAB[key_value %10]; //段码---个位
P2 = 0xE0; //11100000
P2 = 0x00;
Delayms(1);
P0 = 0x40; //01000000 //位选---十位
P2 = 0xC0;
P2 = 0x00;
P0 = SEG_TAB[key_value /10]; //段码---十位
P2 = 0xE0;
P2 = 0x00;
Delayms(1);
}
void main()
{
while(1)
{
scan_key();
deal_key();
display();
}
}
单片机没坏