请教大神,我的程序有不对的😭,用的两位共阴极数码管。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定义"启动"按钮
sbit key2=P3^1; //定义"停止"按钮
sbit key3=P3^2; //定义"复位"按钮
uchar temp,aa,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共阴极数码管编码
void display(uchar shi,uchar ge); //声明显示子函数
void delay(uint z); //声明延时子函数
void init(); //声明初始化函数
void main()
{
init(); //调用初始化子程序
while(1)
{
if(key1==0) //检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此while语句处
TR0=1; //启动定时器开始工作
}
}
if(key2==0) //检测"停止"按钮是否按下
{
delay(10); //延时去抖动
if(key2==0) //再次检测"停止"按钮是否按下
{
while(!key2); //松手检测,若按键没有释放,key2始终为0,那么!key2始终为1,程序就一直停在此while语句处
TR0=0; //关闭定时器
}
}
if(key3==0) //检测"复位"按钮是否按下
{
delay(10); //延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测,若按键没有释放,key3始终为0,那么!key3始终为1,程序就一直停在此while语句处
temp=0; //将变量temp的值清零
shi=0; //将十位清零
ge=0; //将个位清零
TR0=0; //关闭定时器
}
}
display(shi,ge); //调用显示子函数
}
}
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void display(uchar shi,uchar ge) //显示子程序
{
P2=0xbf; //P2口10111111对应P2.0-P2.7的电平
P0=table[shi]; //P0口对应赋值为table[shi]这个数组中第shi+1个元素的值
delay(10);
P2=0x7f; //P2口01111111对应p2.0-p2.7的电平
P0=table[ge];//P0口对应赋值为table[ge]这个数组中第ge+1个元素的值
delay(10); //使用动态扫描的方法实现数码管显示
}
void init() //初始化子程序
{
temp=0; //将0赋值给temp
TMOD=0x01; //使用定时器T0的方式1
TH0=(65536-50000)/256; //设置初值
TL0=(65536-50000)%256; //定时50ms中断一次
EA=1; //中断总允许
ET0=1; //允许定时器T0中断
}
void timer0() interrupt 1 //定时器中断0
{
TH0=(65536-50000)/256;//重新赋初值
TL0=(65536-50000)%256;
aa++; //中断一次变量aa的值加1
if(aa==20) //中断20次后,定时时间为20*50ms=1000ms=1s,//将变量temp的值加1
{
aa=0;
temp++;
if(temp==60) //秒表到达60s后回零
{
temp=0; //将0赋值给temp
}
shi=temp%100/10;
ge=temp%10; //分离个位和十位
}
}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定义"启动"按钮
sbit key2=P3^1; //定义"停止"按钮
sbit key3=P3^2; //定义"复位"按钮
uchar temp,aa,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共阴极数码管编码
void display(uchar shi,uchar ge); //声明显示子函数
void delay(uint z); //声明延时子函数
void init(); //声明初始化函数
void main()
{
init(); //调用初始化子程序
while(1)
{
if(key1==0) //检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此while语句处
TR0=1; //启动定时器开始工作
}
}
if(key2==0) //检测"停止"按钮是否按下
{
delay(10); //延时去抖动
if(key2==0) //再次检测"停止"按钮是否按下
{
while(!key2); //松手检测,若按键没有释放,key2始终为0,那么!key2始终为1,程序就一直停在此while语句处
TR0=0; //关闭定时器
}
}
if(key3==0) //检测"复位"按钮是否按下
{
delay(10); //延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测,若按键没有释放,key3始终为0,那么!key3始终为1,程序就一直停在此while语句处
temp=0; //将变量temp的值清零
shi=0; //将十位清零
ge=0; //将个位清零
TR0=0; //关闭定时器
}
}
display(shi,ge); //调用显示子函数
}
}
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void display(uchar shi,uchar ge) //显示子程序
{
P2=0xbf; //P2口10111111对应P2.0-P2.7的电平
P0=table[shi]; //P0口对应赋值为table[shi]这个数组中第shi+1个元素的值
delay(10);
P2=0x7f; //P2口01111111对应p2.0-p2.7的电平
P0=table[ge];//P0口对应赋值为table[ge]这个数组中第ge+1个元素的值
delay(10); //使用动态扫描的方法实现数码管显示
}
void init() //初始化子程序
{
temp=0; //将0赋值给temp
TMOD=0x01; //使用定时器T0的方式1
TH0=(65536-50000)/256; //设置初值
TL0=(65536-50000)%256; //定时50ms中断一次
EA=1; //中断总允许
ET0=1; //允许定时器T0中断
}
void timer0() interrupt 1 //定时器中断0
{
TH0=(65536-50000)/256;//重新赋初值
TL0=(65536-50000)%256;
aa++; //中断一次变量aa的值加1
if(aa==20) //中断20次后,定时时间为20*50ms=1000ms=1s,//将变量temp的值加1
{
aa=0;
temp++;
if(temp==60) //秒表到达60s后回零
{
temp=0; //将0赋值给temp
}
shi=temp%100/10;
ge=temp%10; //分离个位和十位
}
}