数码管问题,帮忙分析
STC8H驱动TM1650哪里不对?各位老师帮忙分析#include <STC8.h>
#include "includes.h"
sbit TM1650_SDA = P1^1;
sbit TM1650_SCL = P1^6;
unsigned char CODE = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码
void TM1650_Init();
void Display4Digits();
void main()
{
P_SW2 |= 0x80;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
TM1650_Init();
while(1)
{
Display4Digits();
Delay500ms();
}
}
void I2C_Start_TM1650()
{
TM1650_SCL = 1; //时钟信号保持高电平
TM1650_SDA = 1; //数据线拉高
delay_us(5);
TM1650_SDA = 0; //
delay_us(5);
TM1650_SCL = 0; //
}
void I2C_Stop_TM1650()
{
TM1650_SCL = 0;
TM1650_SDA = 0; //保证数据线为低电平
delay_us(5);
TM1650_SCL = 1;
delay_us(5);
TM1650_SDA = 1; //数据线出现上升沿
}
unsigned char I2C_Wait_Ack_TM1650()
{
unsigned char ackTime = 0;//应答等待计数
TM1650_SCL = 1;
delay_us(5);
TM1650_SCL = 1;
while(TM1650_SDA)
{
ackTime++;
if(ackTime > 250)
{
I2C_Stop_TM1650();
return 1;
}
}
TM1650_SCL = 0;
return 0;
}
void I2C_WriteByte_TM1650(unsigned char txd)
{
unsigned char i;
TM1650_SCL = 0;
delay_us(1);
for(i = 0;i < 8;i++)
{
if(txd & 0x80)
TM1650_SDA = 1;
else
TM1650_SDA = 0;
txd <<= 1;
TM1650_SCL = 0;
delay_us(5);
TM1650_SCL = 1;
delay_us(5);
TM1650_SCL = 0;
}
}
void TM1650_WriteDat(unsigned char add,unsigned char dat)
{
I2C_Start_TM1650();
I2C_WriteByte_TM1650(add); //第一个显存地址
I2C_Wait_Ack_TM1650();
I2C_WriteByte_TM1650(dat);
I2C_Wait_Ack_TM1650();
I2C_Stop_TM1650();
}
void TM1650_WriteCmd(unsigned char cmd)
{
I2C_Start_TM1650();
I2C_WriteByte_TM1650(0x48);//显示模式
I2C_Wait_Ack_TM1650();
I2C_WriteByte_TM1650(cmd);
I2C_Wait_Ack_TM1650();
I2C_Stop_TM1650();
}
void Display(unsigned char add,unsigned char dat)
{
switch(add)
{
case 1: //第1位数码管显示
TM1650_WriteDat(0x68,CODE); //DIG1
break;
case 2: //第2位数码管显示
TM1650_WriteDat(0x6A,CODE); //DIG1
break;
case 3: //第3位数码管显示
TM1650_WriteDat(0x6C,CODE | 0x80); //DIG1
break;
case 4: //第4位数码管显示
TM1650_WriteDat(0x6E,CODE); //DIG1
break;
default:
break;
}
}
void Display4Digits()
{
unsigned char i;
for(i=1;i<5;i++)
{
Display(i,i);
}
}
void TM1650_Init()
{
TM1650_WriteCmd(0x11); //1级亮度 8段显示 开显示
TM1650_WriteDat(0x68,0x00); //DIG1
TM1650_WriteDat(0x6a,0x00); //DIG2
TM1650_WriteDat(0x6c,0x00); //DIG3
TM1650_WriteDat(0x6e,0x00); //DIG4
} 在你的代码中,STC8H的I2C引脚配置可能存在问题,导致读取数据失败。以下是详细的分析和建议:
1. I2C引脚配置问题
发送器的I2C引脚:在代码中,发送器的I2C引脚未被正确配置。需要确保发送器的I2C引脚与数据线相连。
接收器的I2C引脚:在代码中,接收器的I2C引脚未被正确配置。需要确保接收器的I2C引脚与数据线相连。
2. I2C引脚的开头和结尾配置
在代码中,可能只配置了一个I2C引脚,导致读取器无法正常工作。正确的配置应包括I2C开头和结尾的设置。
例如,正确的I2C引脚配置应为:
c
void I2CStartTM1650() {
TM1650SCL = 1; // 时钟信号保持高电平
TM1650SDA = 0; // 数据线拉高电平
delayus(5); // 等待数据线拉低电平
TM1650SDA = 1; // 数据线拉低电平
delayus(5); // 等待I2C开头完成
}
void I2CStopTM1650() {
TM1650SCL = 0; // 时钟信号保持低电平
TM1650SDA = 0; // 数据线拉低电平
delayus(5); // 等待I2C结尾完成
}
3. 数据线连接问题
确保发送器和接收器的I2C引脚与数据线有效连接,数据线的拉高和低平设置正确。
数据线的拉高电平应与发送器的I2C信号一致,拉低电平应与接收器的I2C信号一致。
4. 代码中的I2C初始化
在代码中,可能只初始化了I2C引脚中的一个,导致其他引脚无法正常读取数据。
需要确保所有I2C引脚都被正确初始化。
5. I2C引脚的连接方式
发送器的I2C引脚可能连接在发送器的G端,而接收器的I2C引脚连接在接收器的G端。
这种连接方式会导致数据传输方向错误,读取器无法正确读取数据。
6. 代码中的读写逻辑
在代码中,Display4Digits()函数不断调用,可能需要更仔细地检查数据线的读写逻辑是否正确。
例如,数据线的读写方向是否正确,是否需要反转信号。
7. 代码的错误
现在,代码中存在以下错误:
缺少发送器和接收器的I2C引脚配置。
缺少正确的I2C开头和结尾设置。
缺少数据线的拉高和低平设置。
缺少正确的读写逻辑。
8. 建议的解决方案
确保发送器和接收器的I2C引脚被正确配置。
确保发送器和接收器的I2C引脚与数据线有效连接。
正确设置I2C开头和结尾的信号。
确保数据线的拉高和低平设置与I2C信号一致。
进行详细的I2C引脚测试,确认数据线的连接和信号设置是否正确。
9. 总结
代码中存在I2C引脚的配置错误,导致读取器无法正常工作。
需要更仔细地检查发送器和接收器的I2C引脚配置,确保数据线的连接和信号设置正确。
正确设置I2C开头和结尾的信号,确保读取器读取数据成功。
希望以上分析能帮助你解决问题!
[本文内容由国芯人工智能辅助生成,仅供参考] 描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看 ercircle 发表于 2025-5-19 19:20
描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看
数码显示不正常,我显示1111,结果是乱码 端口设置都是准双向,不知电路有无外部上拉电阻? 时序 晓飛飛 发表于 2025-5-19 21:11
端口设置都是准双向,不知电路有无外部上拉电阻?
设置了上拉电阻 给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助 huashanhui20 发表于 2025-5-19 22:52
给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助 ...
非常感谢
页:
[1]