标题: tm1637输出一直灰色,I2C通讯监视正常? [打印本页]

作者: sillyboy    时间: 2023-6-22 23:50
标题: tm1637输出一直灰色,I2C通讯监视正常?
谢谢大家

作者: wulin    时间: 2023-6-23 06:09
TM1637驱动共阳数码管时钟示例 仿真.rar (879.08 KB, 下载次数: 21)



作者: wulin    时间: 2023-6-23 06:18
本帖最后由 wulin 于 2023-7-1 07:58 编辑

此代码在仿真环境TM1637 的按键扫描功能失败,只好另写按键扫描。但用实物测试TM1637 的按键扫描功能正常。
作者: chxelc    时间: 2023-6-23 08:21
把程序和电路发出来,坛友才好帮你分析。
作者: cnfloatleaf    时间: 2023-6-30 20:33
tm1637.c
#include        <reg51.h>          
#include        <intrins.h>
#include        "tm1637.h"

sfr     P4 = 0xc0;
sfr     P5 = 0xc8;
sbit    SDIO = P5^5;                // TM1637
sbit    SDCK = P4^4;

void        tm1637(unsigned char intensity2, unsigned char ledA1, unsigned char ledA2)
{
        tm_start();
        tm_write(0x40);        // 设置写RAM,地址自动+1
        tm_stop();
        _nop_();
        _nop_();
        _nop_();

        tm_start();
        tm_write(0xc0);        //        设置写RAM地址
        tm_write(ledA1);  // write RAM
        tm_write(ledA2);  // write RAM
        tm_write(0);        // write RAM  
        tm_write(0);        // write RAM
        tm_write(0);        // write RAM  
        tm_write(0);        // write RAM
        tm_stop();
        _nop_();
        _nop_();
        _nop_();

        tm_start();
        tm_write(intensity2);        
        tm_stop();
}
void        tm_start(void)
{
        SDIO = 1;
        SDCK = 1;
        DL1uS(3);
        SDIO = 0;
        DL1uS(1);
        SDCK = 0;
}
void        tm_stop(void)
{
        SDIO = 0;
        SDCK = 0;
        DL1uS(3);
        SDCK = 1;
        DL1uS(3);
        SDIO = 1;
}
void        tm_write(unsigned char x2)
{
        unsigned char        i2;
        for(i2=0; i2<8; i2++)         
        {
                SDCK = 0;
                if((1&x2) == 0)
                { SDIO = 0; }
                else
                { SDIO = 1; }
                DL1uS(1);
                SDCK = 1;
                x2 = x2 >> 1;
        }
        SDCK = 0;
        DL1uS(1);
        while(SDIO == 1);
        DL1uS(1);
        SDCK = 1;
}
unsigned char        tm1637_key(void)
{
        unsigned char        i2,k2;
        tm_start();
        tm_write(0x42);
        SDIO = 1;
        k2 = 0;
        for(i2=0; i2<8; i2++)         
        {
                SDCK = 0;
                k2 = k2 >> 1;
                DL1uS(1);
                SDCK = 1;
                if(SDIO == 1)
                { k2 = k2 | 0x80; }
                DL1uS(1);
        }
        SDCK = 0;
        DL1uS(1);
        while(SDIO == 1);
        DL1uS(1);
        SDCK = 1;
        DL1uS(1);
        tm_stop();
        return        k2;
}

void        DL1uS(unsigned char z2)                       
{        // 1T 22.1184MHz 1uS*(z2+1)  STC8A8K tested       
        unsigned char x2,y2;
        for(x2=0; x2<z2; x2++)
        {
                for(y2=0; y2<2; y2++)
                {  }
        }
        _nop_();
}

tm1637.h
#define                _TM1637_H

void        tm1637(unsigned char intensity2, unsigned char ledA1, unsigned char ledA2);
void        tm_start(void);
void        tm_stop(void);
void        tm_write(unsigned char x2);
unsigned char        tm1637_key(void);
void        DL1uS(unsigned char z2);

这里是tm1637.c和tm1637.h文件,只用了2个数码管,显示和按键都是测试过的。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1