找回密码
 注册
关于网站域名变更的通知
查看: 215|回复: 2
打印 上一主题 下一主题

LED驱动芯片(TM1650)的C51单片机程序例程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-13 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
相信大家刚学习单片机的时候都用过数码管,那时候的数码管都是用单片机的IO口直接驱动的,用软件进行动态刷新,但是这样控制数码管是很占用单片机外部资源的,单片机的外部资源也是有限的,不能全部IO口来进行数码管的驱动吧!!那有没有专门的驱动芯片驱动呢?答案是有的,他就是LED驱动芯片,这里就以天微电子TM1650来做讲解吧!
2 e* ]6 c8 o" ~0 o4 m# W# L  l2 {3 X/ X. w4 l8 [$ P
首先TM1650是IIC通讯协议的,没错他只要两个单片机IO口就能控制4位数码管的显示,分别是SCL(时钟线)和SDA(数据线)进行数据的传输4 v% z9 v( f' i& q0 t4 y
6 O6 q4 }# T. x" C" R
/ y, h& _, b$ L- v: Y4 \+ {: h  U
IIC串口协议; T. t" W# g4 ]% M4 B+ B2 y
开始信号:保持 SCL 为“1”电平,SDA 从“1”跳“0” ,认为是开始信号 ' y6 g8 V* G6 ]6 a. U* Q
结束信号:保持 SCL 为“1”电平,SDA 从“0”跳“1” ,认为是结束信号
6 m2 }, d4 d) g( b应答:如果本次通讯正常,芯片在串行通讯的第 8 个时钟下降沿后,TM1650 主动把 SDA 拉低。直到检& V9 o0 d- \% f  W; L7 V
测到 SCL 来了上升沿,SDA 释放为输入状态
/ C+ x4 ^8 b5 s0 A% |. e& K! O9 O# r' |, s7 R( E% E0 c4 o
; L9 p9 i) G4 s. `
我这里用的是单片机硬件IIC时序,你也可以用软件来进行模拟时序
4 N; e$ I! t, A, G+ C$ f1 v以下是驱动程序:
  • #include "main.h"
  • uint8_t code Num_Buff[16]={ //数码管共阴真值表0-F
  •         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
  • };
  • extern void Dis_IIC_Init(void);
  • extern void Dis_Write_NumData(uint16_t NumDat);
  • extern void DisPlay_ON(void);
  • extern void DisPlay_OFF(void);
  • extern void Dis_Write(uint8_t ADD,uint8_t Dat);
  • extern void Dis_Write_ERRData(uint8_t ERR_Num);
  • DisPlay_t DisPlay =
  • {
  •         0,
  •         0,
  •         Dis_IIC_Init,
  •         Dis_Write_NumData,
  •         DisPlay_ON,
  •         DisPlay_OFF,
  •         Dis_Write,
  •         Dis_Write_ERRData
  • };
  • //硬件IIC初始化
  • static void Dis_IIC_Init()
  • {
  •         P_SW2 = 0xB0;     //IIC引脚切换至P32,P33引脚及使能特殊功能寄存器(XFR)
  •         IP2 = 0x40;              //设置优先级为较低级优先级,定时器0为最低级优先级,IIC优先级高于定时器0优先级
  •         IP2H = 0x00;      //设置优先级为较低级优先级,定时器0为最低级优先级,IIC优先级高于定时器0优先级
  •         I2CCFG &= 0x00;   //清零
  •         I2CCFG |= 0xC2;   //使能IIC功能,主机模式,8分频,总线速度=FOSC/2/(分频系数*2+4)
  •         I2CMSCR &= 0x00;  //清零
  •         I2CMSCR |= 0x80;  //使能IIC主机模式中断
  • }
  • //起始信号
  • static void IIC_Start()
  • {
  •         DisPlay.IIC_Send_Time = TRUE;
  •         I2CMSCR |= 0x81;
  •         while(DisPlay.IIC_Send_Time);
  • }
  • //发送停止
  • static void IIC_Stop()
  • {
  •         DisPlay.IIC_Send_Time = TRUE;
  •         I2CMSCR |= 0x86;
  •         while(DisPlay.IIC_Send_Time);
  • }
  • //发送应答
  • static void IIC_ACk()
  • {
  •         DisPlay.IIC_Send_Time = TRUE;
  •         I2CMSCR |= 0x83;
  •         while(DisPlay.IIC_Send_Time);
  • }
  • //发送一个字节
  • static void IIC_Write_Byt(uint8_t d)
  • {
  •         I2CTXD = d;
  •         DisPlay.IIC_Send_Time = TRUE;
  •         I2CMSCR |= 0x82;
  •         while(DisPlay.IIC_Send_Time);
  • }
  • //发送数据操作
  • static void Dis_Write(uint8_t ADD,uint8_t Dat)
  • {
  •         IIC_Start();
  •         IIC_Write_Byt(ADD);
  •         IIC_ACk();
  •         IIC_Write_Byt(Dat);
  •         IIC_ACk();
  •         IIC_Stop();
  • }
  • static void DisPlay_ON()
  • {
  •         Dis_Write(0x48,0x41);  //0x41为四级亮度,8段码显示方式,开显示
  • }
  • static void DisPlay_OFF()
  • {
  •         Dis_Write(0x48,0x40);  //关显示
  • }
  • //数据显示处理函数
  • static void Dis_Write_NumData(uint16_t NumDat)
  • {
  • //        Dis_Write(0x48,0x41);  //0x41为四级亮度,8段码显示方式,开显示
  •         Dis_Write(0x68,Num_Buff[NumDat/100%10]);   //取出显示百位
  •         if(DisPlay.Therm_Fa == 0)
  •         {
  •                 Dis_Write(0x6A,Num_Buff[NumDat/10%10]+0x80);    //取出显示十位
  •                 Dis_Write(0x6C,Num_Buff[NumDat%10]&0x7F);       //取出显示个位
  •         }
  •         else
  •         {
  •                 Dis_Write(0x6A,Num_Buff[NumDat/10%10]&0x7F);    //取出显示十位
  •                 Dis_Write(0x6C,Num_Buff[NumDat%10]+0x80);       //取出显示个位
  •         }
  • }
  • static void Dis_Write_ERRData(uint8_t ERR_Num)
  • {
  •         Dis_Write(0x68,Num_Buff[14]);
  •         Dis_Write(0x6A,Num_Buff[ERR_Num]&0x7F);
  •         Dis_Write(0x6C,0x00);
  • }
  • //I2C中断服务函数
  • void IIC_interrupt() interrupt 24
  • {
  •         if(I2CMSST & 0x40)
  •         {
  •                 I2CMSST &= 0xBF;  //清除中断标志位
  •                 DisPlay.IIC_Send_Time = FALSE;
  •                 I2CMSCR &= 0x80;  //除了最高不变,其他位清零,为下次发送做准备
  •         }
  • }* L6 {, o  c0 b! ^: P
8 B9 q% ?6 q! R8 V+ o. N7 m

+ x3 @8 e! M3 E6 ]. D, Z4 r  q& U

该用户从未签到

2#
发表于 2022-9-13 13:06 | 只看该作者
多多说一些自己的实际经验,相关知识

该用户从未签到

3#
发表于 2022-9-13 13:49 | 只看该作者
希望在这论坛里,可以取得很大的收获。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-5 13:55 , Processed in 0.062500 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表