人在江南 发表于 2025-5-19 19:14:55

数码管问题,帮忙分析

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
}

国芯人工智能 发表于 2025-5-19 19:18:00

在你的代码中,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开头和结尾的信号,确保读取器读取数据成功。

希望以上分析能帮助你解决问题!

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-5-19 19:20:09

描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看

人在江南 发表于 2025-5-19 21:07:59

ercircle 发表于 2025-5-19 19:20
描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看

数码显示不正常,我显示1111,结果是乱码

晓飛飛 发表于 2025-5-19 21:11:23

端口设置都是准双向,不知电路有无外部上拉电阻?

C_wolf 发表于 2025-5-19 21:24:31

时序

人在江南 发表于 2025-5-19 21:31:14

晓飛飛 发表于 2025-5-19 21:11
端口设置都是准双向,不知电路有无外部上拉电阻?

设置了上拉电阻

huashanhui20 发表于 2025-5-19 22:52:46

给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助

人在江南 发表于 2025-5-20 00:34:58

huashanhui20 发表于 2025-5-19 22:52
给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助 ...

非常感谢
页: [1]
查看完整版本: 数码管问题,帮忙分析