单片机矩阵按键怎么控制八位数码管,并且可以实现加减的代码
1个回答
关注
展开全部
控制八位数码管,通常需要使用到数码管驱动芯片(例如常见的74HC595、TM1638、MAX7219等)以及按键扫描板,我会在下文中提供一种基于74HC595芯片和按键矩阵的控制八位数码管并实现加减功能的代码实现方式。首先,需要定义数码管显示的数字和字符编码,以方便后续进行控制。以共阴数码管为例,定义如下:cuint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};其中,code数组中每个元素对应的值分别为0~9数字的编码,可以通过查阅数码管资料手册获取其他字符的编码,例如A~F、小数点等。其次,需要定义按键矩阵的行列信息及与之对应的按键值。以4行4列的矩阵为例,定义如下:
咨询记录 · 回答于2023-06-13
单片机矩阵按键怎么控制八位数码管,并且可以实现加减的代码
控制八位数码管,通常需要使用到数码管驱动芯片(例如常见的74HC595、TM1638、MAX7219等)以及按键扫描板,我会在下文中提供一种基于74HC595芯片和按键矩阵的控制八位数码管并实现加减功能的代码实现方式。首先,需要定义数码管显示的数字和字符编码,以方便后续进行控制。以共阴数码管为例,定义如下:cuint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};其中,code数组中每个元素对应的值分别为0~9数字的编码,可以通过查阅数码管资料手册获取其他字符的编码,例如A~F、小数点等。其次,需要定义按键矩阵的行列信息及与之对应的按键值。以4行4列的矩阵为例,定义如下:
const uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7, 8, 9, 0xC}, {0, 0xF, 0xE, 0xD}};其中,key_matrix数组中每个元素对应的值分别为按键值,可以根据需要进行修改。需要注意的是,这里使用了一个特殊的数值0xF,用于表示加号按键,0xE表示减号按键。接下来,需要实现按键扫描以及相应的加减逻辑。在这里我们采用矩阵按键扫描法,通过轮流输出行并检测列的方式判断按键是否按下。以74HC595芯片控制八位数码管为例,代码实现如下:
#include #include #define uchar unsigned char#define uint unsigned intsbit SCL = P1 ^ 0; // 74HC595时钟输入引脚sbit SDA = P1 ^ 1; // 74HC595串行数据输入引脚sbit RCK = P1 ^ 2; // 74HC595并行数据输出锁存引脚sbit BTN_ROW = P2 ^ 4; // 按键矩阵行扫描引脚sbit BTN_COL = P2 ^ 3; // 按键矩阵列扫描引脚uint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};const uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7
#include #include #define uchar unsigned char#define uint unsigned intsbit SCL = P1 ^ 0; // 74HC595时钟输入引脚sbit SDA = P1 ^ 1; // 74HC595串行数据输入引脚sbit RCK = P1 ^ 2; // 74HC595并行数据输出锁存引脚sbit BTN_ROW = P2 ^ 4; // 按键矩阵行扫描引脚sbit BTN_COL = P2 ^ 3; // 按键矩阵列扫描引脚
uint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};const uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7, 8, 9, 0xC}, {0, 0xF, 0xE, 0xD}};uint8_t display[8] = {0}; // 数码管显示数据uint8_t cur_pos = 0; // 当前光标位置,用于加减操作void delay() { // 延时函数 uint i, j; for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++); }}
void init_74HC595() { // 初始化74HC595芯片 SCL = 0; SDA = 0; RCK = 0;}void send_byte(uint8_t data) { // 向74HC595芯片发送一个字节的数据 uint8_t i; for (i = 0; i < 8; i++) { SDA = data & 0x80; data = data << 1; SCL = 1; _nop_(); SCL = 0; }}
void display_digit(uint8_t digit, uint8_t data) { // 显示一个数字 send_byte(1u << digit); send_byte(code[data]); RCK = 1; _nop_(); RCK = 0;}void display_all() { // 显示所有数码管 uint8_t i; for (i = 0; i < 8; i++) { display_digit(i, display[i]); }}void update_display() { // 更新数码管显示 uint8_t i; for (i = 0; i < 8; i++) { display_digit(i, display[i]); delay(); }}
uint8_t read_key() { // 读取按键值 uint8_t i, j; uint8_t key = 0xFF; for (i = 0; i < 4; i++) { BTN_ROW = 0; BTN_COL = 1; BTN_ROW = (1u << i); for (j = 0; j < 4; j++) { if (!BTN_COL) { key = key_matrix[i][j]; break; } BTN_ROW = BTN_ROW << 1; } if (key != 0xFF) break; } return key;}
void main() { uint8_t num = 0; uint8_t op = 1; // 操作符,1表示加,-1表示减 init_74HC595(); while (1) { uint8_t key = read_key(); if (key != 0xFF) { if (key >= 0 && key <= 9) { // 数字按键 if (cur_pos < 8) { display[cur_pos++] = key; update_display(); } } else if (key == 0xF) { // 加号按键 op = 1; cur_pos = 0; } else if (key == 0xE) { // 减号按键
if (cur_pos > 0) { // 进行加减操作 uint8_t i; num = 0; for (i = 0; i cur_pos; i++) { num = num * 10 + display[i]; } num += op; if (num > 99999999) num = 0; // 超出范围则清零 for (i = 0; i < cur_pos; i++) { display[cur_pos - 1 - i] = num % 10; num /= 10; } update_display(); } }}
上述代码实现了八位数码管的控制,支持0~9数字的输入以及加减操作。其中,按键扫描的实现方式需要根据具体的硬件电路和按键矩阵进行调整,代码中只是提供了一种简单的示例。如果需要使用其他驱动芯片或增加其他功能,也需要根据具体情况进行相应的修改。
由于字数限制无法给你发整体代码,希望您能谅解,希望我的回答对您有帮助
我想要的是两位数的相加
就是八个数码管有两个那种数相加
前面两个数用矩阵实现相加,后面两个也是
就是前面算前面的,后面算后面算后面的
控制八位数码管,通常需要使用到数码管驱动芯片(例如常见的74HC595、TM1638、MAX7219等)以及按键扫描板,我会在下文中提供一种基于74HC595芯片和按键矩阵的控制八位数码管并实现加减功能的代码实现方式。首先,需要定义数码管显示的数字和字符编码,以方便后续进行控制。以共阴数码管为例,定义如下:cuint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};其中,code数组中每个元素对应的值分别为0~9数字的编码,可以通过查阅数码管资料手册获取其他字符的编码,例如A~F、小数点等。其次,需要定义按键矩阵的行列信息及与之对应的按键值。以4行4列的矩阵为例,定义如下:cconst uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7, 8, 9, 0xC
其中,key_matrix数组中每个元素对应的值分别为按键值,可以根据需要进行修改。需要注意的是,这里使用了一个特殊的数值0xF,用于表示加号按键,0xE表示减号按键。接下来,需要实现按键扫描以及相应的加减逻辑。在这里我们采用矩阵按键扫描法,通过轮流输出行并检测列的方式判断按键是否按下。以74HC595芯片控制八位数码管为例,代码实现如下:
#include #include #define uchar unsigned char#define uint unsigned intsbit SCL = P1 ^ 0; // 74HC595时钟输入引脚sbit SDA = P1 ^ 1; // 74HC595串行数据输入引脚sbit RCK = P1 ^ 2; // 74HC595并行数据输出锁存引脚sbit BTN_ROW = P2 ^ 4; // 按键矩阵行扫描引脚sbit BTN_COL = P2 ^ 3; // 按键矩阵列扫描引脚uint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};const uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7
#include #include #define uchar unsigned char#define uint unsigned intsbit SCL = P1 ^ 0; // 74HC595时钟输入引脚sbit SDA = P1 ^ 1; // 74HC595串行数据输入引脚sbit RCK = P1 ^ 2; // 74HC595并行数据输出锁存引脚sbit BTN_ROW = P2 ^ 4; // 按键矩阵行扫描引脚sbit BTN_COL = P2 ^ 3; // 按键矩阵列扫描引脚
uint8_t code[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};const uint8_t key_matrix[4][4] = {{1, 2, 3, 0xA}, {4, 5, 6, 0xB}, {7, 8, 9, 0xC}, {0, 0xF, 0xE, 0xD}};uint8_t display[8] = {0}; // 数码管显示数据uint8_t cur_pos = 0; // 当前光标位置,用于加减操作void delay() { // 延时函数 uint i, j; for (i = 0; i < 100; i++) { for (j = 0; j < 100; j++); }}
void init_74HC595() { // 初始化74HC595芯片 SCL = 0; SDA = 0; RCK = 0;}void send_byte(uint8_t data) { // 向74HC595芯片发送一个字节的数据 uint8_t i; for (i = 0; i < 8; i++) { SDA = data & 0x80; data = data << 1; SCL = 1; _nop_(); SCL = 0; }}
void display_digit(uint8_t digit, uint8_t data) { // 显示一个数字 send_byte(1u << digit); send_byte(code[data]); RCK = 1; _nop_(); RCK = 0;}void display_all() { // 显示所有数码管 uint8_t i; for (i = 0; i < 8; i++) { display_digit(i, display[i]); }}
uint8_t read_key() { // 读取按键值 uint8_t i, j; uint8_t key = 0xFF; for (i = 0; i < 4; i++) { BTN_ROW = 0; BTN_COL = 1; BTN_ROW = (1u << i); for (j = 0; j < 4; j++) { if (!BTN_COL) { key = key_matrix[i][j]; break; } BTN_ROW = BTN_ROW << 1; } if (key != 0xFF) break; } return key;}
void main() { uint8_t num1 = 0, num2 = 0; uint8_t op = 0; // 操作符,1表示加,-1表示减 init_74HC595(); while (1) { uint8_t key = read_key(); if (key != 0xFF) { if (key >= 0 && key <= 9) { // 数字按键 if (cur_pos < 16) { if (cur_pos < 8) { num1 = num1 * 10 + key; } else { num2 = num2 * 10 + key; } display[cur_pos++] = key;
update_display(); } } else if (key == 0xF) { // 加号按键 op = 1; cur_pos = 8; } else if (key == 0xE) { // 减号按键 op = -1; cur_pos = 8; } delay(); }
if (cur_pos >= 8) { // 进行加减操作 uint8_t i; uint16_t num = num1 + op * num2; if (num > 99999999) num = 0; // 超出范围则清零 for (i = 0; i < 8; i++) { display[7 - i] = num % 10; num /= 10; } update_display(); } }}上述代码实现了八位数码管的控
亲,能看明白吗?