|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
学习了各位网友的建议,对上一个程序做了改进,解决了按键加一实际加多个一的问题,
修改后的代如下:
#include <reg52.h> //头文件
typedef unsigned char uchar; //类型定义
typedef unsigned int uint;
sbit led_a=P1^0; //数码管个位
sbit led_b=P1^1; //十位
sbit led_c=P1^2; //百位
sbit led_d=P1^3; //千位
sbit led5=P1^4; //以下4个LED
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
sbit key4=P3^7; //声明一个按键,用于调时
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
uint time=0; // 秒钟
uint fen=0; // 分钟
uint shi=0; // 时钟
uint xms; //延时ms
uchar dingshi=0; //定时次数
bit time0_flag=0; //定时到1秒的标志位
/*采用了多个子函数,使程序看起来容易一点
void display(time); //声明显示子函数
void delay(xms); //声明延时子函数
void time0init(); //声明定时器子函数
void key_scan(); //声明按键子函数
void jishi(); //声明计时子函数,计时到1秒就执行
void main () //主函数
{
time0init(); //调用定时器初始化函数
while(1)
{
if(time0_flag==1) //如果计时到了就执行以下程序,没有就接着显示
{
time0_flag=0; //
jishi(); //计时子函数
}
key_scan(); //检测是否有按键
display(time); //调用显示函数
}
}
void display(time) //显示函数
{
P0=table[fen%10]; //送出段选信号
led_a=0; //打开个位位选
delay(5);
led_a=1;
P0=table[fen/10%10]; //送出段选信号
led_b=0; //打开十位位选
delay(5);
led_b=1;
P0=table[shi%10];
led_c=0;
delay(5);
led_c=1;
P0=table[shi/10%10];
led_d=0;
delay(5);
led_d=1;
P0=table[10]; //显示中间的点
led_c=0;
delay(5);
led_c=1;
}
void delay(xms) //延时函数
{
uchar i;
while(xms--)
{
for(i=0;i<113;i++);
}
}
void key_scan() //按键函数
{
if(key4==0)
{
delay(5);
if(key4==0)
{
shi+=1; //按一下key4时钟加1
if(shi>=24)
{
shi=shi-24;
}
while(key4==0); //按键松开才往下执行
}
}
}
void time0init() //定时器初始化函数
{
EA=1; //开总中断
ET0=1; //开定时器0
TR0=1; //定时器0开始
TMOD=0X01; // 定时器模式1
TH0=(65536-50000)/256; //50ms初值高8位
TL0=(65536-50000)%256; //50ms初值低8位
EX1=1; //开外部中断1
IT1=0; //低电平有效
}
void jishu ()interrupt 1 //定时器中断函数
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
if(dingshi==20) //如果定时满了20次
{
dingshi=0; //次数清零,循环
time0_flag=1; //1秒标志位
}
dingshi++; //如果定时没满20次,就加一次
}
void jishi() //计时子函数,定时次数到了就执行
{
time++; //秒加一次
if(time==60)
{
time=0;
fen++; //到了60秒,分加一次
if(fen==60)
{
fen=0;
shi++; ////到了60分,时加一次
if(shi==24)
{
shi=0;
}
}
}
led5=~led5; //亮一秒灭一秒
led6=~led6;
led7=~led7;
led8=~led8;
}
void key_int()interrupt 2 //外部中断1
{
delay(300); //如果不延时,按一下按钮可能加了好几个5
fen+=5; //加5分,可以理解为fen=fen+5
if(fen>=60)
{
fen=fen-60;
}
}
|
|