用c写一个 参考课本 P80 实例 3.6 两位数码管定时计数。 使用 msp430f249 芯片的普 通 I O 口功能, 3 个按键分别为设定、 暂停、 清零。 控制 2 位数码管实现从 80开始倒计时。 按下设定, 出现自己学号后 2 位 +60 默认值, 并开 始倒计时, 约 1s 减少 1 , 按下暂停键停止倒计时, 松开暂停键继续。 按下清理 清除时间, 恢复 00
时间: 2023-05-31 09:03:57 浏览: 83
嵌入式系统/ARM技术中的P80C592芯片在基于CAN总线显示通信模块中应用
以下是一个基于msp430f249芯片的参考代码,实现了上述功能:
```c
#include <msp430.h>
#define DIGIT_1 P1OUT
#define DIGIT_2 P1OUT
#define SEGMENTS P2OUT
#define BUTTON_SET P2IN & 0x01
#define BUTTON_PAUSE P2IN & 0x02
#define BUTTON_CLEAR P2IN & 0x04
unsigned char digit[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};
unsigned int count = 0;
unsigned char pause = 0;
unsigned char clear = 0;
unsigned int time = 0;
void delay(unsigned int n) {
while (n--) {
__delay_cycles(1000);
}
}
void display(unsigned int n) {
DIGIT_1 = 0x01; // 选择第一个数码管
SEGMENTS = digit[n / 10]; // 显示十位数
delay(1);
DIGIT_1 = 0x00; // 关闭第一个数码管
DIGIT_2 = 0x02; // 选择第二个数码管
SEGMENTS = digit[n % 10]; // 显示个位数
delay(1);
DIGIT_2 = 0x00; // 关闭第二个数码管
}
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR |= 0x03; // P1.0 和 P1.1 作为数码管的控制引脚
P2DIR |= 0x7F; // P2.0 - P2.6 作为数码管的片选和段选引脚
P2REN |= 0x07; // P2.0 - P2.2 作为按键输入引脚,启用上拉电阻
P2OUT |= 0x07; // P2.0 - P2.2 上拉电阻连接 VCC
while (1) {
if (BUTTON_SET == 0) { // 按下设定键
clear = 0;
display(24); // 显示学号后两位
delay(500);
display(60); // 默认倒计时值为60
delay(500);
while (BUTTON_SET == 0) { // 等待设定键释放
if (BUTTON_CLEAR == 0) { // 按下清零键
clear = 1;
time = 0;
count = 0;
}
}
if (clear == 0) { // 如果没有按下清零键,则开始倒计时
while (count < 80) { // 从80开始倒计时
if (BUTTON_PAUSE == 0) { // 按下暂停键
pause = 1;
while (BUTTON_PAUSE == 0); // 等待暂停键释放
} else if (pause == 1) { // 如果已经暂停,则等待恢复
while (BUTTON_PAUSE);
pause = 0;
}
if (clear == 1) { // 如果按下了清零键,则退出倒计时
break;
}
if (count % 10 == 0) { // 每隔1秒更新时间
time++;
}
display(80 - count); // 显示当前倒计时值
delay(1000);
if (pause == 0) { // 如果没有暂停,则继续倒计时
count++;
}
}
if (clear == 0) { // 倒计时结束,显示00
display(0);
delay(1000);
display(0);
delay(1000);
}
}
}
}
}
```
阅读全文