找回密码
 立即注册
查看: 215|回复: 8

数码管问题,帮忙分析

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-06-12 11:08:32

12

主题

25

回帖

416

积分

中级会员

积分
416
发表于 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[10] = {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[dat]); //DIG1
                        break;
                case 2: //第2位数码管显示
                        TM1650_WriteDat(0x6A,CODE[dat]); //DIG1
                        break;
                case 3: //第3位数码管显示
                        TM1650_WriteDat(0x6C,CODE[dat] | 0x80); //DIG1
                        break;
                case 4: //第4位数码管显示
                        TM1650_WriteDat(0x6E,CODE[dat]); //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
}
回复

使用道具 举报 送花

3

主题

725

回帖

161

积分

等待验证会员

积分
161
发表于 2025-5-19 19:18:00 | 显示全部楼层
在你的代码中,STC8H的I2C引脚配置可能存在问题,导致读取数据失败。以下是详细的分析和建议:

1. I2C引脚配置问题
发送器的I2C引脚:在代码中,发送器的I2C引脚未被正确配置。需要确保发送器的I2C引脚与数据线相连。
接收器的I2C引脚:在代码中,接收器的I2C引脚未被正确配置。需要确保接收器的I2C引脚与数据线相连。

2. I2C引脚的开头和结尾配置
在代码中,可能只配置了一个I2C引脚,导致读取器无法正常工作。正确的配置应包括I2C开头和结尾的设置。
例如,正确的I2C引脚配置应为:
   
  1. c
  2.      void I2CStartTM1650() {
  3.          TM1650SCL = 1; // 时钟信号保持高电平
  4.          TM1650SDA = 0; // 数据线拉高电平
  5.          delayus(5); // 等待数据线拉低电平
  6.          TM1650SDA = 1; // 数据线拉低电平
  7.          delayus(5); // 等待I2C开头完成
  8.      }
  9.      void I2CStopTM1650() {
  10.          TM1650SCL = 0; // 时钟信号保持低电平
  11.          TM1650SDA = 0; // 数据线拉低电平
  12.          delayus(5); // 等待I2C结尾完成
  13.      }
复制代码

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1912

回帖

4295

积分

荣誉版主

无情的代码机器

积分
4295
发表于 2025-5-19 19:20:09 | 显示全部楼层
描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-06-12 11:08:32

12

主题

25

回帖

416

积分

中级会员

积分
416
发表于 2025-5-19 21:07:59 | 显示全部楼层
erci*** 发表于 2025-5-19 19:20
描述下什么异常现象?
逻辑分析仪抓下I2C数据?
电路图也上传看看

数码显示不正常,我显示1111,结果是乱码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

积分
2658
发表于 2025-5-19 21:11:23 | 显示全部楼层
端口设置都是准双向,不知电路有无外部上拉电阻?
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-06-16 00:04:38
已绑定手机

7

主题

96

回帖

1195

积分

金牌会员

积分
1195
发表于 2025-5-19 21:24:31 | 显示全部楼层
时序
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-06-12 11:08:32

12

主题

25

回帖

416

积分

中级会员

积分
416
发表于 2025-5-19 21:31:14 | 显示全部楼层
晓*** 发表于 2025-5-19 21:11
端口设置都是准双向,不知电路有无外部上拉电阻?

设置了上拉电阻
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:311
  • 最近打卡:2025-06-16 07:28:16

4

主题

42

回帖

884

积分

高级会员

积分
884
发表于 2025-5-19 22:52:46 | 显示全部楼层
给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助

7_DMX_3SMG.zip

102.72 KB, 下载次数: 3

PCF8563_UART.zip

475.78 KB, 下载次数: 4

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-06-12 11:08:32

12

主题

25

回帖

416

积分

中级会员

积分
416
发表于 2025-5-20 00:34:58 | 显示全部楼层
huasha*** 发表于 2025-5-19 22:52
给你两个程序做参考,都是我当年玩过的,STC单片机硬件IIC的,确定能用的,希望对你有帮助 ...

非常感谢
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 11:56 , Processed in 0.156103 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表