查看: 2529|回复: 1

[原创] TYDE3.0 涂鸦智能 IoT开发板 (二)连接TM1637数码管显示时间

[复制链接]
  • TA的每日心情
    擦汗
    2019-4-8 08:56
  • 签到天数: 372 天

    连续签到: 15 天

    [LV.9]以坛为家II

    发表于 2018-2-26 13:09:54 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 xxxxwangchao 于 2018-2-26 13:12 编辑

    放假回来终于有时间用涂鸦的板子干点什么了,手里正好有tm1637的数码管,看了代码涂鸦板子的有网络校时的功能,
    所以今天就做个显示网络的时钟吧。
    首先我们要驱动tm1637,看规格书知道怎么用才行,属于类i2c的协议功能。具体大家自己查看。
    然后在板子上找2个闲置的gpio口。加上vcc gnd一共四线。
    代码如下
    //STmcu的延时
    void delay_us(u32 nus)
    {
    u32 temp;
    SysTick->LOAD = 9*nus;
    SysTick->VAL=0X00;//清空计数器
    SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    do
    {
      temp=SysTick->CTRL;//读取当前倒计数值
    }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
         SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
    void delay_ms(u16 nms)
    {
    u32 temp;
    SysTick->LOAD = 9000*nms;
    SysTick->VAL=0X00;//清空计数器
    SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
    do
    {
      temp=SysTick->CTRL;//读取当前倒计数值
    }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
        SysTick->CTRL=0x00; //关闭计数器
        SysTick->VAL =0X00; //清空计数器
    }
    //找到2个闲置的gpio口
    #define DIO_OFF()        GPIO_ResetBits(GPIOB,GPIO_Pin_13)
    #define DIO_ON()       GPIO_SetBits(GPIOB,GPIO_Pin_13)

    #define CLK_OFF()        GPIO_ResetBits(GPIOB,GPIO_Pin_15)
    #define CLK_ON()       GPIO_SetBits(GPIOB,GPIO_Pin_15)
    //io口初始化
    void MYI2C_Init(void)
    {
            GPIO_InitTypeDef GPIO_InitStruct;
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
            GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
            GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
            GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOB, &GPIO_InitStruct);         
            DIO_OFF();
            CLK_OFF();
    }

    //数码管显示的数组0-9
    static unsigned char LED[10] = {0x3f,0x06,0x5b,0x4f,//0,1,2,3
                                                  0x66,0x6d,0x7d,0x07,//4,5,6,7
                                                  0x7f,0x6f//8,9        
    };
    /**********************************************
    //IIC Start
    **********************************************/
    void I2CStart(void) //1637 开始
            {
            CLK_ON();
            DIO_ON();
            delay_us(2);
            DIO_OFF();
            }
            
    /**********************************************
    //IIC Stop
    **********************************************/
    void I2CStop(void) // 1637 停止
            {
            CLK_OFF();
            delay_us(2);
            DIO_OFF();
            delay_us(2);
            CLK_ON();
            delay_us(2);
            DIO_ON();
            }
    void I2Cask(void) //1637 应答
            {
            CLK_OFF();
            delay_us(5);
            CLK_ON();
            delay_us(3);
            CLK_OFF();
           }
            
            /**********************************************
            // 通过I2C总线写一个字节
            **********************************************/
            void I2CWrite_Byte(unsigned char oneByte)
            {
            unsigned char i;
            for(i=0;i<8;i++)
            { CLK_OFF();
            if(oneByte&0x01)  
            {
            DIO_ON();
            }
            else
            {
            DIO_OFF();
            }
            delay_us(3);
            oneByte=oneByte>>1;
            CLK_ON();
            delay_us(3);
            }
            }

    //显示函数

            void TimeDisplay(unsigned char a,unsigned char b)
    {
                    static unsigned char flag=0;
                    I2CStart();
                    I2CWrite_Byte(0x40);  
                    I2Cask();
                    I2CStop();
                    I2CStart();
                    I2CWrite_Byte(0xc0);  
                    I2Cask();
                    I2CWrite_Byte(LED[a/10]);  
                    I2Cask();         
                    if(flag ==0){
                    I2CWrite_Byte(LED[a%10]);
                    flag = 1;
                            }
                    else{
                    I2CWrite_Byte((LED[a%10])|0x80);  
                    flag = 0;
                            }
                    I2Cask();
                    I2CWrite_Byte(LED[(b%60)/10]);  
                    I2Cask();
                    I2CWrite_Byte(LED[(b%60)%10]);  
                    I2Cask();
                    I2CStop();
                    I2CStart();
                    I2CWrite_Byte(0x8f);  
                    I2Cask();
                    I2CStop();        
            }
    这样就可以操控数码管显示了,

    然后在打开开发板的网络校时定义
    QQ截图20180226125901.jpg
    然后在main.c里定义2个全局变量让校时函数赋值。
    unsigned char mm=0;
    unsigned char ss=0;

    校时函数里 涂鸦都提示了需要自己实现。
    QQ截图20180226130045.jpg
    QQ截图20180226131046.jpg

    这样在main的while循环里就可以用网络时间显示了,我加了2个delay让冒号2秒显示一次
    注意要用网络校时得调用系统时间函数去得到
    QQ截图20180226130422.jpg
    void main()
    {
    ......
      //RGB上电控制
      RGB_Power_Control();
      MYI2C_Init();
      while(1)
      {
            wifi_uart_service();
            Key_Scan();
            wifi_work_state_led();
            delay_ms (500);
            mcu_get_system_time();
            TimeDisplay(ss,mm);
            delay_ms (500);

    ......
    }
    看看效果图吧
    IMG_20180226_130545.jpg
    弄个动图不知道能不能显示
    VID_201802_clip.gif


    这是最简单的方法了,没有网络就尴尬了,后续加上本地timer的计时。有2个按键可以用来校时。


    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-4-8 08:56
  • 签到天数: 372 天

    连续签到: 15 天

    [LV.9]以坛为家II

     楼主| 发表于 2018-2-26 14:40:44 | 显示全部楼层
    发个TM1637的资料文件吧
    4位数码管显示模块.zip (519.01 KB, 下载次数: 4)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 10:18 , Processed in 0.128434 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.