

我的学号后四位是4104对应 秒为41 毫秒为04
电路图如下:
代码如下:
#include <REGX51.H>
unsigned char seg []={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char ms,s,key_mod;
unsigned int cp,cp1;
sbit key_begin = P1^4;
sbit key_stop = P1^5;
sbit key_reset = P1^6;
sbit led = P1^3;
void time0_init(void){
TMOD =0x01; //计时器模式的控制寄存器,Time0工作在方式1
TL0 = (65536 - 5000)%256; // TL0预制,60536的低八位
TH0 = (65536 - 5000)/256; // TH0预制,60536的高八位
EA = 1; //打开开关总中断
ET0 = 1; //设置中断允许寄存器IE中ET0的 开启中断开关
TR0 = 1; //开始计数
}
//每次中断,都会不间断的实行这个中断服务程序
void time0_isr(void) interrupt 1{
TMOD = 0x01;
TL0 = (65536-2000)%256;
TH0 = (65536-2000)/256;
cp++;
//设置时间的范围,然后选择工作方式
if(cp >=250){
cp = 0 ;
//key_stop =0的时候让ms停止计数
if(key_mod!=2){
ms ++;
}
}
if(ms >= 99){
ms = 0;
s++;
}
if(s >= 99){
s =0;
}
//需要有一个程序进行不断的刷新
//刚开始定义key_mod的时候是没有赋值的,没有赋值默认为0
if(key_mod==0){
//需要给所有的表进行一个重置的操作
ms,s=0;cp=0;
cp1++;
switch(cp1){
//这个是控制灯管闪烁的
//毫秒有两位,秒有两位
//case 0 显示毫秒最后一位
case 1: P3 = 0x01; P2 = seg[ms%10]; break;
case 2: P3 = 0x02; P2 = seg[ms/10]; break;
case 3: P3 = 0x04; P2 = seg[s%10]; break;
case 4: P3 = 0x08; P2 = seg[s/10]; break;
}
if(cp1>=5){
cp1 = 0;
}
}
if(key_mod==1){
cp1++;
switch(cp1){
//应该加break语句
case 1: P3 = 0x01; P2 = seg[ms%10]; break;
case 2: P3 = 0x02; P2 = seg[ms/10]; break;
case 3: P3 = 0x04; P2 = seg[s%10]; break;
case 4: P3 = 0x08; P2 = seg[s/10]; break;
}
if(cp1>=5){
cp1 = 0;
}
if(ms==4&&s==41){
led = 1;
}else{
led = 0;
}
}
if(key_mod==2){
cp1++;
switch(cp1){
case 1: P3 = 0x01; P2 = seg[ms%10]; break;
case 2: P3 = 0x02; P2 = seg[ms/10]; break;
case 3: P3 = 0x04; P2 = seg[s%10]; break;
case 4: P3 = 0x08; P2 = seg[s/10]; break;
}
if(cp1>=5){
cp1 = 0;
}
}
if(key_mod==3){
ms=4; s= 41;
cp1++;
switch(cp1){
case 1: P3 = 0x01; P2 = seg[ms%10]; break;
case 2: P3 = 0x02; P2 = seg[ms/10]; break;
case 3: P3 = 0x04; P2 = seg[s%10]; break;
case 4: P3 = 0x08; P2 = seg[s/10]; break;
}
if(cp1>=5){
cp1 = 0;
}
}
}
void key(void){
//key_start =0 表示key_start按下去了
if(key_begin == 0){
key_mod = 1;
}
if(key_stop == 0){
key_mod = 2;
}
if(key_reset == 0){
key_mod = 3;
}
}
void main(void){
time0_init();
while(1)
key();
}