OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3721|回复: 2

51单片机使用TM1637 首位被置1

[复制链接]

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
发表于 2022-4-21 16:52:08 | 显示全部楼层 |阅读模式
19金钱
初学51单片机 用仿真搭建了一个TM1637的电路 使用的代码是厂家手册里的
但是我发现发送数据的第一位会被置位(最低位)
想让数码管显示一个1 发送了0x06 但是显示的是7 我看了一下码表 数字7是0x07
想问一下大家这是什么情况
/*
*版权信息: 深圳天微电子
*文件名: TM1637
*当前版本: 1.0
*单片机型号: AT89S52
*开发环境: Keil uVision3
*晶震频率: 11.0592M
*程序功能: 把TM1637 所有显示寄存器地址全部写满数据0xff,并开显示,然后再读按键值。
*/
#include <reg52.h>
#include <intrins.h>
//定义端口
sbit clk = P3 ^ 3;
sbit dio = P3 ^ 2;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
///=======================================
void Delay_us(unsigned int i) // nus 延时
{
    for (; i > 0; i--)
        _nop_();
}
void Delay_ms(unsigned int i)
{
    for (; i > 0; i--)
    Delay_us(1000);
}
///======================================
void I2CStart(void) // 1637 开始
{
    clk = 1;
    dio = 1;
    Delay_us(2);
    dio = 0;
}
///=============================================
void I2Cask(void) // 1637 应答
{
    clk = 0;
    Delay_us(5); //在第八个时钟下降沿之后延时5us,开始判断ACK 信号
    while (dio)
        ;
    clk = 1;
    Delay_us(2);
    clk = 0;
}
///========================================
void I2CStop(void) // 1637 停止
{
    clk = 0;
    Delay_us(2);
    dio = 0;
    Delay_us(2);
    clk = 1;
    Delay_us(2);
    dio = 1;
}
///=========================================
void I2CWrByte(unsigned char oneByte) //写一个字节
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        clk = 0;
        if (oneByte & 0x01) //低位在前
        {
            dio = 1;
        }
        else
        {
            dio = 0;
        }
        Delay_us(3);
        oneByte = oneByte >> 1;
        clk = 1;
        Delay_us(3);
    }
}
///================================================
void SmgDisplay(int addr,int num) //写显示寄存器
{
    // unsigned char i;
    I2CStart();
    I2CWrByte(0x44); // 40H 地址自动加1 模式,44H 固定地址模式,本程序采  用自加1 模式
    I2Cask();
    I2CStop();
    I2CStart();

    I2CWrByte(addr); //设置地址,
    I2Cask();
    I2CWrByte(num); //送数据
    I2Cask();


    I2CStop();
    I2CStart();
    I2CWrByte(0x8f); //开显示 ,最大亮度
    I2Cask();
    I2CStop();
}

void main(void)
{
      SmgDisplay(0xc0,table[1]); //写寄存器并开显示
    while (1)
    {

    }
}


最佳答案

查看完整内容[请看2#楼]

问题没解决但是不重要了 用的仿真软件仿真 但是实物是没问题的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2021-2-4
在线时间
146 小时
 楼主| 发表于 2022-4-21 16:52:09 | 显示全部楼层
正点原子 发表于 2022-4-21 22:45
仿真 ,是硬件仿真么?

问题没解决但是不重要了
用的仿真软件仿真
但是实物是没问题的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-4-21 22:45:54 | 显示全部楼层
仿真 ,是硬件仿真么?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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