找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1612|回复: 1
收起左侧

STM32F103带键盘扫描接口的LED驱动控制程序

[复制链接]
ID:266546 发表于 2020-10-27 13:03 | 显示全部楼层 |阅读模式
TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。

单片机源程序如下:
  1. #include "TM1637.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "Buzzer.h"
  5. #include "SysTick.h"
  6. /** Write multiple bits in an 8-bit device register.
  7. * @param slaveAddr I2C slave device address
  8. * @param regAddr Register regAddr to write to
  9. * @param bitStart First bit position to write (0-7)
  10. * @param length Number of bits to write (not more than 8)
  11. * @param data Right-aligned value to write
  12. */
  13. static unsigned char temp;
  14. static unsigned char x=1;
  15. //unsigned char channel_1=1;
  16. unsigned char Enable_1;
  17. extern unsigned char channel;
  18. extern unsigned char NumDis[24],TIME[10],G_1,K1;
  19. extern int16_t cache[6],data[6];
  20. //__IO u32 Time_1;
  21. extern __IO u32 Total_time;
  22. void TM1637_Delay_us(unsigned  int Nus)
  23. {
  24. for(;Nus>0;Nus--)
  25.         {
  26.           __nop();
  27.         }
  28. }

  29. void TM1637_Start(void)
  30. {
  31.         TM1637_DIO_OUT();
  32.   TM1637_CLK (1);
  33.         TM1637_OUT_DIO1 = 1;
  34.         TM1637_Delay_us(2);
  35.         TM1637_OUT_DIO1 = 0;
  36.         TM1637_Delay_us(2);
  37.         TM1637_CLK ( 0);
  38. }
  39. void TM1637_Ack(void)
  40. {
  41.         TM1637_DIO_IN();
  42.   TM1637_CLK ( 0);
  43.         TM1637_Delay_us(5);
  44.         while(TM1637_READ_DIO1);
  45.         TM1637_CLK (1);
  46.         TM1637_Delay_us(2);
  47. }
  48. void TM1637_Stop(void)
  49. {
  50.         TM1637_DIO_OUT();
  51.         TM1637_CLK ( 0);
  52.         TM1637_Delay_us(2);
  53.         TM1637_OUT_DIO1 = 0;
  54.         TM1637_Delay_us(2);
  55.         TM1637_CLK (1);
  56.         TM1637_Delay_us(2);
  57.         TM1637_OUT_DIO1 = 1;
  58.         TM1637_Delay_us(2);
  59.         TM1637_CLK( 0);
  60.         TM1637_OUT_DIO1 = 0;
  61. }
  62. void TM1637_WriteByte(unsigned char oneByte)
  63. {
  64. unsigned char i;
  65.         TM1637_DIO_OUT();
  66.         for(i=0;i<8;i++)
  67.         {
  68.          TM1637_CLK(0);
  69.                 if(oneByte&0x01)
  70.                 {
  71.                         TM1637_OUT_DIO1 = 1;
  72.                 }
  73.                 else
  74.                 {
  75.                         TM1637_OUT_DIO1 = 0;
  76.                 }
  77.                 TM1637_Delay_us(3);
  78.                 TM1637_CLK(1);
  79.                 oneByte=oneByte>>1;
  80.         }
  81. }

  82. void TM1637_DisplayChar_1(unsigned char ch,unsigned char p)
  83. {
  84.         if(ch>23)ch=0;//防止数组越界
  85.         TM1637_Start();
  86.         TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
  87.         TM1637_Ack();
  88.         TM1637_Stop();
  89.         TM1637_Start();
  90.         
  91.         TM1637_WriteByte(0xC0+p);//0X00地址开始显示
  92.         TM1637_Ack();
  93.                
  94.         TM1637_WriteByte(NumDis[ch]);//显示
  95.         TM1637_Ack();
  96.         
  97.         TM1637_Stop();
  98.         TM1637_Start();
  99.         TM1637_WriteByte(0x8C);
  100.         TM1637_Ack();
  101.         TM1637_Stop();
  102.                
  103. }
  104. void TM1637_Display_1(void)
  105. {
  106.         unsigned char a=0,b=0,c=0,d=0;
  107.         if(cache[0]<0)
  108.         {
  109.                 d=((-cache[0])%60)%10;
  110.                 c=((-cache[0])%60)/10;
  111.                 b=((-cache[0])/60)%10;
  112.                 a=0x40;
  113.         }
  114.         else
  115.         {
  116.         d=(cache[0]%60)%10;
  117.         c=(cache[0]%60)/10;
  118.         b=(cache[0]/60)%10;
  119.         a=(cache[0]/60)/10;
  120.         }
  121.         TM1637_Start();
  122.         TM1637_WriteByte(0x40);//0x40则采用显示地址自加1模式
  123.         TM1637_Ack();
  124.         TM1637_Stop();
  125.         TM1637_Start();
  126.         TM1637_WriteByte(0xC0);//0X00地址开始显示
  127.         TM1637_Ack();
  128.                
  129.         TM1637_WriteByte(TIME[a]);//显示1
  130.         TM1637_Ack();
  131.         if(x==1)
  132.         {
  133.                 temp=TIME[b];
  134.                 x++;
  135.         }
  136.   temp^=0x80;  //10000000^11001111=01001111;01001111^10000000=11001111
  137.         TM1637_WriteByte(temp);//显示2和跳动的冒号
  138.         TM1637_Ack();
  139.         
  140.         TM1637_WriteByte(TIME[c]);//显示0
  141.         TM1637_Ack();
  142.                
  143.         TM1637_WriteByte(TIME[d]);//显示0
  144.         TM1637_Ack();
  145.                
  146.         TM1637_WriteByte(0xFF);
  147.         TM1637_Ack();
  148.                
  149.         TM1637_WriteByte(0xFF);
  150.         TM1637_Ack();
  151.         
  152.         TM1637_Stop();
  153.         TM1637_Start();
  154.         TM1637_WriteByte(0x8c);
  155.         TM1637_Ack();
  156.         TM1637_Stop();
  157. }

  158. void time_1(void)
  159. {
  160.         
  161.         if(x>=2)
  162.                         {
  163.                                                 if((Enable_1==1)&&(channel==0))
  164.                                                 {
  165.                                                                 G_1=1;
  166.                                                                 cache[0]--;
  167.                                                                 if(cache[0]<0)
  168.                                                                 {
  169.                                                                         if((-cache[0])>599)
  170.                                                                         {
  171.                                                                                 Enable_1=0;
  172.                                                                         }
  173.                                                                         K1=1;                                
  174.                                                                 }        
  175.                                                         }
  176.                                 x=1;
  177.                         }
  178. }

  179. void Digital_off_1(void)
  180. {
  181.         TM1637_Start();
  182.         TM1637_WriteByte(0x88);
  183.         TM1637_Ack();
  184.         TM1637_Stop();
  185.         
  186. }
复制代码
51hei.png
所有资料51hei提供下载:
TM1637.zip (1.92 KB, 下载次数: 34)
回复

使用道具 举报

ID:328014 发表于 2020-10-27 14:40 | 显示全部楼层
没有电路图啊 楼主能分享下电路吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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