【Proteus仿真】Arduino UNO按键控制数码管闪烁增/减显示
【Proteus仿真】Arduino UNO按键控制数码管闪烁增/减显示
- Proteus仿真

仿真说明
- 导出Hex文件方法

导出的Hex文件在项目文件夹下 .
- 加载文件

- 加载带BootLoader字符的Hex文件

示例代码
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 125 126 127
| //按键控制数码管闪烁增/减显示 //说明:通过按键加/减数码管所显示的数字,调节过程中数码管闪烁显示 //确定后恢复正常显示,按下取消时将回复到调节之前的值
#define k1\_down() (digitalRead(14) == 0) //加 #define k2\_down() (digitalRead(15) == 0) //减 #define k3\_down() (digitalRead(16) == 0) //确定 #define k4\_down() (digitalRead(17) == 0) //取消
const uint8\_t CA_SEGCODE[] = //0~9共阳数码管段码表 {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; uint16\_t count = 2022; //显示初始值 uint16\_t temp; //临时变量,用于存储按取消键前的已确定的值 uint8\_t array[] = {0, 0, 0, 0}; //保存数位分解结果的数组 uint8\_t adjust = 0; //标识当前是否处理调节状态 uint8\_t pre_key = 0xff; //保存上次按键状态 uint8\_t i, j, t; //定义变量
void setup() { DDRD = 0XFF; PORTD = 0XFF; //数码管段码端口配置 DDRB = 0XFF; PORTB = 0XFF; //数码管位码端口配置 DDRC = 0X00; PORTC = 0XFF; //按钮输入端口端口设为内部上拉 }
void loop() { for (t = 0; t < 35; t++) //正常刷新显示 { INT\_TO\_4Digit(count); //数为分解 for (i = 0; i < 4; i++) //4位数码管扫描刷新显示 { PORTD = 0XFF; //先暂时关闭段 PORTB = 1 << i; //输出位码 PORTD = CA_SEGCODE[array[i]]; //发送段码 delay(2); //延时 } key\_handle(); //处理按键 } if (adjust) //如果处于调节状态,脱离了扫描刷新,数码管开始闪烁 { PORTD = 0XFF; //关闭所有数码管 for (t = 0; t < 15; t++) //在此循环中保持按键响应 { delay(10); //延时 key\_handle(); //处理按键 } } }
//数位分解函数 //使用循环减法分解的速度优于使用/与%分解 void INT\_TO\_4Digit(uint16\_t n) { array[0] = 0; while (n >= 1000) { array[0]++; n -= 1000; } array[1] = 0; while (n >= 100) { array[1]++; n -= 100; } array[2] = 0; while (n >= 10) { array[2]++; n -= 10; } array[3] = n; }
void key\_handle() //按键处理函数 { if (pre_key == PINC) return; //按键状态未改变时退出 pre_key = PINC; //保存当前新的按键状态 //增按键 if (k1\_down()) //按键1按下 { delay(10); if (k1\_down()) { if (temp == 0) temp = count; //备份temp,以便按下取消时还原 count++; //递增 adjust = 1; //进入调节状态 } } //减按键 else if (k2\_down()) { delay(10); if (k2\_down()) { if (temp == 0) temp = count; count--; //递减 adjust = 1; } } //确定按键 else if (k3\_down()) { delay(10); if (k3\_down()) { adjust = 0; temp = 0; } } //取消按键 else if (k4\_down()) { delay(10); if (k4\_down()) { if (temp) { count = temp; //还原count } temp = 0; //temp清零 adjust = 0; } } }
|
仿真资源和程序源码
本示例基于Proteus8.12平台。
1 2 3
| 链接:https://pan.baidu.com/s/1mQB5-MK1b\_Dj1WiL7YB93Q 提取码:yh59
|
| 时间,从不曾给予我们毫无顾忌的任性,生活,也从不曾带给我们满是绝望的恐惧,回忆,更是从不曾留给我们颓废茫然的理由。 |
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!