请问下如何解决数码在加一的时候,数码管不灭,刚写程序,有什么好建议欢迎拍砖
#include<reg52.h>
#include < intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dis1=P2^0;
sbit dis2=P2^1;
sbit dis3=P2^2;
sbit dis4=P2^3;
sbit key1=P1^4;
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
uchar PWM;
void key();
void keyled();
void init();
sbit BEEP =P2^4 ; //蜂鸣器
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
void display(uchar disnum);
void delay5ms(uchar a);
void display_menu(uchar numdis);
uint num=1,num2=0;
uchar code number[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void main()
{
init();
while(1)
{
key();
}
}
void display(uchar disnum)
{
uchar aa,bb,cc,dd;
aa=disnum/1000;
bb=disnum%1000/100;
cc=disnum%100/10;
dd=disnum%10;
dis1=0;
P0=0x83;
delay5ms(5);
dis1=1;
dis2=0;
P0=number[bb];
delay5ms(5);
dis2=1;
dis3=0;
P0=number[cc];
delay5ms(5);
dis3=1;
dis4=0;
P0=number[dd];
delay5ms(5);
dis4=1;
}
void display_menu(uchar numdis)
{
uchar qin,bai,shi,ge;
qin=numdis/1000;
bai=numdis%1000/100;
shi=numdis%100/10;
ge=numdis%10;
dis1=0;
P0=0xa1;
delay5ms(10);
dis1=1;
dis2=0;
P0=number[bai];
delay5ms(10);
dis2=1;
dis3=0;
P0=number[shi];
delay5ms(10);
dis3=1;
dis4=0;
P0=number[ge];
delay5ms(10);
dis4=1;
}
void key()
{
if(!key1)
{
delay5ms(40);
if(!key1);
delay5ms(40);
keyled();
}
if(!key2)
{
delay5ms(50);
if(!key2)
delay5ms(50);
num++;
if(num==256)
{
num=1;
}
}
if(!key3)
{
delay5ms(50);
if(!key3)
delay5ms(50);
num--;
if(num==1)
{
num=1;
}
}
display_menu(num);
}
void keyled()
{
while(1)
{
if(!key2)
{
delay5ms(50);
if(!key2)
//delay5ms(50);
for(PWM=0x7f;PWM!=0xff;PWM++){delayms(10);}
num2++;
if(num2==100)
{
num2=0;
}
}
if(!key3)
{
delay5ms(50);
if(!key3)
//delay5ms(50);
for(PWM=0xff;PWM!=0x02;PWM--){delayms(10);}
num2--;
if(num2==0)
{
num2=100;
}
}
display(num2);
if(!key4)
{
delay5ms(50);
if(!key4)
return;
}
}
}
void init()
{
P3=0xff;
TMOD=0x21 ;
TH0=(65536-922)/256 ;//1ms延时常数
TL0=(65536-922)%256 ;//频率调节
TH1=PWM ; //脉宽调节
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
}
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=(65536-922)/256 ;
TL0=(65536-922)%256 ;
TH1=PWM ;
TR1=1 ;
P3=0x00 ; //启动输出
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P3=0xff ; //结束输出
}
/*********************************************************/
//蜂鸣器子程序
/*********************************************************/
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(250) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(250);
}
void delay5ms(uchar a)
{
uint b,c;
for(b=a;b>0;b--)
for(c=200;c>0;c--);
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120; i++) ;
}
} |