void main() { unsigned char key3_flag=0,key4_flag=0; TMOD |=0x01; TH0=0xd8; TL0=0xf0; ET0=1; TR0=0; TMOD |=0x10; TH1=0xF8; TL1=0xf0; ET1=1; TR1=1; EA =1; sec=0; ms=0; P1=0xff; i=0; j=0; start: while(1) { //¿ªÊ¼¡¢ÔÝÍ£ if(!key1) { delay(50); if(!key1) while(!key1) {;} TR0=!TR0; } //¼Ç¼ if(!key2) { delay(50); if(!key2) { while(!key2) //µÈ´ý°´¼üÊÍ·Å {;} if(i==8) {TR0=0; goto start;} Sec[i]= sec; Ms[i]= ms; i++; } } //ÉÏ· if(!key3) { delay(50); if(!key3) { while(!key3) {;} TR0=0; key3_flag=1; //°´¼ü3±êÖ¾ if(j==i) goto start; else if(key4_flag) j+=2; key4_flag=0; sec=Sec[j];ms=Ms[j]; j++; } } //Ï· if(!key4) { delay(50); if(!key4) { while(!key4) {;} TR0=0; key4_flag=1; if(j<0) goto start; else if(key3_flag) j-=2; key3_flag=0; sec=Sec[j];ms=Ms[j]; j--; } } if(!key5) { delay(50); if(!key5) while(!key5) {;} TR0=0; ms=0; sec=0; for(i=0;i<8;i++) { Sec[i]=0;Ms[i]=0; } i=0; }} void time1_isr(void) interrupt 3 using 0 { static unsigned char num; TH1=0xF8; TL1=0xf0; switch(num) { case 0: P2=0xfe;P0=tab[sec/10];break; case 1: P2=0xfd;P0=tab1[sec%10];break; case 2: P2=0xfb;P0=tab[ms/10];break; case 3: P2=0xf7;P0=tab[ms%10];break; default:break; } num++; if(num==4) num=0; }
时间: 2023-10-22 08:03:25 浏览: 77
无法解析的外部符号”private: char * __cdecl cv::String::allocate(unsigned __int64)” (?allocate@String@cv@@AEAA
这是代码的第二部分,其中定义了一个名为 `time1_isr` 的中断处理函数。
1. 首先定义了一个静态无符号字符型变量 `num`,用于记录当前显示的数码管位数。
2. 在中断处理函数中,首先设置了定时器1的高位和低位初值,分别是 `TH1=0xF8` 和 `TL1=0xf0`。
3. 使用一个 `switch-case` 结构根据变量 `num` 的值来选择要显示的数码管位数。
4. 当 `num` 的值为0时,设置 P2 端口的状态为 0xfe,表示选择第一个数码管,并将要显示的数值 `sec/10` 通过 `tab` 数组查找对应的显示值,并赋给 P0 端口。
5. 当 `num` 的值为1时,设置 P2 端口的状态为 0xfd,表示选择第二个数码管,并将要显示的数值 `sec%10` 通过 `tab1` 数组查找对应的显示值,并赋给 P0 端口。
6. 当 `num` 的值为2时,设置 P2 端口的状态为 0xfb,表示选择第三个数码管,并将要显示的数值 `ms/10` 通过 `tab` 数组查找对应的显示值,并赋给 P0 端口。
7. 当 `num` 的值为3时,设置 P2 端口的状态为 0xf7,表示选择第四个数码管,并将要显示的数值 `ms%10` 通过 `tab` 数组查找对应的显示值,并赋给 P0 端口。
8. `switch-case` 结构结束后,递增变量 `num`。
9. 如果 `num` 的值等于4,将其重置为0。
这个中断处理函数的作用是通过定时器1的中断来循环显示计时器的秒数和毫秒数在四个数码管上。
阅读全文