stm32f103zet6矩阵键盘加LCD12864计算器实验
时间: 2023-07-24 19:04:50 浏览: 157
12864LCD显示计算器键盘按键实验.rar
5星 · 资源好评率100%
对于 STM32F103ZET6 微控制器,你可以使用矩阵键盘和 LCD12864 来实现一个简单的计算器实验。下面是一个示例代码,演示如何实现该实验:
```c
#include "stm32f10x.h"
#include "LCD12864.h"
#define ROWS 4
#define COLS 4
unsigned char key_Map[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void MatrixKey_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 行引脚为输入,列引脚为输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 设置行引脚(PA8~PA11)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置列引脚(PB12~PB15)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void LCD_Position(unsigned int X, unsigned int Y)
{
int Pos;
if (X == 1)
X = 0x80;
else if (X == 2)
X = 0x90;
else if (X == 3)
X = 0x88;
else if (X == 4)
X = 0x98;
Pos = X + Y;
lcdPosition = Pos;
write_cmd(Pos);
}
void DisplayNumber(unsigned int X, unsigned int Y, unsigned long number, unsigned int length)
{
unsigned char array[length + 1];
unsigned char i;
array[length] = 0;
for (i = length; i > 0; i--)
{
array[i - 1] = number % 10 + '0';
number /= 10;
}
for (i = length; i >= 0; i--)
{
if (array[i] == '0')
{
array[i] = ' ';
}
else
{
break;
}
}
LCD_Position(X, Y);
LCD_displaychar(X, Y, array);
}
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
unsigned char MatrixKey_GetKey(void)
{
unsigned char row, col;
for (col = 0; col < COLS; col++)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIO_SetBits(GPIOB, GPIO_Pin_12 << col);
for (row = 0; row < ROWS; row++)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8 << row) == Bit_RESET)
{
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8 << row) == Bit_RESET)
Delay(1000); // 消除抖动
return key_Map[row][col];
}
}
}
return 0xFF; // 无按键按下
}
int main(void)
{
MatrixKey_Init();
LCD_Init();
LCD_Clear();
unsigned char key_val;
unsigned long number = 0;
unsigned int length = 0;
while (1)
{
key_val = MatrixKey_GetKey();
if (key_val != 0xFF)
{
if (key_val >= '0' && key_val <= '9')
{
number = number * 10 + (key_val - '0');
length++;
// 显示当前输入的数字
DisplayNumber(1, 1, number, length);
}
else if (key_val == '#')
{
// 执行计算操作,例如显示结果
// ...
// 清空数值和长度
number = 0;
length = 0;
// 清空LCD显示
LCD_Clear();
}
}
}
}
```
请确保你已经将 LCD12864 的驱动代码正确地集成到你的项目中,并完成相应的初始化。
上述示例代码展示了如何初始化矩阵键盘和 LCD12864,并使用矩阵键盘输入数字,在 LCD 上显示当前输入的数字。当按下 '#' 按键时,可以执行计算操作,并在 LCD 上显示结果。你可以根据自己的需求来修改和扩展该代码。
希望这能帮助到你。如果你还有其他问题,请随时提问。
阅读全文