找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制模块,彻底理解单片机TM1621D段码液晶并点亮 附程序

  [复制链接]
跳转到指定楼层
楼主
手头有坏电子秤的段码液晶,从网上买的段码液晶屏带有TM1621D。TM1621D与HT1621结构相同,只是引脚少,段码少但容易业余制作。正好利用这两种材料,自制段码液晶模块,并用普中开发板调试通过。

程序来自网上修改,权力归原创作者所有。


连接TM1621D模块,
程序编译后HEX文件下载到单片机
关掉下载程序,打开串口调试助手,设置4800波特率,
数据位8停止位1,无校验无流控制,
勾选HEX发送,输入80-8F之间的数据,显示地址0-F。
输入数据0d-16,1602显示SEG数字,TM1621
对应段点亮。
注意5v电压下程序BASE选1/2.选1/3全亮。
3v选1/3BASE
COM误接成SEG,开机初始化即显示88。
背光限流电阻1K,白天亮度略低。
VLCD电阻选10k.
段码每位由两个地址构成,每个地址4位数据(4段)
用串口调试助手发送必须输成两位
80(数据)0b-16(可串发)选定时发送10ms/次
清零:800b0c0d0e0f10111213141516
先81,再输入0b-16中的任意数字,显示对应段。
82
84
88
测试段
全显示:8f0b0c0d0e0f10111213141516

单片机源程序如下:
  1. /*-****************************************
  2. 名称:TM1621
  3. ******************************************/
  4. #include "TM1621.h"
  5. #include<reg52.h>
  6. #include "intrins.h"                                         //包含nop指令头文件
  7. #define uchar unsigned char                                 //数据类型宏定义
  8. #define uint unsigned int                                 //数据类型宏定义
  9. #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义
  10. /******************以下TM1621模块命令定义*********************/
  11. #define SYSDIS   0x00         //关系统振荡器和LCD偏压发生器
  12. #define SYSEN    0x02    //打开系统振荡器

  13. #define LCDOFF   0x04     //关LCD偏压
  14. #define LCDON    0x06     //开LCD偏压

  15. #define TONEON   0x12     //打开声音输出
  16. #define TONEOFF  0x10     //关闭声音输出

  17. #define XTAL     0x28     //外部接晶振
  18. #define RC       0x30     //内部RC振荡

  19. #define BIAS     0x52     //1/3偏压 4公共口,0X52=1/2偏压

  20. #define WDTDIS   0x0a     //禁止看门狗
  21. #define WDTEN    0x0e     //开启看门狗

  22. /********************定义控制端口**********************/
  23. sbit CS=P2^2;
  24. sbit READ=P2^0;//无用
  25. sbit WRITE=P2^1;
  26. sbit DATA=P2^0;


  27. /********************延时函数*************************/
  28. void delay_nms(uint n)
  29. {
  30.         uint i;
  31.         while (n--)
  32.                 for (i=0;i<500;i++);
  33. }

  34. /********************从高位写入数据*************************/
  35. void Write_Data_H(uchar Data, uchar Cnt)           //Data的高cnt位写入TM1621,高位在前
  36. {
  37.         uchar i;
  38.         for (i=0;i<Cnt;i++)
  39.         {
  40.                 WRITE=0;
  41.                 if (Data&0x80)                                 //从最高位发送
  42.                         DATA=1;
  43.                 else
  44.                         DATA=0;
  45.                 nop;
  46.                 nop;
  47.                 WRITE=1;
  48.                 Data<<=1;
  49.         }
  50.         WRITE=0;
  51.         DATA=0;
  52. }

  53. /********************从低位写入数据*************************/
  54. void Write_Data_L(uchar Data,uchar Cnt)        //Data 的低cnt位写入TM1621,低位在前
  55. {
  56.         unsigned char i;
  57.         for (i=0;i<Cnt;i++)
  58.         {
  59.                 WRITE=0;
  60.                 if (Data&0x01)                               //从低位发送
  61.                         DATA=1;
  62.                 else
  63.                         DATA=0;
  64.                 nop;
  65.                 nop;
  66.                 WRITE=1;
  67.                 Data>>=1;
  68.         }
  69.         WRITE=0;
  70.         DATA=0;
  71. }

  72. /********************写入控制命令*************************/
  73. void WriteCmd(uchar Cmd)
  74. {
  75.         CS=0;
  76.         nop;
  77.         Write_Data_H(0x80,4);     //写入命令标志100
  78.         Write_Data_H(Cmd,8);      //写入命令数据
  79.         CS=1;
  80.         nop;
  81. }

  82. /*********指定地址写入数据,实际写入后4位************/
  83. void WriteOneData(uchar Addr, uchar Data)
  84. {
  85.         CS=0;
  86.         Write_Data_H(0xa0,3);     //写入数据标志101
  87.         Write_Data_H(Addr<<2,6);  //写入地址数据(A5-A4-A3-A2-A1-A0)从高位开始写数据
  88.         Write_Data_L(Data,4);     //写入数据
  89.         CS=1;
  90.         nop;
  91. }

  92. /*********连续写入方式,每次数据为8位,写入数据************
  93. void WriteAllData(uchar Addr,uchar *p,uchar cnt)
  94. {
  95. uchar i;
  96. CS=0;
  97. Write_Data_H(0xa0,3);      //写入数据标志101
  98. Write_Data_H(Addr<<2,6);   //写入地址数据
  99. for(i=0;i<cnt;i++)            //写入数据
  100. {
  101.    Write_Data_L(*p,8);
  102.    p++;
  103. }
  104. CS=1;
  105. nop;
  106. }
  107. ***************这个子程序暂时没用,注释掉******************/


  108. /*******************TM1621初始化**********************/
  109. void TM1621_init()
  110. {
  111.         CS=1;
  112.         WRITE=1;
  113.         DATA=1;       
  114.         nop;
  115.         delay_nms(1);
  116.         WriteCmd(BIAS);                 //1/3偏压 4公共口
  117.         WriteCmd(RC);                         //内部RC振荡
  118.         WriteCmd(SYSDIS);                 //关系统振荡器和LCD偏压发生器
  119.         WriteCmd(WDTDIS);                 //禁止看门狗
  120.         WriteCmd(SYSEN);                 //打开系统振荡器
  121.         WriteCmd(LCDON);                 //开LCD偏压
  122.        
  123. }
  124. /*************TM1621清屏函数*****************/
  125. void Clear1621()
  126. {
  127. uchar i;
  128. for(i=9;i<22;i++)
  129. {
  130. WriteOneData(i, 0x00);
  131. }
  132. }
  133. /*******************************************************************************
  134. * 函数名称                   :1621显示函数显示
  135. * 函数功能                   :
  136. * 输    入         : 无
  137. * 输    出         : 无
  138. *******************************************************************************/
  139. void Disp1621(uchar Addr, uchar Data)
  140. {
  141. WriteOneData(Addr, Data);
  142. }
复制代码
全部资料51hei下载地址:
完全调试通过的1602和TM1621程序.rar (1.91 MB, 下载次数: 444)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2020-2-20 15:42 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:149451 发表于 2020-3-3 16:30 | 只看该作者
好资料!我最近也在玩pt1621b,米字管的,用最笨的方法绘的真值表。
回复

使用道具 举报

地板
ID:149451 发表于 2020-3-3 16:45 | 只看该作者
LZ,你的资料打不开呀。重新传一下吧。谢谢
回复

使用道具 举报

5#
ID:137736 发表于 2020-3-9 20:45 | 只看该作者
w1179benp 发表于 2020-3-3 16:45
LZ,你的资料打不开呀。重新传一下吧。谢谢

我下了,能够正常打开。这个压缩的winRAR版本高。你装个高版本的RAR吧。我以前也遇到过类似问题。
回复

使用道具 举报

6#
ID:350320 发表于 2020-5-12 13:45 | 只看该作者
谢谢分享!!!!!!!!!!!!!!
回复

使用道具 举报

7#
ID:767356 发表于 2020-6-2 14:16 | 只看该作者
WRITE=1;
Data<<=1;     请问这里为什么要移位呢?
回复

使用道具 举报

8#
ID:767571 发表于 2020-6-2 15:49 | 只看该作者
谢谢分享!!!!!!!!
回复

使用道具 举报

9#
ID:137736 发表于 2022-1-14 21:59 来自手机 | 只看该作者
491612982 发表于 2020-6-2 14:16
WRITE=1;
Data

发送完了,要左移一位再发送。在一个循环内。
回复

使用道具 举报

10#
ID:412814 发表于 2022-9-27 19:59 | 只看该作者
感谢楼主分享,刚开始学这部分,希望能学会。
回复

使用道具 举报

11#
ID:1045132 发表于 2023-2-2 08:14 | 只看该作者

直接左移0x01
代码看起来更简洁
回复

使用道具 举报

12#
ID:14806 发表于 2023-2-2 14:53 | 只看该作者

感谢楼主分享,刚开始学这部分,希望能学会
回复

使用道具 举报

13#
ID:929051 发表于 2023-4-10 21:33 | 只看该作者

感谢楼主分享,刚开始学这部分,希望能学会。
回复

使用道具 举报

14#
ID:1064915 发表于 2023-4-11 08:38 | 只看该作者
有HT1621,与51开发板如何连接
回复

使用道具 举报

15#
ID:921750 发表于 2023-10-6 20:19 | 只看该作者
感谢楼主分享,摸了好久的程序一直卡在这部分,下载试试先。
回复

使用道具 举报

16#
ID:137736 发表于 2023-10-15 11:41 | 只看该作者
joyb 发表于 2023-4-11 08:38
有HT1621,与51开发板如何连接

看代码定义控制口段的定义。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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