【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
|