,因为定时和循环显示都在中断函数里面完成了,主雀樱函数只是起了一个绝孝初始化的作用,led++影响LED_CODE[led]的值,它使LED_CODE[10] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }数组中的10个值依次赋给P2,依次显示0——9的数字,即当led = 0时,P2接受0xC0,对应数码显示0,当led = 1时,P2接受LED_CODE[1]=0xF9,对应显示1,依次类推,从而顷宏丛显示0——9。
#include <reg51.h>unsigned int num,a
sbit key0=P1^0
sbit key1=P1^1
sbit key2=P1^2
sbit key3=P1^3
bit flag
unsigned char code led_code[20] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
void delay(unsigned char i)
{
unsigned char j
for(i>0i--) for(j=110j>启蔽氏0j--)
}
void keyscan()
{
/*实现加法功能*/
if(key0==0) {
delay(7)
if(key0==0) {
num++
if(num==10) num=0
while(key0==0)
}
}
/*实现减法功能*/
if(key1==0) {
delay(7)
if(key1==0) {
num--
if(num==-1) num=9
while(key1==0)
}
}
/*实现清零功能*/
if(key2==0) {
delay(7)
if(key2==0) {
num=0
while(key2==0)
}
}
/*实现定时器1方式1定并宽时1S使得数码悄散管加1显示功能*/
if(key3==0) {
delay(7)
if(key3==0) {
flag = ~flag
while(key3==0)
}
}
}
void T1_ini()
{
TMOD=0X10
TH1=(65536-50000)/256
TL1=(65536-50000)%256
EA=1
ET1=1
TR1=1
}
void timer1() interrupt 3
{
a++
TH1=(65536-50000)/256
TL1=(65536-50000)%256
}
void display()
{
P3=led_code[num]
}
void main()
{
T1_ini()
while(1)
{
keyscan()
display()
if(a >= 20 &&flag) {
a = 0
num++
if(num==10) num=0
}
}
}
试试看。
可以这样实现:定义一个消隐段码信洞(现在你已经实现了数字0~9的段码),该段码使数码管所有段(即LED)全部熄灭,定义在段码表LED_code[10]位置(LED_code[9]对应数字9);
之后你可樱历以在点亮数码管之前取段脊坦搜码的程序中增加前导0的判断(很简单,请自己思考怎么实现),若判断是前导0,则P0=~LED_code[10](取代楼主之前的P0=~LED_code[led_num[i]],此时led_num[i]=0)。
OK!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)