找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6940|回复: 3
打印 上一主题 下一主题
收起左侧

关于 tm1629 的控制

[复制链接]
跳转到指定楼层
楼主
ID:167113 发表于 2017-3-3 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ****************************************************************************************************/  #include < REG52.h>  
  2. #include<stdio.h>  #include<intrins.h>//**************************************************************************************************  #define  tm1616  1
  3. #define tm1618  2
  4. #define tm1618a  3
  5. #define  tm1620  4
  6. #define  tm1620b 5
  7. #define  tm1623  6
  8. #define  tm1624   7
  9. #define  tm1626a  8
  10. #define  tm1626b 9
  11. #define  tm1626c  10
  12. #define  tm1626d  11
  13. #define  tm1628    12
  14. #define  tm1629    13
  15. #define  tm1629a   14
  16. #define  tm1629b  15
  17. #define  tm1629c   16
  18. #define  tm1629d   17
  19. #define  tm1638   18
  20. #define  tm1668   19
  21. #define tw1628    20  
  22. #define icmodel  tm1616  //这里选择的TM1616,更改“tm1616”可以得到其他型号IC的驱动程序
  23. #if icmodel== tm1616



  24. #define seg  7
  25. #define grid  4  
  26. #define  dismodel 1
  27. #elif icmodel== tm1618      
  28. #define seg 5  
  29. #define grid 7
  30. #define key 3  
  31. #define dismodel 4
  32. #elif icmodel== tm1618a   
  33. #define seg 7   
  34. #define grid 5   
  35. #define key 4   
  36. #define dismodel 2   
  37. #elif icmodel== tm1620      
  38. #define seg 8      
  39. #define grid 6   
  40. #define dismodel 3  
  41. #elif icmodel== tm1620b      
  42. #define seg6         
  43. #define grid7  
  44. #define key3
  45. #define dismodel 4
  46. #elif icmodel== tm1623         
  47. #define seg 11            
  48. #define grid 7   
  49. #define key 4   
  50. #define dismodel 4   
  51. #elif icmodel== tm1624      
  52. #define seg 11            
  53. #define grid 7  
  54. #define dismodel 4
  55. #elif icmodel== tm1626a               
  56. #define seg 10               
  57. #define grid 7   
  58. #define key 5   
  59. #define sw 2   
  60. #define led 6   
  61. #define dismodel 4   
  62. #elif icmodel== tm1626b                  
  63. #define seg 11                  
  64. #define grid 7      
  65. #define key 5      
  66. #define sw 4      
  67. #define led 6   
  68. #define dismodel 4  
  69. #elif icmodel== tm1626c                     
  70. #define seg 11                     
  71. #define grid 7         
  72. #define key 5        
  73. #define led 1  
  74. #define dismodel 4
  75. #elif icmodel== tm1626d                  
  76. #define seg 10                  
  77. #define grid 7      
  78. #define key 5     
  79. #define led 1   
  80. #define dismodel 4  
  81. #elif icmodel== tm1628                  
  82. #define seg 10                  
  83. #define grid 7   
  84. #define key 4  
  85. #define dismodel 4  
  86. #elif icmodel== tm1629


  87. #define seg 16                  
  88. #definegrid 8   
  89. #definekey 4  
  90. #definedismodel 1  
  91. #elif icmodel== tm1629a                  
  92. #defineseg 16                  
  93. #definegrid 8   
  94. #definedismodel 1  
  95. #elif icmodel== tm1629b                  
  96. #defineseg 14                  
  97. #definegrid 8  
  98. #definekey 4

  99. #definedismodel 1  
  100. #elif icmodel== tm1629c                  
  101. #defineseg 15                  
  102. #definegrid 8   
  103. #definekey 4  
  104. #definedismodel 1  
  105. #elif icmodel== tm1629d                  
  106. #defineseg 12                  
  107. #definegrid 8   

  108. #definekey 4  
  109. #definedismodel 1  
  110. #elif icmodel== tm1638                  
  111. #defineseg 10                  
  112. #definegrid 8   
  113. #definekey  4  
  114. #definedismodel 1  
  115. #elif icmodel== tm1668                  
  116. #define seg  10

  117. #definegrid 7   
  118. #definekey 5  
  119. #definedismodel 1  
  120. #elif icmodel== tw1628                  
  121. #defineseg 10                  
  122. #definegrid 7   
  123. #definekey 5  
  124. #define dismodel 1      
  125. #else   
  126. #error  "你必须确认IC的型号是否存在?"  
  127. #endif
  128. #define dissetmode 0x03  / /显示模式设置
  129. #define writedatamode_z 0x40  //采用地址自动加一方式写显存
  130. #define writeledmode_z 0x41  //采用地址自动加一方式写LED显存命令
  131. #define readkeymode 0x42  //读按键命令
  132. #define readswmode     0x43  //读SW口命令
  133. #define  writedatamode_g 0x44  //采用固定地址方式写显存
  134. #define writeledmode_g 0x45  //采用固定地址方式写LED显存命令
  135. #define startaddress 0xc0  //起始地址
  136. #define disconmode 0x8c  //显示控制
  137. #define datacount 2*grid   //采用地址自动加一方式传输数据的个数   
  138. //定义全局变量
  139. unsigned char  k1, k2, k3, k4, k5;   //按键值寄存器
  140. unsigned  da_sw;   //SW寄存器
  141. unsigned int  count;   
  142. //端口的定义
  143. sbit STB= P2^0;
  144. sbitCLK= P2^1;
  145. sbitDIO= P2^2; / /串行通讯口
  146. sbit SPEAK = P2^7;   //外接蜂鸣器,可以不必理会  
  147. //*********************************************子程序开始************************************




  148. //----------------------------------------------延时程序开始---------------------------------
  149. void delay(int k)
  150.   { unsigned char i,j;  
  151.     for(;k>0;k--)   
  152.     for(j=255;j>0;j--)  
  153.     for(i=255;i>0;i--);
  154.    }  
  155. / /----------------------------------------------延时程序结束----------------------------------  //----------------------------------------------写入输入1个字节(8bit)到LED_IC程序开始---------  
  156. //输入8BIT数据  
  157. //在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据
  158. void indate(unsigned char p)
  159.   {  unsigned int i;
  160.      STB=0;   //保证“STB”为低电平,程序不依赖于之前端口的状态  
  161.              //保证程序在实际运行中不会出现“端口迷失”
  162.     for(i=0;i<8;i++)
  163.     { CLK=0; //先将“CLK”清零
  164.       if((p& 0x01)!=0)   
  165.         { DIO=1; //需要传送的数据的低位为“1”,则把“DIO”清零
  166.      }else
  167.          {
  168.            DIO=0;  //需要传送的数据的低位为“0”,则把“DIO”置高
  169.           }
  170.      CLK=1;  //送时钟的上升沿
  171.      p=p>>1; //准备送下一个BIT } //送完一个字节后退出循环
  172.           }  
  173. / /----------------------------------------------写入输入1个字节(8bit)到LED_IC程序结束---------  //----------------------------------------------从LED_IC读入1个字节(8bit)程序开始-------------  
  174. //输出8BIT数据  
  175. //在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
  176. # ifdef key
  177. unsigned char outdate()
  178. { unsigned char i,k=0;   //i——控制循环次数,k——临时保存读到的数据
  179.       DIO=1;  //释放DIO为输入
  180.       STB=0;    //保证“STB”为低电平,程序不依赖于之前端口的状态  //保证程序在实际运行中不会出现“端口迷失”
  181.       for(i=0;i<8;i++)
  182.       { CLK=0; //先将“CLK”清零
  183.         k=k>>1;
  184.         if(( P2 & 0x04)==0)
  185.                {  
  186.                  k=k& 0x7f; //如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
  187.                 }
  188.         else
  189.                 {
  190.                    k=(k| 0x80& 0xff);  //如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
  191.                  }
  192.         CLK=1;  //送时钟的上升沿
  193.       }  //送完一个字节后退出循环
  194.      return(k); //返回读到的1字节数据
  195. }   
  196. #endif
  197. / /----------------------------------------------从LED_IC读入1个字节(8bit)程序结束-----------  //----------------------------------------------采用地址自动加一方式传输地址和数据开始------
  198. //采用地址自动加1方式






  199. //上电后LED-DRIVER显存中的数据是随机的,上电后马上传显示控制命令字(打开显示),会出现乱码。
  200. //为避免上述现象,用户可以先传显示控制命令将显示关掉(见应用手册中详细介绍),然后正常操作  
  201. //也可以先主动刷新LED-DRIVER显存中的数据。然后开显示  
  202. //这里采用是第二种方法
  203. void display(unsigned char disa)
  204. {
  205.    unsigned int i; //i——控制本次需要传多少个字节显示数据
  206.    DIO=1;CLK=1;
  207.    STB=1; //通讯开始前通讯端口全部初始化为“1”
  208.    indate( writedatamode_z);  //传数据设置命令,设置采用地址自动加1方式写显示数据,
  209.    STB=1; //数据设置命令传完后需要将“STB”置“1”
  210.    indate(startaddress);  //传起始地址  
  211.                          //地址命令传完后,“STB”保持为“0”继续传需要显示的数据
  212.    for(i=0;i<datacount;i++)
  213.        {
  214.          indate(disa);  //在连续传显示的数据过程中,“STB”一直保持为”0“
  215.         }
  216.        STB=1; //传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
  217.          indate(disconmode);  //传显示控制命令
  218.        STB=1;    //显示控制命令传完后将“STB”置“1”
  219. }  
  220. / /----------------------------------------------采用地址自动加一方式传输地址和数据结束-------  //----------------------------------------------采用固定地址方式传输地址和数据开始-----------  
  221. //采用固定地址方式
  222. void  display2(unsigned char adress,disa)
  223. {
  224.    DIO=1;
  225.    CLK=1;
  226.    STB=1;  //通讯开始前通讯端口全部初始化为“1”
  227.    indate( writedatamode_g); //数据设置命令
  228.    STB=1;
  229.    indate(adress); //传显示数据对应的地址
  230.    indate(disa); //保持“STB”=“0”,传1BYTE显示数据
  231.    STB=1; //传完显示数据后将“STB”置“1”
  232. }  
  233. / /----------------------------------------------采用固定地址方式传输地址和数据结束-------------  //----------------------------------------------按键扫描程序开始------------------------------  
  234. //按键扫描  //只要定义了key都将执行按键扫描程序,且必须从低字节开始读
  235. # ifdef key
  236. unsigned char keyscan()
  237. {
  238.   STB=1;
  239.   indate(readkeymode);    //传数据设置命令,设置为读按键  
  240.                          //“STB”保持为“0”,读键值  
  241.                         //将读到的键值保存在MCU的寄存器中      
  242.                        //根据IC型号读指定字节,不允许多读,否则会造成读按键不稳定
  243.   if(key >=1)  
  244.   k1=outdate();
  245.   if(key >=2)  
  246.   k2=outdate();
  247.   if(key >=3)  
  248.   k3=outdate();
  249.   if(key >=4)  
  250.   k4=outdate();
  251.   if(key >=5)  
  252.   k5=outdate();
  253.   STB=1;
  254.   return 0;     //读键结束将“STB”置“1”  
  255. }   
  256. #endif




  257. //----------------------------------------------按键扫描程序结束----------------------------------




  258. //----------------------------------------------PWM数据传输开始-----------------------------------
  259. # ifdef led
  260. unsigned char  in_led()
  261. {
  262.   STB=1;
  263.   indate( writeledmode_z);   //数据设置命令,设置为写LED显存
  264.   STB=1;
  265.   indate( 0xc0); //起始地址,这里的地址和
  266.   indate( 0x0f); //LED1宽度设置
  267.   indate( 0x0f); //LED2宽度设置
  268.   indate( 0x0f); //LED3宽度设置
  269.   indate( 0x00); //关闭LED123同步调节
  270.   indate( 0x0f); //LED4宽度设置
  271.   indate( 0x0f);    //LED5宽度设置
  272.   indate( 0x0f);    //LED6宽度设置
  273.   indate( 0x00); //关闭LED456同步调节
  274.   STB=1;
  275.   return 0;
  276.   }   
  277. #endif  //----------------------------------------------PWM数据传输结束-------------------------------------
  278. # ifdef led
  279. unsigned char  in_led_g(unsigned char  adress_led, da_led)
  280. {
  281.      STB=1;
  282.      indate( writeledmode_g);
  283.      STB=1;indate( adress_led);
  284.      indate( da_led);
  285.      STB=1;
  286.      return 0;
  287. }   #endif  
  288. //----------------------------------------------读入SW口状态开始------------------------------------
  289. # ifdef sw
  290. unsigned char  out_sw()
  291.   {
  292.      STB=1;
  293.      indate(readswmode);   //数据设置命令,设置为读SW输入口
  294.      d a_sw=outdate();
  295.      STB=1;
  296.      return 0;
  297.    }   
  298. #endif / /----------------------------------------------读入SW口状态结束-----------------------------------  //*********************************************子程序结束******************************************  //*********************************************主程序开始******************************************
  299. void main(void)
  300. {   
  301.     SPEAK=0;
  302.     DIO=1;
  303.     CLK=1;
  304.     STB=1;
  305.     indate(dissetmode); / /传显示模式设置命令,设置为7个“GRID”方式  
  306.          //这里不在详细给出多个显示模式的设置程序请参考产品应用手册,显示模式在上电设置好后不允许更改
  307.     STB=1;   
  308.     display( 0xff);   //全亮
  309.     delay(10);
  310.     display2( 0xC0, 0x00);  //采用固定地址方式向C0地址单元写00
  311.     delay(10);
  312.     #ifdef key






  313.      keyscan();  //调用按键扫描程序  
  314.   #endif  //本程序仅仅提供按键扫描,2次按键扫描的时间不得<10MS,在这里不提供按键处理程序  
  315.   #ifdef led  
  316.   in_led();   //6路PWM输出口输出"1"
  317.   delay(10);
  318.   in_led_g( 0xc0, 0x00);  //让LED1输出"0"
  319.   #endif      
  320.   #ifdef sw out_sw();    //调用读SW输入口程序  
  321.   #endif   //这里不提供SW口处理程序
  322.   _nop_();
  323. }   
  324. //*********************************************主程序结束*******************************************

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:167113 发表于 2017-3-3 17:52 | 只看该作者
请各位大神指导,想做个时钟
回复

使用道具 举报

板凳
ID:245466 发表于 2019-1-14 11:20 | 只看该作者
这个代码太好了,借了我燃眉之急!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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