制作一个两位的LED数码显示的计时表,最小计时单位“秒”,显示时间的范围为00~99s,每秒自动加1,另设置一个“开始”键和一个“复位”键。如“开始”按键放下,时钟开始走时,LED数码管显示两位的秒时间;如“复位”按键按下,LED数码管清零显示“00”‘通过对键盘的扫描计时表的走时/停止进行控制,采用定时器T0作为计时器,每10ms发生一次中断,每一百次中断为1s。在此期间,如“开始”按键按下,程序方将TR0置为1,从而开启中断,时钟开始走时;如“复位”按键按下,程序将TR0置为0,同时将存储时间的变量清零,从而中断停止,并实现复位。
//-----------------------------------------------------------------
//
//
//-----------------------------------------------------------------
#include <reg51.h>
#include <absacc.h>
#define INT8U unsigned char
#define INT16U unsigned int
INT8U temp,aa,shi,ge;
INT8U dsp[]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //不带小数点的0-9的数码管显示
sbit din=P3^0;
sbit clk=P3^2;
sbit cs=P3^1;
sbit key1=P1^0;
sbit key3=P1^1;
void init();
//-----------------------------------------------------------------
// 延时子程序
//-----------------------------------------------------------------
void delay_ms(INT16U ms)
{
INT8U t;
while(ms--) for(t = 0; t < 120; t++);
}
void write(char addr,char dat)
{
char i,j;
cs=0;
clk=0;
for(i=0;i<8;i++) //写地址
{
//temp=addr;
if(addr&0x80) din=1;
else din=0;
clk=1;
for(j=0;j<5;j++);
clk=0;
addr<<=1;
}
for(i=0;i<8;i++)//写数据
{
//temp=dat;
if(dat&0x80) din=1;
else din=0;
clk=1;
for(j=0;j<5;j++);
clk=0;
dat<<=1;
}
cs=1;
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
init();
cs=1;
clk=1;
din=1;
write(0x09,0x00);//译码选择,非BCD码
write(0x0a,0x07);//亮度调节
write(0x0b,0x07);//显示位数
write(0x0c,0x01);//正常工作状态
while(1)
{
if(key1==0)
{
delay_ms(5);
if(key1==0)
{
while(!key1);
TR0=1;
}
}
if(key3==0)
{
delay_ms(5);
if(key3==0)
{
while(!key3);
temp=0;
shi=0;
ge=0;
TR0=0;
}
}
write(0x06,dsp[ge]);
write(0x05,dsp[shi]);
}
}
void init()
{
temp=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
aa++;
if(aa==100)
{
aa=0;
temp++;
if(temp==100)
{
temp=0;
}
shi=temp%100/10;
ge=temp%10;
}
}
我的是两位数码管,程序应该哪里改一下吧?