使用STM32F103VET6开发板设计一个计算器,通过键盘输入 0~9 的数字,以及运算法则加减乘除,用mdk5编程,要求能通过串口在电脑端串口调试软件上显示运算结果。
时间: 2023-10-10 09:08:39 浏览: 47
好的,这是一个比较复杂的项目,需要涉及到硬件设计和软件编程。以下是大致的实现步骤:
1. 硬件设计
使用STM32F103VET6开发板,需要连接一个键盘和一个串口模块。键盘可以采用4x4矩阵键盘,串口模块可以选择USART1或USART2。具体的连接方式可以参考开发板的原理图和数据手册。
2. 软件编程
使用MDK5进行编程,首先需要配置开发板的引脚和时钟。然后编写键盘扫描程序,读取用户输入的数字和运算符,并将其存储在缓冲区中。接下来编写计算程序,根据用户输入的数据进行计算,并将结果存储在缓冲区中。最后使用串口发送函数将结果发送到电脑端串口调试软件上显示。
具体的代码实现可以参考以下步骤:
1. 配置引脚和时钟
```c
// 配置GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置串口
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
```
2. 编写键盘扫描程序
```c
int scan_key()
{
int i, j;
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
i = GPIO_ReadInputData(GPIOA) & 0x0f;
if (i == 0x0f) return -1; // 没有按键按下
for (j = 0; j < 4; j++)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
switch (j)
{
case 0: GPIO_ResetBits(GPIOA, GPIO_Pin_0); break;
case 1: GPIO_ResetBits(GPIOA, GPIO_Pin_1); break;
case 2: GPIO_ResetBits(GPIOA, GPIO_Pin_2); break;
case 3: GPIO_ResetBits(GPIOA, GPIO_Pin_3); break;
}
i = GPIO_ReadInputData(GPIOA) & 0x0f;
if (i != 0x0f) break;
}
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
if (j == 4) return -1; // 没有按键按下
i = 0;
switch (j)
{
case 0: i = 0; break;
case 1: i = 4; break;
case 2: i = 8; break;
case 3: i = 12; break;
}
if (i < 10) return i + j + 1;
else return i - 10;
}
```
3. 编写计算程序
```c
int calculate(int num1, int num2, char op)
{
int result = 0;
switch (op)
{
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
}
return result;
}
```
4. 主程序
```c
int main()
{
char buffer[32];
int num1 = 0, num2 = 0, result = 0;
char op = 0;
int i = 0;
while (1)
{
int key = scan_key();
if (key != -1)
{
if (key >= 0 && key <= 9)
{
if (op == 0) num1 = num1 * 10 + key;
else num2 = num2 * 10 + key;
sprintf(buffer, "%d", key);
USART_SendString(USART1, buffer);
}
else if (key == 10)
{
op = '+';
USART_SendString(USART1, "+");
}
else if (key == 11)
{
op = '-';
USART_SendString(USART1, "-");
}
else if (key == 12)
{
op = '*';
USART_SendString(USART1, "*");
}
else if (key == 13)
{
op = '/';
USART_SendString(USART1, "/");
}
else if (key == 14)
{
result = calculate(num1, num2, op);
sprintf(buffer, "=%d\n\r", result);
USART_SendString(USART1, buffer);
num1 = 0;
num2 = 0;
op = 0;
}
}
}
}
```
这是一个简单的计算器程序,可以根据需要进行修改和扩展。注意在编写程序时要注意数据类型和变量的范围,以避免出现溢出和错误的计算结果。