课堂作业三
//contributed by LiuYH #include <reg52.h> unsigned char DispBuf[8]; sbit SS = P2^6; sbit CS = P2^7; sbit LED1 = P1^0; sbit BUZZER = P2^3; sbit KEY1 = P3^4; sbit KEY2 = P3^5; sbit KEY3 = P3^6; code unsigned char Tab[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 }; int sec_right = 0; bit timer_start_flag = 1; bit flag_alarm = 0; int cnt = 10; void T1INTSVC() interrupt 3 { code unsigned char com[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; static unsigned char n = 0; static unsigned int counter_01ms = 0; static unsigned int counter_alarm = 0; TR1 = 0; TH1 = 0xFC; TL1 = 0x66; TR1 = 1; P0 = 0xFF; CS = 1; CS = 0; P0 = DispBuf[n]; SS = 1; SS = 0; P0 = ~com[n]; CS = 1; CS = 0; n++; n &= 0x07; if (timer_start_flag) { counter_01ms ++; if (counter_01ms == 10) { counter_01ms = 0; sec_right ++; if(sec_right == 2000) sec_right = 0; DispBuf[0] = Tab[sec_right %10]; DispBuf[1] = Tab[sec_right /10 %10]; DispBuf[2] = Tab[sec_right / 100 % 10] | 0x80; DispBuf[3] = Tab[sec_right / 1000]; if (sec_right >= cnt*100) { if (counter_alarm <=9) { flag_alarm = 1; counter_alarm ++; } else if (counter_alarm == 39 ) { flag_alarm = 0; counter_alarm =0; } else { flag_alarm = 0; counter_alarm ++; } } if (flag_alarm) { LED1 = 0; BUZZER = 0; } else { LED1 = 1; BUZZER = 1; } } } else { LED1 = 1; BUZZER = 1; } } void DispClear() { unsigned char i; for (i=0; i<8; i++) { DispBuf[i] = 0x00; } } void Delayms(unsigned int t) { unsigned int us_ct; for (;t > 0;t --) for (us_ct = 113;us_ct > 0;us_ct --); } unsigned char KeyScan() { unsigned char k = '\0'; if ( KEY1 == 0 ) k = '+'; if ( KEY2 == 0 ) k = '-'; if ( KEY3 == 0 ) k = '~'; return k; } void SysInit() { DispClear(); TMOD = 0x11; EA = 0; TH1 = 0xFC; TL1 = 0x66; ET1 = 1; EA = 1; TR1 = 1; } void main() { unsigned char k; //定义键值变量 SysInit(); //系统初始化 // DispBuf[7] = Tab[1]; //在8位数码管上显示“12345678”字样 // DispBuf[6] = Tab[2]; // DispBuf[5] = Tab[3]; // DispBuf[4] = Tab[4]; // DispBuf[3] = Tab[5]; // DispBuf[2] = Tab[6]; // DispBuf[1] = Tab[7]; // DispBuf[0] = Tab[8]; // Delayms(2000); //保留2s DispClear(); //清除显示(数码管上的显示内容全部熄灭 DispBuf[7] = Tab[cnt / 10]; DispBuf[6] = Tab[cnt % 10]; while(1) { Delayms(20); //扫描延时20ms,也做按键后延消抖 k = KeyScan(); //扫描按键 if ( k != '\0') //首次检测到按键按下 { Delayms(20); //延时20ms,按键前沿消抖 k = KeyScan(); //再次读取按键状态 while( KeyScan() != '\0'); //等待松开按键 if ( k != '\0') //确认按键按下后处理按键 { if ( k == '+') { if ( cnt < 12 ) cnt++; } if ( k == '-') { if ( cnt > 8 ) cnt--; } if ( k == '~' ) { timer_start_flag = ~timer_start_flag; } DispBuf[7] = Tab[cnt / 10]; DispBuf[6] = Tab[cnt % 10]; } } } }
Work Hard
But do not forget to enjoy life😀
本文来自博客园,作者:YuhangLiuCE,转载请注明原文链接:https://www.cnblogs.com/YuhangLiuCE/p/17724373.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通