题目 MSP430 外扩键盘与 LED数码管昆示 一、设计要求 1、基本要求: 1))基于TM1638 模块: 2)实现按键值显示功能 2、 发挥部分: 1)实现简单的计算器功能:加、减、乘、除法功能: 2)实现电子钟 基本要求 系统方案设计 主程序结构安排 各部分实现功能介绍 关键代码分析
时间: 2023-12-16 07:03:10 浏览: 117
MSP430单片机 矩阵键盘与数码管实验(附原理图).doc
5星 · 资源好评率100%
一、设计要求
1. 基本要求:
基于TM1638模块,实现按键值显示功能。
2. 发挥部分:
实现简单的计算器功能:加、减、乘、除法功能。
实现电子钟。
二、系统方案设计
本设计采用MSP430单片机作为主控芯片,通过TM1638模块控制LED数码管和按键输入。其中,按键输入通过TM1638模块的引脚直接接入MSP430单片机的GPIO口,LED数码管则通过SPI通信协议与MSP430单片机进行通信。
整个系统的主程序分为两个部分:按键扫描和LED数码管显示。按键扫描通过轮询方式实现,每隔一段时间读取一次按键状态。LED数码管显示则通过SPI通信协议与TM1638模块进行通信实现。
三、主程序结构安排
主程序结构如下:
1. 初始化程序:配置MSP430单片机的GPIO口和SPI通信协议。
2. 按键扫描程序:通过轮询方式读取按键状态,根据按键状态执行相应的操作。
3. LED数码管显示程序:通过SPI通信协议与TM1638模块进行通信,将需要显示的数据发送给TM1638模块,实现LED数码管的显示。
4. 加法运算程序:实现两个数的加法运算。
5. 减法运算程序:实现两个数的减法运算。
6. 乘法运算程序:实现两个数的乘法运算。
7. 除法运算程序:实现两个数的除法运算。
8. 电子钟程序:实现电子钟功能,包括显示当前时间和校准时间。
四、各部分实现功能介绍
1. 初始化程序:主要是对MSP430单片机的GPIO口和SPI通信协议进行配置,使之能够与TM1638模块进行通信。具体实现方式可以参照MSP430单片机的开发文档。
2. 按键扫描程序:通过轮询方式读取按键状态,根据按键状态执行相应的操作。例如,当检测到按下“+”键时,调用加法运算程序实现加法运算。
3. LED数码管显示程序:通过SPI通信协议与TM1638模块进行通信,将需要显示的数据发送给TM1638模块,实现LED数码管的显示。具体实现方式可以参照TM1638模块的开发文档。
4. 加法运算程序:实现两个数的加法运算。具体实现方式可以参照C语言的数学库函数,通过循环实现对两个数的每一位进行相加,最终得到结果。
5. 减法运算程序:实现两个数的减法运算。具体实现方式可以参照C语言的数学库函数,通过循环实现对两个数的每一位进行相减,最终得到结果。
6. 乘法运算程序:实现两个数的乘法运算。具体实现方式可以参照C语言的数学库函数,通过循环实现对两个数的每一位进行相乘,最终得到结果。
7. 除法运算程序:实现两个数的除法运算。具体实现方式可以参照C语言的数学库函数,通过循环实现对两个数的每一位进行相除,最终得到结果。
8. 电子钟程序:实现电子钟功能,包括显示当前时间和校准时间。具体实现方式可以参照MSP430单片机的时钟模块,通过读取时钟寄存器的值实现显示当前时间,通过按下“设置”键和“+”、“-”键实现校准时间。
五、关键代码分析
1. 按键扫描程序:
```c
void key_scan(void) {
unsigned char key_val = 0;
key_val = TM1638_ReadKeyboard();
switch (key_val) {
case KEY_UP:
// 执行加法运算
add();
break;
case KEY_DOWN:
// 执行减法运算
subtract();
break;
case KEY_LEFT:
// 执行乘法运算
multiply();
break;
case KEY_RIGHT:
// 执行除法运算
divide();
break;
case KEY_SET:
// 进入时间设置模式
clock_set_mode();
break;
default:
break;
}
}
```
2. LED数码管显示程序:
```c
void display(unsigned char *buffer) {
unsigned char i;
TM1638_Start();
TM1638_Send(0x40); // 地址自动加 1
for (i = 0; i < 16; i++) {
TM1638_Send(buffer[i]);
}
TM1638_Stop();
}
```
3. 加法运算程序:
```c
void add(void) {
unsigned char a = 0, b = 0, c = 0;
a = get_number();
b = get_number();
c = a + b;
display_result(c);
}
```
4. 减法运算程序:
```c
void subtract(void) {
unsigned char a = 0, b = 0, c = 0;
a = get_number();
b = get_number();
c = a - b;
display_result(c);
}
```
5. 乘法运算程序:
```c
void multiply(void) {
unsigned char a = 0, b = 0, c = 0;
a = get_number();
b = get_number();
c = a * b;
display_result(c);
}
```
6. 除法运算程序:
```c
void divide(void) {
unsigned char a = 0, b = 0, c = 0;
a = get_number();
b = get_number();
c = a / b;
display_result(c);
}
```
7. 电子钟程序:
```c
void clock_mode(void) {
unsigned char hour = 0, minute = 0, second = 0;
get_time(&hour, &minute, &second);
display_time(hour, minute, second);
while (1) {
if (TM1638_ReadKeyboard() == KEY_SET) {
clock_set_mode();
break;
}
get_time(&hour, &minute, &second);
display_time(hour, minute, second);
delay(1000);
}
}
void clock_set_mode(void) {
unsigned char hour = 0, minute = 0, second = 0;
unsigned char key_val = 0;
get_time(&hour, &minute, &second);
display_time(hour, minute, second);
while (1) {
key_val = TM1638_ReadKeyboard();
if (key_val == KEY_SET) {
break;
} else if (key_val == KEY_LEFT) {
if (hour > 0) {
hour--;
} else {
hour = 23;
}
display_time(hour, minute, second);
} else if (key_val == KEY_RIGHT) {
if (hour < 23) {
hour++;
} else {
hour = 0;
}
display_time(hour, minute, second);
} else if (key_val == KEY_UP) {
if (minute > 0) {
minute--;
} else {
minute = 59;
}
display_time(hour, minute, second);
} else if (key_val == KEY_DOWN) {
if (minute < 59) {
minute++;
} else {
minute = 0;
}
display_time(hour, minute, second);
}
}
set_time(hour, minute, second);
}
```
以上代码仅供参考,具体实现方式可以根据实际需求进行修改。
阅读全文