生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
程序部分由主程序、T0中断程序、扫描显示子程序、计时加(减)1秒的子程序、暂停子程序、快表和回表子程序、延时子程序等组成。 3.2.1延时模块设计
void delay(int t) 调用该子程序能实现延时功能 { 通过参数t,可以调成延时时间 while(t--) {
unsigned int i; 设置变量i的变化范围,能调整延时的单位时间 for(i=0;i<200;i++); 长度,i越小,延时的单位时间越短,精度越高 } }
3.2.2 数码管动态刷新显示程序
void display(int i,int j,int x,int y) 变量i,j,x,y分别为分,秒,A分数,B分数 {
if(jie==1&&bujin!=2) 当中间变量jie==1时,为上半场,此时对P1赋值
P1=0xbf; 使P1=0xbf, 即P1=1011 1111B,上半场指示灯对应点亮
P2=0xfe;
数码管动态刷新显示程序 P2=1111 1110, i为分钟
P0=seg[i0/10]; P2=0xfe,所以刷新显示时间的分钟十位,调用延时程序, delay(1); 延时数码管的点亮 P2=0xff; P0=0;
P2=0xfd; 同理,动态刷新时分钟个位并延时点亮 P0=seg[i]; delay(1); P2=0xff; P0=0;
12
P2=0xfb; 同理,动态刷新时秒钟十位并延时点亮 P0=seg[j0/10]; delay(1); P0=0; P2=0xff;
P2=0xf7; P0=seg[j]; delay(1); P0=0; P2=0xff;
P2=0xef;
P0=seg[x0/10]; delay(1); P2=0xff; P0=0;
P2=0xdf; P0=seg[x]; delay(1); P2=0xff; P0=0;
P2=0xbf;
P0=seg[y0/10];
delay(1); P0=0; P2=0xff;
同理,动态刷新时秒钟个位并延时点亮 同理,动态刷新A分数十位并延时点亮
同理,动态刷新A分数个位并延时点亮 同理,动态刷新B分数十位并延时点亮 13
P2=0x7f; 同理,动态刷新B分数十位并延时点亮
P0=seg[y]; delay(1); P0=0; P2=0xff; }
本设计中各个数码管采用动态驱动,使各位数码管逐个轮流受控显示,由于扫描速度极快(本实验中大约每20毫秒刷新一次),所以显示效果与静态驱动相同。
3.2.3 T0中断程序
void t0(void) interrupt 1 {
TH0=0xb1; 对定时器T0送入计数初值,由于TH0=0xb; TL0=0x10; TL0=0x10 故定时器定时为20毫秒,即每 if(n==0)
20毫秒调用一次void t0(void) interrupt 1
本设计调用定时器T0,计时单位为一秒
{ n=60;
m--; } i++; if(i==50)
{ 令i值为50 50*20毫秒=1秒,来实现计时 n--; 单位为一秒 i=0; }
display(m,n-1,x,y); 调用动态刷新显示程序,即每20毫秒刷新一 } 次数码管
14
3.2.4 加分子程序 void keyjiafen1()
{ 当检测到RXD按键按下时,调用延时子程序 if(RXD==0) 实现消除按键抖动功能,即,当 delay(1);,
{ 检测到按键按下时候,延时,按键仍按下,说明 if(RXD==0) { while(RXD==0); x++;
}
}
if(TXD==0) {
delay(1); if(TXD==0) {
while(TXD==0); y++;
}
} }
3.2.5减分子程序 void keyjianfen1()
{ if(WR==0) {
按键确实按下,非抖动,A对应加分 检测TXD加分按键时候按下,B加分
减分按键检测子程序,其基本算法及功能与加分
相同 15