找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1000|回复: 2
收起左侧

stc8G1K单片机驱动TM1620彩色数码模块程序

[复制链接]
ID:369412 发表于 2023-10-20 16:59 | 显示全部楼层 |阅读模式
  1. /* TM1620显示控制芯片
  2. * File:      TM1620.c
  3. * Author:  
  4. * Date:      
  5. *
  6. * 显示屏内容:
  7. * 2.5位数字1,2,3位+0小数点+8个ICON
  8. *
  9. * 彩膜测试演示
  10. */

  11. #include <reg51.h>
  12. #include <intrins.h>

  13. /***************************
  14. *
  15. *
  16. *

  17. ****************************/

  18. #define u8 unsigned char                                             
  19. #define u16 unsigned int

  20. sbit STB=P1^4;
  21. sbit CLK=P1^3;
  22. sbit DIO=P1^2;

  23. sfr P1M0 = 0x92;        //
  24. sfr P1M1 = 0x91;        //
  25. sfr P3M0 = 0xB2;        //
  26. sfr P3M1 = 0xB1;        //

  27. sbit LED=P2^7;
  28. sbit KEY=P3^2;                //TP_FLAG 重合声明
  29. sbit KEYU=P3^0;                // 亮度++
  30. sbit KEYD=P3^1;                // 亮度--
  31.                   /*0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11, */  
  32. u8 code  NUM[] = { 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0xff, };
  33. /*
  34. u8 code  dat[] = { 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6, };
  35. u8 code  NUM[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0xff, };  
  36. u8 code ICON[] = { 0x80,0x80,0x80,0xff,0x3f, };
  37. u8 Key_value;
  38. */
  39. u8 DDRAM[12] ;
  40. u8 CRT;        // 当前亮度参数值
  41. void get_key(void);        // 按键更改亮度
  42. void delayus(u8 t)
  43. {
  44.         while(t--);
  45. }
  46. //=============1MS======================//   
  47. void delayms(u16 temp)   
  48. {   
  49.     unsigned int i,j;   
  50.     for(j=temp;j>0;j--)   
  51.     {
  52.             for(i=0;i<1000;i++)  ;
  53.         }
  54.         LED=~LED;            
  55.         get_key();
  56. }   

  57. void send_data(u8 dat)  
  58. {                                                                        
  59.     u8 i;
  60.     for(i=0;i<8;i++)                                                     
  61.     {                                                                    
  62.         CLK=0;
  63.         DIO = dat & 1;
  64.                 delayus(20);
  65.         CLK=1;     
  66.         dat=dat>>1;  
  67.                 delayus(20);
  68.     }
  69.    
  70. }
  71. /*
  72. void write_cmd(u8 cmd)
  73. {
  74.         STB = 0;
  75.         send_data(cmd);
  76.         STB = 1;
  77. }
  78. void write_dat(u8 addr,u8 dat)
  79. {
  80.         STB = 0;
  81.         send_data(addr);        // C0H~CBH
  82.         send_data(dat);                //
  83.         STB = 1;
  84. }

  85. */
  86. void updata_TM1620(void)
  87. {
  88.         u8 i;
  89.         STB = 0;
  90.     send_data(0x02);// 写入命令0x02:显示模式6位8段
  91.     STB = 1;
  92.         STB = 0;
  93.     send_data(0x40);// 写入命令0x40:数据命令 固定地址0x44,地址自动增加0x41/42/43
  94.     STB = 1;
  95.         STB = 0;
  96.         send_data(0xc0);// 写入命令0xc0:显示地址
  97.         for(i=0;i<12;i++)
  98.         {
  99.                 send_data(DDRAM[i]);
  100.         }
  101.         STB=1;
  102.         delayus(20);
  103.         STB = 0;
  104.     send_data(CRT);// 写入命令0x8c:显示控制
  105.         STB = 1;
  106. }

  107. void init_TM1620(void)
  108. {
  109.         u8 i;
  110.         delayus(100);
  111.         for(i=0;i<12;i++)
  112.         {
  113.                 DDRAM[i] = 0;
  114.         }
  115.         updata_TM1620();
  116. }


  117. void dis_num(u8 addr,u8 num)        // addr = 1,2,3,4,5,6
  118. {
  119.        
  120.         DDRAM[addr *2 -2] = NUM[num] ;
  121.         updata_TM1620();
  122. }

  123. void dis_icon(u8 addr,u8 icon)        // addr = 3,4,5,6
  124. {                                                                                        // icon = 1,2
  125.         addr = addr *2 -2 ;
  126.         if (icon==1)
  127.                 DDRAM[addr] = 0x1c ;        //左右单独显示
  128.         else if (icon==2)
  129.                 DDRAM[addr] = 0xe0 ;        //左右单独显示
  130.         else if (icon==3)       
  131.                 DDRAM[addr] = 0xfc ;        // 全显
  132.         else if(icon==4)
  133.                 DDRAM[addr] = 0x18 ;        // %
  134.         updata_TM1620();
  135.         delayms(500);
  136. }

  137. void dis_clr(u8 dat)
  138. {
  139.         u8 i;
  140.         for(i=0;i<12;i++)
  141.         {
  142.                 DDRAM[i] = dat;
  143.         }
  144.         updata_TM1620();
  145. }
  146. void get_key(void)
  147. {
  148.         u8 i,t;
  149.         t=CRT; // 保存原始值
  150.         if(KEYU==0)
  151.         {
  152.                 for(i=0;i<50;i++);        // 延时去抖
  153.                 if(KEYU==0)
  154.                 {
  155.                         while(!KEYU);
  156.                         if(CRT<0x90)
  157.                                 CRT++;
  158.                 }
  159.                 for(i=0;i<50;i++);        // 延时去抖
  160.         }
  161.         if(KEYD==0)
  162.         {
  163.                 for(i=0;i<50;i++);        // 延时去抖
  164.                 if(KEYD==0)
  165.                 {
  166.                         while(!KEYD);
  167.                         if(CRT>0x80)
  168.                                 CRT--;
  169.                 }
  170.                 for(i=0;i<50;i++);        // 延时去抖
  171.         }
  172.         if(t!=CRT)        // CRT值有改动则保存
  173.         {
  174.                 iap_erase(0);
  175.                 write_eeprom(0,CRT);
  176.         }
  177. }

  178. void int0_isr() interrupt 0
  179. {
  180.         u8 i;
  181.         EX0 = 0;
  182.         for(i=0;i<150;i++);        // 延时去抖
  183.         if(!KEY)        //有效按下
  184.         {
  185.                 KEY = 1 ;
  186.                 for(i=0;i<150;i++);
  187.                 while(!KEY);        //等待放手
  188.                
  189.                 while(KEY);        //二次按键
  190.                
  191.                 while(!KEY);        //等待放手
  192.         }
  193.         EX0 = 1 ;
  194. }

  195. // **********************
  196. // **** MAIN()***********
  197. // **********************
  198. void main(void)                                                              
  199. {   
  200.         u8 i;
  201.         u8 I[] = {2,5,8};
  202.         delayms(200);
  203.         P1M1 = 0x00;        //P1口推挽输出
  204.         P1M0 = 0xff;
  205.         P3M1 = 0x00;        //P3口双向
  206.         P3M0 = 0x00;
  207.        
  208.         //CRT = read_eeprom(0);        // 读亮度值
  209.         ////if(CRT>0x8f || CRT< 0x80)        // 亮度值限制在80H~8FH之间
  210.         //{
  211.         //        CRT = 0x8c;
  212.         //}
  213.         EA = 1;        //开总中断
  214.         EX0 = 1;//开外中断0
  215.        
  216.         init_TM1620();        //
  217.                
  218.         dis_clr(0);
  219.         i = 0;
  220.         while(1)   
  221.         {
  222.                 init_TM1620();        //
  223.        
  224.                 dis_clr(0);       
  225.                 delayms(100);
  226.                
  227.                 dis_clr(0xff);                       
  228.                 delayms(1000);
  229.                
  230.                 dis_clr(0);
  231.                 delayms(100);
  232.                
  233.                 dis_num(1,I[i]);        // 位1 显示5
  234.                 dis_num(2,I[i]);        // 位2 显示5
  235.                
  236.                 dis_icon(3,2);        // 位3 显示min
  237.                 dis_icon(3,4);        // 位3 显示%
  238.                
  239.                 dis_icon(4,1);        // 位4 显示右
  240.                 dis_icon(4,2);        // 位5 显示左
  241.                 dis_icon(4,3);        // 位5 全显
  242.                
  243.                 dis_icon(5,1);        // 位5 显示右
  244.                 dis_icon(5,2);        // 位5 显示左
  245.                 dis_icon(5,3);        // 位5 全显
  246.                
  247.                 dis_icon(6,1);        // 位6 显示右
  248.                 dis_icon(6,2);        // 位6 显示左
  249.                 dis_icon(6,3);        // 位6 他显
  250.                
  251.                 delayms(500);
  252.                 i++;
  253.                 if(i==3)
  254.                         i=0;
  255.                
  256.         }  
  257. }   


复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:50577 发表于 2023-10-22 00:32 | 显示全部楼层
有没有51单片机modbus rtu的通信程序
回复

使用道具 举报

ID:50577 发表于 2023-10-22 00:31 | 显示全部楼层
有没有51modbus rtu的通信
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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