还是豆包,
STC8H1K28与TM1638的4位共阳led,5按键程序;
#include
#include
// 定义TM1638与单片机连接的引脚
sbit DIO = P2^0;
sbit CLK = P2^1;
sbit STB = P2^2;
// 共阳数码管段码表(0 - 9,A - F),根据实际数码管调整
unsigned char code SEG_CODE[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
// 延时函数,用于产生适当的时序延时
void Delay(unsigned int x) {
unsigned int i, j;
for (i = 0; i < x; i++)
for (j = 0; j < 120; j++);
}
// 向TM1638写入一个字节数据
void Write_TM1638(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
CLK = 0;
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
}
}
// 发送命令字到TM1638
void Send_CMD(unsigned char cmd) {
STB = 0;
Write_TM1638(cmd);
STB = 1;
}
// 初始化TM1638
void TM1638_Init() {
Send_CMD(0x8F); // 设置显示模式,开启显示等
}
// 在指定位置显示一位数字(pos为0 - 3表示数码管从左到右的位置,num为要显示的数字0 - F)
void Display_Digit(unsigned char pos, unsigned char num) {
Send_CMD(0x44); // 设置数据自动地址加1模式
STB = 0;
Write_TM1638(0xC0 | pos); // 设置显示地址
Write_TM1638(SEG_CODE[num]);
STB = 1;
}
// 显示4位数字(disp_buf数组存放要显示的4位数字,例如disp_buf[0]为最高位数字)
void Display_Number(unsigned char disp_buf[]) {
unsigned char i;
for (i = 0; i < 4; i++) {
Display_Digit(i, disp_buf[i]);
}
}
// 扫描按键,返回按键值(0 - 5表示5个按键,无按键按下返回0xFF)
unsigned char Scan_Keys() {
unsigned char key_value = 0xFF;
Send_CMD(0x42); // 设置读按键命令
STB = 0;
Write_TM1638(0xC0);
CLK = 0;
DIO = 1;
_nop_();
_nop_();
CLK = 1;
_nop_();
_nop_();
if (DIO == 0) { // 有按键按下
key_value = 0;
while (DIO == 0); // 等待按键释放
}
STB = 1;
return key_value;
}
void main() {
unsigned char disp_buf[4] = {0, 0, 0, 0}; // 显示缓冲区
unsigned char key;
TM1638_Init();
while (1) {
// 在这里可以根据自己的需求设置要显示的数字到disp_buf数组中
Display_Number(disp_buf);
key = Scan_Keys();
if (key!= 0xFF) {
// 根据按下的按键进行相应处理,这里简单打印按键值示例
switch (key) {
case 0:
// 处理第一个按键按下的逻辑
break;
case 1:
// 处理第二个按键按下的逻辑
break;
case 2:
// 处理第三个按键按下的逻辑
break;
case 3:
// 处理第四个按键按下的逻辑
break;
case 4:
// 处理第五个按键按下的逻辑
break;
}
}
Delay(10); // 适当延时,避免频繁扫描
}
}
24-12-24 11:52