用51单片机完成数字输入显示器,通过矩阵键盘完成数值的输入,如果输入溢出可报错
#include
#define uchar unsigned char
uchar num ;
uchar xianshi=20;
sbit S3=P3^1;//独立键盘s3
sbit we=P2^7;//位选
sbit du=P2^6;//段选
sbit S2=P3^0;//独立键盘s2
sbit beep=P2^3;
//共阴极数码管段选表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71,0x76,0x38,0x37,0x3e,0x40,0x00};
//共阴极数码管位选表
uchar code place[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0};
//delay 函数的定义
void delay(unsigned int z)
{ unsigned int x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
void keyscan()
{
P3=0xf0;//列扫描
if(P3!=0xf0)
{ delay(20);
if(P3!=0xfe)
{ switch(P3)
{ case 0xe0: xianshi=0; break; //第一列
case 0xd0: xianshi=1; break;//二
case 0xb0: xianshi=2; break;//三
case 0x70: xianshi=3; break;//四
}
P3=0x0f;//行扫描
switch(P3)
{ case 0x0e: xianshi=xianshi; break; //第一行
case 0x0d: xianshi=xianshi+4; break;
case 0x0b: xianshi=xianshi+8; break;
case 0x07: xianshi=xianshi+12; break;
}
while(P3!=0X0F);//松手检测
}
}
}
void main()
{ while(1)
{ keyscan();
if(S2==0)
{ delay(30);//按键防抖
num++;
if(num>8)
{num=0;
beep=~beep;
}
while(!S2);//松手检测
}
if(S3==0)
{ delay(30);//按键防抖
if(num>0)
num--;
while(!S3);//松手检测
}
we=1;
P0=place[num];
we=0;
delay(10);
du=1;
P0=table[xianshi];
du=0;
}
}
delay(10);
du=1;
P0=table[xianshi];
du=0;
把这一段删去后,位选可正常选择,加上后,数码屏就是黑的,但不报错
什么屏