|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
手头有一个STC15W1K16S和一个TM1652驱动的6位共阴数码管,想用DEEPSEEK做的程序点亮,但怎么也这不起来,有高手帮忙看下程序哪有问题
程序如下:
#include <STC15.H>
#include <intrins.h>
// 硬件定义
sbit TM1652_SDA = P1^7; // 数据线连接P1.7
// TM1652指令集
#define TM1652_ADDR_AUTO 0x40 // 地址自动递增模式
#define TM1652_ADDR_FIXED 0x44 // 固定地址模式
#define TM1652_DISPLAY_ON 0x88 // 显示开 + 亮度设置(0-7)
// YK3661AS数码管段码表(共阴)
const unsigned char SegCode[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x00 // 全灭(自定义)
};
// 延时函数(适配2.5MHz晶振)
void DelayUS(unsigned int us) {
while(us--) {
_nop_(); _nop_(); _nop_(); _nop_();
}
}
void DelayMS(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<1141; j++);
}
// TM1652通信协议
void TM1652_Start() {
TM1652_SDA = 1; DelayUS(5);
TM1652_SDA = 0; DelayUS(5);
}
void TM1652_Stop() {
TM1652_SDA = 0; DelayUS(5);
TM1652_SDA = 1; DelayUS(5);
}
void TM1652_WriteByte(unsigned char dat) {
unsigned char i;
for(i=0; i<8; i++) {
TM1652_SDA = (dat & 0x01);
dat >>= 1;
DelayUS(5);
}
TM1652_SDA = 1; // 释放总线等待ACK
DelayUS(5);
}
// TM1652初始化
void TM1652_Init() {
TM1652_Start();
TM1652_WriteByte(TM1652_ADDR_AUTO); // 启用地址自动递增
TM1652_Stop();
TM1652_Start();
TM1652_WriteByte(TM1652_DISPLAY_ON | 0x07); // 显示开 + 最高亮度
TM1652_Stop();
}
// 显示6位内容(传入段码数组)
void TM1652_Display(unsigned char *seg_data) {
unsigned char i;
TM1652_Start();
TM1652_WriteByte(0xC0); // 起始地址为第一个数码管
for(i=0; i<6; i++) {
TM1652_WriteByte(seg_data);
}
TM1652_Stop();
}
void main() {
unsigned char disp_buf[6] = {0};
unsigned char num = 0;
// 初始化TM1652
TM1652_Init();
while(1) {
// 填充显示缓冲区(示例:显示递增数字)
disp_buf[0] = SegCode[(num+0) % 10];
disp_buf[1] = SegCode[(num+1) % 10];
disp_buf[2] = SegCode[(num+2) % 10];
disp_buf[3] = SegCode[(num+3) % 10];
disp_buf[4] = SegCode[(num+4) % 10];
disp_buf[5] = SegCode[(num+5) % 10];
// 更新显示
TM1652_Display(disp_buf);
// 数字递增(0-9循环)
num++;
if(num >= 10) num = 0;
// 延时500ms
DelayMS(500);
}
}
先谢谢了 |
|