求助:三位数码管的输入和显示
各位大虾,帮我看看如何实现这个功能,我是初学者,肯请大家指教。另外我用的软件是keil。MCU是89s52,要实现的功能是:依次输入三个数,然后用三个数码管显示。第一个数显示在百位,第二个在十位,第三个在个位。在程序中我用了中断,端口定义:
P0:输出数
P2:显示位
P3.2:有键按下就中断
P1:4*4按键
目前我的程序只能实现一位输入,程序如下:
#include<reg52.h>
unsigned char code sendbuf[] = //段码
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
unsigned char code scan_bit[8] = //位码
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code key_code[] =
{
0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,
0xb7, 0x7e, 0x7d, 0x7b, 0x77
}; //键编码数组
unsigned char display[3]; //显示缓存
unsigned int count; //输入数,全局变量
void delayms(unsigned int ms) //延时程序
{
unsigned char k;
while(ms--)
for(k=0;k<124;k++);
}
void display_count() //显示程序
{
unsigned char temp,n;
temp=count;
for(n=0;n<=1;n++)
{
display[n]=temp%10; //从低位到高位把数存入缓存(从个位到十位)
temp=temp/10;
}
display[2]=temp; //百位数
/* for(n=2;n>0;n--)
{
if(display[n]==0)
display[n]=0x0a; //百位或十位如果为0,则不显示
else
break;
} */
for(n=0;n<3;n++) //输入数在数码管上显示
{
P0=sendbuf[display[n]];
P2=scan_bit[n];
delayms(1);
P2=0xff;
}
}
void main()
{
P0=0xff;
P1=0x00;
P2=0xff;
IT0=0;
EA=1;
EX0=1;
while(1)
{
display_count();
}
}
void keyscan()
{
unsigned char scan1, scan2, keycode, j;
P1 = 0xf0;
scan1 = P1;
if (scan1 != 0xf0)
//判键是否按下
{
delayms(10); //延时10ms
scan1 = P1;
if (scan1 != 0xf0)
//二次判键是否按下
{
P1 = 0x0f;
scan2 = P1;
keycode = scan1 | scan2; //组合成键扫描编码
for (j = 0; j < 16; j++)
{
if (keycode == key_code[j])
//查表得键值
{
count=j;
}
}
}
}
}
void INT0_ISR(void) interrupt 0
{
unsigned char x;
EX0=0;
keyscan();
for(x=0;x<30;x++)
{
display_count();
}
EX0=1;
IE0=0;
}