//********各位大虾为什么显示出了毛病…………………………
#include<reg52.h>
//#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uchar);/****延时声明******/
void display(uchar dat);/***显示声明*****/
void keyscan(); /******键盘扫描声明****/
sbit LS138A=P2^2; /*****led的位选******/
sbit LS138B=P2^3; /*****led的位选******/
sbit LS138C=P2^4; /*****led的位选******/
void keydown(void);
uchar code dis[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x86,0xc7,0xff};
uchar temp,num,wel[2],key,disbuf;
void main()
{
while(1)
{
P0=0xFF;
keydown();
display(disbuf);
}
}
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<125;i++);
}
void keydown(void)
{
P0=0xF0;
if(P0!=0xF0)
keyscan();
}
void keyscan()
{
temp = 0;
P0=0xF0; //高四位输入 行为高电平 列为低电平
delayms(1);
temp=P0; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
else
key=16;
P0=0x0F; //低四位输入 列为高电平 行为低电平
delayms(1);
temp=P0; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2) // p1.1 被拉低
key=key+0;
else if(temp==4) // p1.2 被拉低
key=key+4;
else if(temp==8) // p1.3 被拉低
key=key+8;
else
key=16;
disbuf=dis[key];
}
void display(uchar dat)
{
uchar j;
wel[0]=dis[dat/10];
wel[1]=dis[dat%10];
for(j=0;j<2;j++)
{
P1=wel[j];//****数据口****
switch(j)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
}
delayms(1);
}
} |