1119|1

441

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【BIGTREETECH PI开发板】 驱动TM1638数码管 [复制链接]

 

这篇来测试下使用GPIO口驱动TM1638显示模块。

 

一、硬件部分

 

1.1、tm1638显示模块

 

1.2、模块电路图

 

1.3、模块和开发板连接

tm1638模块的3个控制脚连接带开发板的 PC8、PH4和PG11

 

二、程序

 

2.1、开发板的引脚表

https://bbs.eeworld.com.cn/thread-1249016-1-1.html这篇使用到了wiringPI库,在这里对应开发板修改对应的引脚

 

2.2、tm1638.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <wiringPi.h>


#define STB_PIN  27
#define CLK_PIN  26
#define DIO_PIN  24

#define dio_l()         digitalWrite (DIO_PIN, LOW)
#define dio_h()         digitalWrite (DIO_PIN, HIGH)

#define clk_l()         digitalWrite (CLK_PIN, LOW)
#define clk_h()         digitalWrite (CLK_PIN, HIGH)

#define stb_l()         digitalWrite (STB_PIN, LOW)
#define stb_h()         digitalWrite (STB_PIN, HIGH)


void TM1638_Init(void);
void disp_led(uint8_t *dat);
void TM1638_GpioInit(void);

uint8_t const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


int main (void)
{
    uint8_t dispdat[8];
    uint8_t i=0;
    uint32_t js=0;

	wiringPiSetup () ;
	TM1638_GpioInit();
    TM1638_Init();

    for(i=0;i<8;i++)
    {
        dispdat[i]=0;
    }

	for ( ;; )
	{
    if(js>9999)
    {
        js=0;
    }

    js++;

    dispdat[4]=js/1000;
    dispdat[5]=(js%1000)/100;
    dispdat[6]=((js%1000)%100)/10;
    dispdat[7]=((js%1000)%100)%10;
    disp_led(dispdat);
    printf("disp data = %d!\r\n",js);
    delay (100) ;		// mS
	}
	return 0;
}
                                                                              
void tm1638_WriteDat(uint8_t dat)                        
{
    uint8_t i;
    for(i=0;i<8;i++)
    {
            clk_l();
            if(dat&0X01)
            {
                dio_h();
            }        
            else
            {
                dio_l();
            }
            dat>>=1;
            clk_h();
    }
}

void tm1638_Write_cmd(uint8_t cmd)                 
{
    stb_l();
    tm1638_WriteDat(cmd);
    stb_h();
}

void tm1638_Write_Addr(uint8_t addr,uint8_t dat)                 
{
    tm1638_Write_cmd(0x44);
    stb_l();
    tm1638_WriteDat(0xc0|addr);     
    tm1638_WriteDat(dat);
    stb_h();
}

void tm1638_Write_LED(uint8_t LED_flag)                                         
{
    uint8_t i;
    for(i=0;i<8;i++)
    {
        if(LED_flag&(1<<i))
        {
            tm1638_Write_Addr(2*i+1,1);
        }
        else
        {
            tm1638_Write_Addr(2*i+1,0);
        }
    }
}

void TM1638_GpioInit(void)
{
    pinMode (STB_PIN, OUTPUT) ;
    pinMode (CLK_PIN, OUTPUT) ;
    pinMode (DIO_PIN, OUTPUT) ;               
}


void TM1638_Init(void)
{
    uint8_t i;
    TM1638_GpioInit();
    tm1638_Write_cmd(0x8b);
    tm1638_Write_cmd(0x40);
    stb_l();
    tm1638_WriteDat(0xc0);   
    for(i=0;i<16;i++)           
    {
        tm1638_WriteDat(0x00);
    }
    stb_h();
    for(i=0;i<8;i++)
    {
        tm1638_Write_Addr(i<<1,tab[0]);  
    }
}


void disp_led(uint8_t *dat)
{
    uint8_t i;
    for(i=0;i<8;i++)
    {
        tm1638_Write_Addr(i<<1,tab[dat[i]]);                    
    } 
}

 

2.3、编译程序

命令:biqu@BTT-CB1:/opt/wiringOP/examples$ sudo make tm1638

 

三、运行程序

 

3.1、执行运行程序

命令:biqu@BTT-CB1:/opt/wiringOP/examples$ sudo ./tm1638

 

3.2、运行视频

h616

 

最新回复

数码管的驱动一般都是实时刷新的,你这能拍到没有闪烁的时候也是挺幸运的   详情 回复 发表于 2023-7-8 23:22
点赞 关注
 
 

回复
举报

6483

帖子

9

TA的资源

版主

沙发
 

数码管的驱动一般都是实时刷新的,你这能拍到没有闪烁的时候也是挺幸运的

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表