1回答

1收藏

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

物联网 物联网 3180 人阅读 | 1 人回复 | 2018-02-26

本帖最后由 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();        
        }
这样就可以操控数码管显示了,

然后在打开开发板的网络校时定义

然后在main.c里定义2个全局变量让校时函数赋值。
unsigned char mm=0;
unsigned char ss=0;

校时函数里 涂鸦都提示了需要自己实现。



这样在main的while循环里就可以用网络时间显示了,我加了2个delay让冒号2秒显示一次
注意要用网络校时得调用系统时间函数去得到

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);

......
}
看看效果图吧

弄个动图不知道能不能显示



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


分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

xxxxwangchao

发表于 2018-2-26 14:40:44 | 只看该作者

发个TM1637的资料文件吧
4位数码管显示模块.zip (519.01 KB, 下载次数: 5)

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

本版积分规则

关闭

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