hc32l13x ch455h 4x5矩阵键盘,iic数码管驱动及具体实现示例
时间: 2024-02-03 13:12:52 浏览: 114
对于hc32l13x芯片,可以使用其内置的IIC模块来驱动数码管和矩阵键盘。
以下是一个简单的实现示例:
```c
#include "hc32l13x.h"
#include "hc32l13x_i2c.h"
#define IIC_SLAVE_ADDR 0x27 // IIC从机地址
#define IIC_HIGH_SPEED 0 // IIC时钟速率
#define IIC_TIMEOUT 0x100 // IIC超时时间
/* 数码管显示的数字 */
const uint8_t DIGITS[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
/* 矩阵键盘对应的按键值 */
const uint8_t KEY_VALUES[] = {
0x01, // 1
0x02, // 2
0x03, // 3
0x04, // 4
0x05, // 5
0x06, // 6
0x07, // 7
0x08, // 8
0x09, // 9
0x0a, // *
0x00, // 0
0x0b // #
};
/* 数码管显示函数 */
void display_digit(uint8_t digit) {
uint8_t data[2];
data[0] = 0x00; // 控制字节,表示写入数据
data[1] = DIGITS[digit]; // 数字的编码
while (I2C_SendData(I2C_CH1, IIC_SLAVE_ADDR, data, 2, IIC_TIMEOUT) != Ok);
}
/* 矩阵键盘扫描函数 */
uint8_t scan_key() {
uint8_t data[2];
uint8_t row, col;
for (row = 0; row < 4; row++) {
data[0] = 0x00; // 控制字节,表示写入数据
data[1] = ~(1 << row); // 设置行线为低电平
while (I2C_SendData(I2C_CH1, IIC_SLAVE_ADDR, data, 2, IIC_TIMEOUT) != Ok);
for (col = 0; col < 3; col++) {
data[0] = 0x00; // 控制字节,表示读取数据
while (I2C_SendData(I2C_CH1, IIC_SLAVE_ADDR, data, 1, IIC_TIMEOUT) != Ok);
while (I2C_ReceiveData(I2C_CH1, IIC_SLAVE_ADDR, data, 1, IIC_TIMEOUT) != Ok);
if (!(data[0] & (1 << col))) {
return KEY_VALUES[row * 3 + col];
}
}
}
return 0xff; // 没有按键按下
}
int main(void) {
I2C_InitTypeDef i2c_init;
uint8_t key_value;
/* 初始化IIC模块 */
i2c_init.I2cClkDiv = IIC_HIGH_SPEED ? 1 : 4; // 时钟分频
i2c_init.I2cIntEn = Disable; // 禁止中断
i2c_init.I2cMode = I2cMaster; // 主机模式
i2c_init.I2cOversampling = I2cOversampling16; // 16倍过采样
i2c_init.I2cOwnAddr = 0; // 从机地址
i2c_init.I2cSclHTime = IIC_HIGH_SPEED ? 6 : 12; // SCL高电平时间
i2c_init.I2cSclLTime = IIC_HIGH_SPEED ? 8 : 16; // SCL低电平时间
I2C_Init(I2C_CH1, &i2c_init); // 初始化IIC模块
/* 循环扫描矩阵键盘并显示按键值 */
while (1) {
key_value = scan_key();
if (key_value != 0xff) {
display_digit(key_value);
}
}
}
```
在上述示例中,通过IIC模块控制数码管和矩阵键盘的数据传输。数码管的显示使用了预先定义的数字编码,矩阵键盘的扫描则采用了行列扫描的方式。通过循环调用`scan_key()`函数可以实时检测是否有按键按下,并且将按键值显示在数码管上。
阅读全文