【Proteus仿真】Arduino UNO+按键控制2位数码管倒计时
【Proteus仿真】Arduino UNO+按键控制2位数码管倒计时
- Proteus仿真

数字引脚基本上都用完了。
程序源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| /\* \* 按键控制2位数码管倒计时 \* Created: 周六 6月 25 2022 \* Processor: Arduino Uno \* Compiler: Arduino AVR \*/ int num=60; //定义倒计时数字 int count=0; //定义计数值 int start_key = 10; //开始按键 int pause_key = 11; //暂停按键 int reset_key = 12; //复位按键 //0-9对应的16进制数据 const uint8\_t CA_SEGCODE[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //用数组指定2位8段数码管所连接的段引脚(或称段码引脚) const uint8\_t ledPins_SEG[] = { 0,1,2, 3, 4, 5, 6, 7 }; //用数组指定2位8段数码管的位引脚(或称位码引脚) const uint8\_t ledPins_DIG[] = {8,9}; //待显示到数码管的2个数字 const uint8\_t DATEx[] = {(uint8\_t)num/10,(uint8\_t)num%10};
int start_flag=0; //是否开启倒计时标志位 int reset_flag=0; //复位倒计时数标志位 //----------------------------------------------------------------- // 初始配置 //----------------------------------------------------------------- uint8\_t i; void setup() {
for(i=0;i<10;i++) //设置各引脚模式 pinMode(ledPins_SEG[i],OUTPUT); for(i=0;i<2;i++) pinMode(ledPins_DIG[i],OUTPUT); for(i=10;i<13;i++) { pinMode(i,INPUT_PULLUP); } } //----------------------------------------------------------------- // 主循环 //----------------------------------------------------------------- void loop() { const uint8\_t DATEx[] = {num/10,num%10}; //待显示的两位数字 for (i = 0; i < 3; i++) //循环扫描数码管 { DIG\_OUTPUT(i); //操作位码 SEG\_OUTPUT(CA_SEGCODE[DATEx[i]]); //操作段码 delay(1); count++; //每延时1ms,count+1 key\_scan(); //按键扫描子函数 if(start_flag==1 && count>300) //当开启了倒计时,每300ms倒计时-1(本来是1000ms,这里为了演示效果调到了300) { num--; //倒计时数-1 count=0; //计数归零 } if(reset_flag==1) //当复位标志位为1 { num=60; //倒计时数设置为60 reset_flag=0; //复位标志位归0 start_flag=0; //开始倒计时标志位归0 } if(num<0) //当倒计时完毕,倒计时数重新设置为60 num=60; } } //----------------------------------------------------------------- // 段码输出函数 //----------------------------------------------------------------- void SEG\_OUTPUT(uint8\_t x) { for (uint8\_t j = 0; j < 8; j++) { //发送段码 if((x>>j & 0x01) != 0x00) digitalWrite(ledPins_SEG[j],HIGH); else digitalWrite(ledPins_SEG[j],LOW); } } //----------------------------------------------------------------- // 位码输出函数 //----------------------------------------------------------------- void DIG\_OUTPUT(uint8\_t dx) { for (uint8\_t j = 0; j < 2; j++) { //发送位码(2位) if(dx != j) digitalWrite(ledPins_DIG[j],LOW); else digitalWrite(ledPins_DIG[j],HIGH); } } void key\_scan() //按键扫描子函数 { if(digitalRead(start_key)==LOW) //当启动倒计时按键按下 { delay(10); //消抖延时 if(digitalRead(start_key)==LOW) start_flag=1; //开始倒计时标志位置位1。以下操作暂停按键、复位按键原理类似 } if(digitalRead(pause_key)==LOW) { delay(10); if(digitalRead(pause_key)==LOW) start_flag=0; } if(digitalRead(reset_key)==LOW) { delay(10); if(digitalRead(reset_key)==LOW) reset_flag=1; } }
|
程序源码和仿真资源
本实验基于Proteus8.12平台。
1 2 3
| 链接:https://pan.baidu.com/s/1\_2EPGTZX11GYSqmRAkF5Ew 提取码:thy3
|
| 黑发不知勤学早,白首方悔读书迟。–颜真卿《劝学诗》 |
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!