任务代码解析
用到的子函数
Delay函数
给它一个值,它为你延时那么多毫秒,delay函数的优缺点在之前LED与数码管的笔记中有提,这里不再赘述
要注意的因为用到了_nop_要加上#include<INTRINS.H>
Locate函数和Num函数
Locate改成select好像更合适一点。
功能正如其名,定位与数字,这两个函数实现了第几位数码管、显示几与位选、段码之间的转换
至于为什么不合二为一,单纯打完了懒得改
Timer0Routine
我暂且将其称为中断函数,即每次中断所执行的代码都在这个子函数里面
值得一提的是,除非你在这个函数里控制数码管的显示,在此次任务里我认为这样做很麻烦,否则就要利用全局变量来正确地实现定时器的功能。
其他要点
1.在while循环内,定义完变量,声明完定时器后,利用switch(mode)来进行模式的切换
2.final变量的使用。在除模式4之外的模式中,都将final赋值为0,而在模式4中不进行赋值只做final++,我认为比较简单地实现了对是否第一次按下P3_3的检验
可进一步完善点
1.定位与显示函数的结合
2.按下按键时保持常亮
…
代码
#include <REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int xms){
unsigned char data i;
while(xms--){
_nop_();
i = 2;
while (--i);
};
}
void Num(unsigned int number){
switch (number){
case 0:P0=0x3f;break;
case 1:P0=0x06;break;
case 2:P0=0x5b;break;
case 3:P0=0x4f;break;
case 4:P0=0x66;break;
case 5:P0=0x6d;break;
case 6:P0=0x7d;break;
case 7:P0=0x07;break;
case 8:P0=0x7f;break;
case 9:P0=0x6f;break;
}
}
void Locate(unsigned char location){
switch(location){
case 1:P2_4=1;P2_3=1;P2_2=1; break;
case 2:P2_4=1;P2_3=1;P2_2=0; break;
case 3:P2_4=1;P2_3=0;P2_2=1; break;
case 4:P2_4=1;P2_3=0;P2_2=0; break;
case 5:P2_4=0;P2_3=1;P2_2=1; break;
case 6:P2_4=0;P2_3=1;P2_2=0; break;
case 7:P2_4=0;P2_3=0;P2_2=1; break;
case 8:P2_4=0;P2_3=0;P2_2=0; break;
}
}
void Timer0Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x9C;
TH0 = 0xFF;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
PT0=0;
}
unsigned int count=0;
unsigned int CNT=0;
int number = 0;
int turn = 0;
void main(){
unsigned int mode = 0;
unsigned int final = 0;
Timer0Init();
while(1){
if(P3_1==0){
Delay(10);
while(P3_1==0);
Delay(10);
mode = 1;
}
if(P3_0==0){
Delay(10);
while(P3_0==0);
Delay(10);
mode = 2;
}
if(P3_2==0){
Delay(10);
while(P3_2==0);
Delay(10);
mode = 3;}
if(P3_3==0){
Delay(10);
while(P3_3==0);
Delay(10);
mode = 4;}
switch(mode){
case 1:
final=0;
Locate(1);P0=0x3e;Delay(2);P0=0x00;//Num(0);
Locate(2);Num(1);Delay(2);P0=0x00;
Locate(7);Num(0);Delay(2);P0=0x00;
Locate(8);Num(1);Delay(2);P0=0x00;
break;
case 2:
final=0;
Locate(1);P0=0x3e;Delay(2);P0=0x00;
Locate(2);Num(2);Delay(2);P0=0x00;
if(number<=9){
Locate(7);Num(0);Delay(2);P0=0;
Locate(8);Num(number);Delay(2);P0=0;
}
if(number==10){
Locate(7);Num(1);Delay(2);P0=0;
Locate(8);Num(0);Delay(2);P0=0;
}
break;
case 3:
final=0;
Locate(1);P0=0x3e;Delay(2);P0=0;//Num(0);
Locate(2);Num(3);Delay(2);P0=0;
Locate(7);Num(0);Delay(2);P0=0;
Locate(8);Num(3);Delay(2);P0=0;
if(turn == 1){
Locate(5);P0=0x40;Delay(2);P0=0;
Locate(6);P0=0x40;Delay(2);P0=0;
}
if(turn == 0){
Locate(5);P0=0;Delay(2);P0=0;
Locate(6);P0=0;Delay(2);P0=0;
}
break;
case 4:
Locate(1);P0=0x3e;Delay(2);P0=0;
Locate(2);Num(4);Delay(2);P0=0;
if(final==10){
final=0;
Locate(7);Num(final);Delay(2);P0=0;
Locate(8);Num(final);Delay(2);P0=0;
}
if(final<10){
Locate(7);Num(final);Delay(2);P0=0;
Locate(8);Num(final);Delay(2);P0=0;
}
if(P3_3==0){
Delay(10);
while(P3_3==0)
Delay(10);
final++;
}
break;
}
}
}
void Timer0Routine() interrupt 1
{
TL0 = 0x9C;
TH0 = 0xFF;
count++;
CNT++;
if(count>=10000){
count = 0;
if(number==10){
number=-1;}
number++;
}
if(CNT==5000){
if(turn==0)
turn=1;
else
turn=0;
CNT=0;
}
}