-
2021-07-28 13:55:34
TM1650可以节省单片机引脚驱动数码管利用时序图写出驱动程序。
void I2CStart(void)//开始信号 { CLK_H; DIO_H; Delay_us(5); DIO_L; } void I2Cask(void) //ACK信号 { u8 timeout = 1; CLK_H; Delay_us(5); CLK_L; while((DIO)&&(timeout<=100)) { timeout++; } Delay_us(5); CLK_L; } void I2CStop(void) //停止信号 { CLK_H; DIO_L; Delay_us(5); DIO_H; } void I2CWrByte(u8 oneByte) //写一个字节高位在前,低位在后 { u8 i; CLK_L; Delay_us(1); for(i=0;i<8;i++) { oneByte = oneByte<<1; DIO = CY; CLK_L; Delay_us(5); CLK_H; Delay_us(5); CLK_L; } } /****************数码管显示*****************/ void TM1650_Set(u8 add,u8 dat) { //写显存必须从高地址开始写 I2CStart(); I2CWrByte(add); //第一个显存地址 I2Cask(); I2CWrByte(dat); I2Cask(); I2CStop(); }
更多相关内容 -
TM1628_TM1628完整PDF资料及驱动程序_数码管芯片IIC_TM1628_areafi8_
2021-10-01 09:49:39数码管、按键驱动芯片,IIC通讯接口,极少的芯片管脚占用,附驱动软件3979086nan/20200115/41a7840567c9002a083cfa729f1ffe9c.zip -
STM32 TM1637数码管驱动程序
2020-09-17 21:04:56本例程基于STM32F103C8T6单片机,驱动了TM1637数码管进行0-9加点与不加点的数据显示。 -
STM32 TM1640驱动数码管例程
2021-08-02 00:43:53MCU型号是STM32F103C8T6;TM1640的SCLK接PA11,DIN接PA12。程序模板通过STM32CubeMX配置生成。可以实现对应位的数码管显示指定数字。例程是用八位数码管显示圆周率。 -
STM8单片机驱动TM1628的示例程序
2021-09-16 10:16:32STM8单片机驱动LED驱动芯片TM1628的示例程序,四位共阴数码管,显示“1234”,开发环境为IAR FOR STM8,程序代码如下: #include "iostm8s105s4.h>" #define uchar unsigned char #define uint unsigned int //...STM8单片机驱动LED驱动芯片TM1628的示例程序,四位共阴数码管,显示“1234”,开发环境为IAR FOR STM8,程序代码如下:
#include "iostm8s105s4.h>"
#define uchar unsigned char
#define uint unsigned int
//------显示任务变量定义-------------------------------------------------------
#define DIS_STB_H() (PE_ODR|=0x20) //SPI接口PE5
#define DIS_STB_L() (PE_ODR&=0xdf) //SPI接口
#define DIS_SCK_H() (PC_ODR|=0x04) //SPI接口PC2
#define DIS_SCK_L() (PC_ODR&=0xfb) //SPI接口
#define DIS_DIO_H() (PC_ODR|=0x08) //SPI接口PC3
#define DIS_DIO_L() (PC_ODR&=0xf7) //SPI接口
uchar Display_Value[4]={0,0,0,0};
const uchar DISP_TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0 ~ 9
const uchar DISP_POSITION[4]={0xc0,0xc2,0xc4,0xc6}; //显示地址/*********************************************
* 发送一字节数据到TM1628
*********************************************/
void TM1628_Send_Byte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
DIS_SCK_L();
if (dat & 0x01)
{
DIS_DIO_H();
}
else
{
DIS_DIO_L();
}
dat >>= 1;
DIS_SCK_H();
}
}/*********************************************
* 发送一字节命令到TM1628
*********************************************/
void TM1628_Send_Cmd(uchar dat)
{
uchar i;
DIS_STB_L();
for (i = 0; i < 8; i++)
{
DIS_SCK_L();
if (dat & 0x01)
{
DIS_DIO_H();
}
else
{
DIS_DIO_L();
}
dat >>= 1;
DIS_SCK_H();
}
DIS_STB_H();
DIS_DIO_H();
}/*********************************************
* 采用固定地址模式发送数据
*********************************************/
void Display_OneByte(uchar dat , uchar addr)
{
TM1628_Send_Cmd(0x03);//显示模式是7位10段
TM1628_Send_Cmd(0x44);//写数据到显示寄存器,固定地址模式
DIS_STB_L();
TM1628_Send_Byte(addr);//显示地址 STB下降沿时,默认第一个数据是命令
TM1628_Send_Byte(dat); //数据
DIS_STB_H();
TM1628_Send_Cmd(0x8f);//显示亮度设置,最亮
}/*********************************************
* 更新需显示内容
*********************************************/
void Updata_Display(uint indata)
{
Display_Value[0] = DISP_TAB[indata%10];
Display_Value[1] = DISP_TAB[(indata/10)%10];
Display_Value[2] = DISP_TAB[(indata/100)%10];
Display_Value[3] = DISP_TAB[indata/1000];
}/*********************************************
* 将数据发送给四位数码管
*********************************************/
void Display(void)
{
uchar num;
for(num=0;num<4;num++)
{
Display_OneByte(Display_Value[num] , DISP_POSITION[num]);
}
}/**********************************************************
* 初始化
**********************************************************/
void Display_Init()
{
PC_DDR |= 0x0c; // 配置PC端口的方向寄存器PC2/PC3输出
PC_CR1 |= 0x0c; // 设置PC2/PC3为推挽输出
PC_CR2 &= 0xf3;
PE_DDR |= 0x20; // 配置PE端口的方向寄存器PE5输出
PE_CR1 |= 0x20; // 设置PE5为推挽输出
PE_CR2 &= 0xdf;
DIS_STB_H();
DIS_DIO_L();
DIS_SCK_L();
}void CLK_Init(void)
{
CLK_ECKR=0x03;//外部时钟寄存器 外部时钟准备就绪,外部时钟开
CLK_SWCR=0x02;//切换控制寄存器 使能切换机制
CLK_SWR=0xB4;//主时钟切换寄存器 选择HSE为主时钟源
while (!(CLK_SWCR & 0x08));
//Wait for switch done 该语句如果没有则不能切
//换成功,在仿真时使用内部时钟,停止仿真时,切换到外部时钟,但重新上电或复位后
//又回到内部时钟状态(Debug模式)
CLK_CSSR=0x01;//时钟安全系统寄存器
}void Delay_ms( uint ms )
{
uint i,j;
for( j=0; j<ms; j++ )
{
for( i=0; i<1000; i++ )
{;}
}
}void main( void )
{
Delay_ms(200);
CLK_Init();
Display_Init();
Updata_Display(1234); //四位数码管显示1234
Display();
while(1)
{}
} -
TM1650LED数码管驱动
2019-04-28 09:48:53TM1650LED数码管驱动,STM8S105 通过模拟IIC控制TM1650显示,按键获取 -
TM1628_TM1628_
2021-10-02 00:26:12TM1628驱动 显示任意数字 C51 -
TM1620_worsezet_TM1620数码管驱动_tm1620编程_tm1620数码管_Tm1620_
2021-09-30 00:22:06TM1620 数码管驱动 4位LED数码管 -
stc8系列的 tm1650数码管驱动亲测可用
2021-07-24 18:31:34stc8系列的 tm1650数码管驱动亲测可用 -
数码管驱动芯片TM1616 TM1618 TM1620驱动代码.zip
2020-08-11 14:36:05数码管驱动芯片TM1616 TM1618 TM1620驱动代码TM16XX通用驱动,STM32驱动代码 -
数码管驱动TM1640驱动程序
2018-05-27 21:17:41针对研究数码管显示的初学者,本资源包含了TM1640-16位8段数码管的驱动程序代码,有助于初步学习如何驱动数码管显示 -
基于stm8s的tm1628驱动程序
2019-01-22 12:16:49本文档是基于TM1628驱动LED灯的演示程序,采用C语言编写,主控是stm8s系列,本程序主要是完成驱动显示的功能,以及各函数的接口,和stm8s的一些初始化程序 -
TM1652.C 数码管显示驱动程序
2020-09-01 10:57:00STC15W401AS驱动TM1652程序,方便移植,简单明了。波特率19200bps。!!!!!!!!!!!!! -
TM1637数码管资料及例程
2018-09-12 20:33:35TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。主要应用于电磁炉、微波炉及小家电产品的... -
4位数码管显示模块 LED亮度可调带时钟点 TM1637驱动 595驱动程序
2019-04-28 09:37:034位数码管显示模块 LED亮度可调带时钟点 TM1637驱动 595驱动程序 包括计数功能 置数功能 清零功能 -
TM1638驱动数码管的一点建议,附程序
2022-02-11 01:11:21年过完了,首先祝大家开工大吉! TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不...年过完了,首先祝大家开工大吉!
TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫描显示了。使用方便,价格也便宜。
最近一个项目用到它,没详细看数据手册,只是按照数据手册给的共阳极的原理图画了电路。
然而板子做好了写程序时发现,它的寄存器是按照共阴极数码管的方式定义的。驱动共阴极数码管,只需要写1个或2个(如果用到SEG9和SEG10)寄存器即可,寄存器的8位对应一个数码的8段,非常简单,如下:
然而,驱动共阳极数码管,则需要写8个或16个(如果用到SEG9和SEG10)寄存器。而且还需要根据自己的电路图进行行列的转换,移位操作。程序上,比共阴极的驱动方式要复杂很多。
无奈,板子已经做好了,只能按照共阳极的写程序,下面是我写的共阴极寄存器转换为共阳极显示的程序。
void Convert() { uint8_t Temp; uint8_t i,j,k; for(i=0; i<8; i++) //8个寄存器 { Temp = Disp_Cathode_Reg[i];//共阴极寄存器 for(j=0; j<16; j+=2) //8个寄存器移位 { Disp_Anode_Reg[j] = Disp_Anode_Reg[j]>>1; } for(j=0; j<8; j++) //8位 { k=j<<1; if(Temp&0x01) { Disp_Anode_Reg[k] |= 0x80; } else { Disp_Anode_Reg[k] &= 0x7F; } Temp = Temp>>1; } } for(i=0; i<16; i+=2) //8个寄存器 { Disp_Anode_Reg[i+1] = Disp_Anode_Reg[i]>>5; Disp_Anode_Reg[i] = Disp_Anode_Reg[i]<<3; } }
共阴极的方式最多可驱动8位x10段的数码管,而共阳极可驱动10位x8端的数码管。这里给大家提个醒,电路尽量要按照共阴极的方式设计,写程序方便。如果数码管位数大于8位,必须按照共阳极的方式设计,也要尽量按照顺序去设计数码管的位和段,这样程序做转换时逻辑也简单一些。
最后附上完整驱动程序,仅供参考。(公众号不支持外部链接,请复制到浏览器打开)
链接:https://pan.baidu.com/s/1DCSW039uw8n4ugY5dLntZg
提取码:bpka
推荐阅读:
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
-
TM1680驱动程序(51单片机,15 单片机)
2021-07-20 09:39:24TM1680驱动程序(51单片机,15 单片机) -
TM1640共阳数码管驱动源码
2018-12-22 10:44:55TM1640两线驱动,使用共阴驱动编码,转换成共阳驱动。所以在本代码内,能看到共阴的驱动编码。供学习参考。 -
tm1629 驱动控制程序_tm1629_
2021-09-29 17:38:14TM1629驱动程序,在C51单片机上实现的例程 -
stm32驱动三位多位数码管程序
2021-09-30 17:52:16通过按键计数在数码管上面操作,还可以设置自动计数 -
STM32 TM1628程序
2018-07-11 16:15:41/*************************************函数名称:Tm1628_Write_Bit函数说明:写单个字节函数参数:命令参数函数返回:NULL*************************************/void Tm1628_Write_Bit(uint8_t data){ uint8_t i...以下是.C
#include "tm1628.h"
/*************************************
函数名称:Tm1628_Write_Bit
函数说明:写单个字节
函数参数:命令参数
函数返回:NULL
*************************************/
void Tm1628_Write_Bit(uint8_t data)
{
uint8_t i;
Tm1628_CKL_H;
Tm1628_DIO_H;
for(i = 0; i < 8; i++)
{
Tm1628_CKL_L;
delay_us(100);
if((data & 0x01) == 1)
Tm1628_DIO_H;
else
Tm1628_DIO_L;
data = data >> 1;
Tm1628_CKL_H;
delay_us(100);
}
}
/*************************************
函数名称:Tm1628_Write_Command
函数说明:写命令
函数参数:命令参数
函数返回:NULL
*************************************/
void Tm1628_Write_Command(u8 unm)
{
Tm1628_STB_L;
delay_ms(1);
Tm1628_Write_Bit(unm);
Tm1628_STB_H;
delay_ms(1);
}
/*************************************
函数名称:Tm1628init
函数说明:TM1628初始化
函数参数:NULL
函数返回:NULL
*************************************/
void Tm1628init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; //LB6-->PB8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为10MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB6 - 8
Tm1628_Write_Command(0x03); //7位10段
Tm1628_ClearDisplay(); //清屏
Tm1628_GrayScale(2); //亮度2
Tm1628_Fixed(0xc2,0xff);
}
/*************************************
函数名称:Tm1628_Fixed
函数说明:固定写显示
函数参数:(1)data 地址
(2)add 数据
函数返回:NULL
*************************************/
void Tm1628_Fixed(uint8_t data, uint8_t add)
{
Tm1628_Write_Command(0x44);
Tm1628_STB_L;
delay_ms(1);
Tm1628_Write_Bit(data);
Tm1628_Write_Bit(add);
Tm1628_STB_H;
delay_ms(1);
}
/*************************************
函数名称:Tm1628_Continuous
函数说明:连续写显示
函数参数:(1)data 地址 从C0开始
(2)num 数据
(3)add 数量 最大14
函数返回:NULL
*************************************/
void Tm1628_Continuous(uint8_t data, uint8_t num, uint8_t *add)
{
uint8_t i;
Tm1628_Write_Command(0x40);
Tm1628_STB_L;
delay_ms(1);
Tm1628_Write_Bit(data);
for(i = 0; i < num; i++)
{
Tm1628_Write_Bit(add[i]);
}
Tm1628_STB_H;
delay_ms(1);
}
/*************************************
函数名称:Tm1628_ClearDisplay
函数说明:清屏
函数参数:NULL
函数返回:NULL
*************************************/
void Tm1628_ClearDisplay(void)
{
uint8_t i;
Tm1628_Write_Command(0x40);
Tm1628_STB_L;
delay_ms(1);
Tm1628_Write_Bit(0xC0);
for(i = 0; i < 14; i++)
{
Tm1628_Write_Bit(0x00);
}
Tm1628_STB_H;
delay_ms(1);
}
/*************************************
函数名称:Tm1628_GrayScale
函数说明:用于亮度调节 0 - 9
函数参数:亮度 0 - 9
函数返回:NULL
*************************************/
void Tm1628_GrayScale(uint8_t data)
{
switch(data)
{
case(0): Tm1628_Write_Command(GrayScale_ON); break;
case(1): Tm1628_Write_Command(GrayScale1); break;
case(2): Tm1628_Write_Command(GrayScale2); break;
case(3): Tm1628_Write_Command(GrayScale3); break;
case(4): Tm1628_Write_Command(GrayScale4); break;
case(5): Tm1628_Write_Command(GrayScale5); break;
case(6): Tm1628_Write_Command(GrayScale6); break;
case(7): Tm1628_Write_Command(GrayScale7); break;
case(8): Tm1628_Write_Command(GrayScale8); break;
}}
以下是.h
#ifndef __TM1628_H
#define __TM1628_H
#include "sys.h"
#include "delay.h"
#define Tm1628_CKL_H GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET)
#define Tm1628_CKL_L GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET)
#define Tm1628_DIO_H GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET)
#define Tm1628_DIO_L GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_RESET)
#define Tm1628_STB_H GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET)
#define Tm1628_STB_L GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET)
#define GrayScale_OFF 0x80 //关显示
#define GrayScale_ON 0x81 //开显示
#define GrayScale1 0x88 //灰度等级1
#define GrayScale2 0x89 //灰度等级2
#define GrayScale3 0x8A //灰度等级3
#define GrayScale4 0x8B //灰度等级4
#define GrayScale5 0x8C //灰度等级5
#define GrayScale6 0x8D //灰度等级6
#define GrayScale7 0x8E //灰度等级7
#define GrayScale8 0x8F //灰度等级8
void Tm1628init(void); //TM1628初始化
void Tm1628_Fixed(uint8_t data, uint8_t add); //固定写显示 data 地址 add 数据
void Tm1628_Continuous(uint8_t data, uint8_t num, uint8_t *add); //连续写显示
void Tm1628_ClearDisplay(void); //清屏
void Tm1628_GrayScale(uint8_t data); //亮度调节#endif
楼主是新萌 之前想直接找一篇 代码拔下来 后来发现没有 就自己写了写 函数实测能用
-
TM1640 含51主程序带电路图 驱动共阳5位7断数码管
2021-02-27 19:41:41TM1640 含51主程序带电路图 驱动共阳5位7断数码管 -
TM1638驱动数码管的arduino和51单片机源程序与电路图
2021-08-01 03:51:28#define DATA_COMMAND 0X40#define DISP_COMMAND 0x80#define ADDR_COMMAND 0XC0//TM1638模块引脚定义int DIO = 2;int CLK = 1;int STB = 0; //这里定义了那三个脚//共阴数码管显示代码unsigned c... -
基于STM32+TM1638芯片的共阳极数码管驱动程序
2020-01-10 13:21:281,基于STM32+TM1638芯片的共阳极数码管驱动程序,可同时驱动8个数码管,函数封装很好,使用时只需要调用函数,参数为每个数码管需要显示的数字即可 2,亲测有效,有疑问可在下面评论 -
ds3231+stm32+TM1640驱动数码管程序
2016-03-29 23:23:59给老妈做了个电子表,用DS3231+STM32做的,结果DS3231资源非常少,憋了好几天才整出来,目前运行良好,据说DS3231精度超级高啊。 -
TM1640数码管驱动+电路
2021-02-06 20:00:18TM1640数码管驱动芯片:驱动程序、电路图。 TM1640最多可驱动16个数码管。 TM1640数码管驱动芯片:驱动程序、电路图。 TM1640最多可驱动16个数码管。 -
TM1640数码管驱动程序
2016-05-01 23:38:55TM1640数码管驱动程序 -
TM1652_V1.0_TM1652驱动_TM1652数码管_TM1652_
2021-10-03 05:18:18数码管显示驱动芯片,tm1652,串口驱动 -
数码管驱动芯片TM1637的51程序
2013-06-05 21:20:42这个是数码管驱动,2个IO口驱6位数码管,而且同时还能外接12个按键 -
STM32F103单片机使用TM1637芯片驱动4位数码管
2020-12-23 09:08:21在STM32F103C8T6最小系统上驱动 TM1637四位数码管显示模块