[技术问答] N76E003+ht1621b驱动LCD

[复制链接]
4121|14
 楼主| diguozhijia 发表于 2018-9-19 15:12 | 显示全部楼层 |阅读模式
如题:用N76E003+ht1621b驱动LCD,新手刚刚接触8位芯片,下载想用这个点亮LCD屏幕,指导一下,谢谢大家
zhuomuniao110 发表于 2018-9-19 16:05 | 显示全部楼层
基于液晶驱动HT1621的温控器产品的设计实例(原理图+源码)
   全部手写输入,求加精,求回帖,这样我才会有更多的动力继续分享更好的设计经验。      

这是一个温控器产品的设计实例,设计已经产品化,进入了量产阶段。
不磨叽,上图

165934p7lfm3i63urwz4j2.jpg

Mcu的选择
原来的设计的mcu采用了stm8s003f3,后来这ic价格大涨,从1.3元狂飙到4元,后来我将它换成新唐n76e003,结果发现新唐这芯片实在是超强的啊,比起原来的stm8s003f3,它的AD精度竟然是12位的,这使得在设计温度计时有更好的温度检测精度,大爱啊!
165933z8efr0210ndnuk11.jpg
N76E003 STM8S003F3 的管脚图对比

根据管脚对比,可以看出硬件是兼容的,但是软件需要更改

165934q5l8e8hq5e1g7f7o.jpg
N76E003 STM8S003F3 的特性对比

液晶驱动的选择
段式液晶由于其功耗低、价格便宜在很多家电中得到广泛的应用,其驱动其实并不复杂,大多是情况下都是用HT1621B进行驱动。

HT1621是128 点内存映象和多功能的LCD驱动器HT1621 的软件配置特性使它适用于多种LCD应用场合包括LCD模块和显示子系统用于连接主控制器和HT1621的管脚只有4 或5 条HT1621 还有一个节电命令用于降低系统功耗。

在使用HT1621进行驱动时,首先得根据订做的液晶进行原理设置。驱动液晶实际上就是往HT1621的内部寄存器中写数据,至于数据如何去驱动液晶我们可以不去理会它。下面也一款订做的液晶为例进行说明:
165934glxwcldq2ckc74nd.jpg
液晶的逻辑图
165934a7sx0gs0jj6ljjso.jpg
液晶的显示实例图样

zhuomuniao110 发表于 2018-9-19 16:06 | 显示全部楼层
HT1621的驱动程序参考
  1. //1 led1 p05
  2. //2 data p06
  3. //3 wr p07
  4. //10 cs p15
  5. void ini_io_lcd(void)
  6. {
  7.    P05_PushPull_Mode;
  8.    P06_PushPull_Mode;
  9.    P07_PushPull_Mode;
  10.    P15_PushPull_Mode;
  11.    clr_P05;
  12.    clr_P06;
  13.    clr_P07;
  14.    clr_P15;
  15. }
  16. //锁定显示数据 3v=300khz=0.3M=3.3us 5v=500khz=0.5M=2us 16M=1/16us delay(40/16)=2.5us 参考ht1621b串行数据时钟
  17. void lock_data(void)
  18. {
  19.    delay(40);
  20.    LCD_WR_0 ;
  21.    delay(40);
  22.    LCD_WR_1 ;
  23.    delay(40);
  24. }
  25. //移位送8位数据
  26. void shift(uchar i)
  27. {
  28.    uchar j ;
  29.    for(j = 0; j < 8; j++)
  30.     {
  31.        if(i & 0x80)LCD_DATA_1 ;
  32.        else LCD_DATA_0 ;
  33.        lock_data();
  34.        i <<= 1 ;
  35.     }
  36. }
  37. //移位送n位数据
  38. void shift2(uchar i, uchar n)
  39. {
  40.     ucharj ;
  41.    for(j = 0; j < n; j++)
  42.     {
  43.        if(i & 0x80)LCD_DATA_1 ;
  44.        else LCD_DATA_0 ;
  45.        lock_data();
  46.        i <<= 1 ;
  47.     }
  48. }
  49. //写命令
  50. void disp_cmd(uchar cmd)
  51. {
  52.    //uchar i=0 ;
  53.    LCD_CS_0 ;
  54.    LCD_DATA_1 ;
  55.    lock_data();
  56.    LCD_DATA_0 ;
  57.    lock_data();
  58.    LCD_DATA_0 ;
  59.    lock_data();
  60.    shift(cmd);
  61.    //空数据
  62.    lock_data();
  63.    LCD_CS_1 ;
  64. }
  65. void beep(uchar t)
  66. {
  67.    if(BeeEn)
  68.     {
  69.        disp_cmd(0x09);
  70.        beep_time = t ;
  71.     }
  72. }
  73. void beep3(void)
  74. {
  75.    beep_count = 3;
  76.    beep_delay = 1;
  77. }
  78. uchar disp_hi(uchar temp)
  79. {
  80.    return num[temp/10%10];
  81. }
  82. uchar disp_low(uchar temp)
  83. {
  84.    return num[temp%10];
  85. }
  86. uchar disp_hi2(uchar temp)
  87. {
  88.    return num2[temp/10%10];
  89. }
  90. uchar disp_low2(uchar temp)
  91. {
  92.    return num2[temp%10];
  93. }
  94. //写全部数据
  95. void disp_all(void)
  96. {
  97.    uchar i = 0 ;
  98.    LCD_CS_0 ;
  99.    //101,addr=0
  100.    LCD_DATA_1 ;
  101.    lock_data();
  102.    shift(0x40);
  103.    for(i = 0; i < 4; i++)
  104.     {
  105.        shift(DisBuf);
  106.        DisBuf = 0x00 ;
  107.     }
  108.    shift2(DisBuf[4], 4);
  109.    for(i = 5; i < 16; i++)
  110.     {
  111.        shift(DisBuf);
  112.        DisBuf = 0x00 ;
  113.     }
  114.    LCD_CS_1 ;
  115. }
  116. //初始化显示
  117. void Ini_Disp(void)
  118. {
  119.    disp_cmd(0x00);
  120.    //关闭系统振荡器与LCD偏压器
  121.    disp_cmd(0x18);
  122.    //系统时钟源,片内RC振荡器
  123.    disp_cmd(0x80);
  124.    //IRQ输出失效
  125.    disp_cmd(0xa7);//?
  126.    //时基wdt输出
  127.    disp_cmd(0x01);
  128.    //打开系统振荡器
  129.    disp_cmd(0x29);
  130.    //1/3偏压,4个公共口
  131.    disp_cmd(0x03);
  132.    //打开偏压发生器
  133.    disp_cmd(0x08);
  134.    //关闭声音输出
  135.    disp_cmd(0x60);
  136.    //2kHZ声音
  137. }
  138. void disp(void)
  139. {
  140.    uchar temp;
  141.    uchar d1, d2, d3, d4, d5, d6, d7, d8, d9;
  142.    uchar TT1, TT2, TT3, TT4, TT5, TT6, TT7, TT8, TT9, TT10, TT11, TT12,TT13, TT14, TT15, TT16, TT17, TT18;
  143. ............
  144. ............
  145. ............
  146. ............
  147. ............
  148. ............
  149. ............
  150.    
  151.    if(ACFg)TT9 = 1;
  152.    temp = 0; //0
  153.    if(d6 != 99)temp |= num2[d6];//led6
  154.    if(T2dot)temp |= 0x08; //5p .
  155.    DisBuf[0] = temp;
  156.    temp = 0; //1
  157.    if(d5 != 99)temp |= num2[d5];//led5
  158.    if(TT14)temp |= 0x08;
  159.    DisBuf[1] = temp;
  160.    temp = 0; //2
  161.    if(d4 != 99)temp |= num2[d4];//led4
  162.    if(TT15)temp |= 0x08;//T15启动温度
  163.    DisBuf[2] = temp;
  164.    temp = 0; //3
  165.    if(TT1)temp |= 0x01;//T1实测温度
  166.    if(TT4)temp |= 0x08;//T4 C
  167.    if(TT2)temp |= 0x02;//T2 暖
  168.    if(TT3)temp |= 0x04; //T3冷
  169.    if(TT5)temp |= 0x10;//T5 温度控制
  170.    if(TT6)temp |= 0x20;//T6间隙控制
  171.    if(TT7)temp |= 0x40;//T7倒计时开
  172.    if(TT8)temp |= 0x80;//T8倒计时关
  173.    DisBuf[3] = temp;
  174.    temp = 0; //4
  175.    if(TT10)temp |= 0x10; //T10 停止温度
  176.    if(TT11)temp |= 0x20; //T11 c
  177.    if(TT13)temp |= 0x80; //h
  178.    if(TT12)temp |= 0x40;
  179.    DisBuf[4] = temp;
  180.    temp = 0; //5
  181.    if(d1 != 99)temp |= num[d1];//led1
  182.    DisBuf[5] = temp;
  183.    temp = 0; //6
  184.    if(d2 != 99)temp |= num[d2];//led2
  185.    DisBuf[6] = temp;
  186.    temp = 0; //7
  187.    if(d3 != 99)temp |= num[d3];//led3
  188.    if(T1dot)temp |= 0x80; //2p .
  189.    DisBuf[7] = temp;
  190.    temp = 0; //8
  191.    if(TT9)temp |= 0x80;//T9 AC
  192.    if(d7 != 99)temp |= num[d7];//led7
  193.    DisBuf[8] = temp;
  194.    temp = 0; //9
  195.    if(d8 != 99)temp |= num[d8];//led8
  196.    DisBuf[9] = temp;
  197.    temp = 0; //10
  198.    if(d9 != 99)temp |= num[d9];//led9
  199.    if(T3dot)temp |= 0x80; //8p .
  200.    DisBuf[10] = temp;
  201.    temp = 0; //11
  202.    if(TT16)temp |= 0x10;//T16 C
  203.    if(TT18)temp |= 0x40;//T18 min
  204.    if(TT17)temp |= 0x20;//T17 关
  205.    DisBuf[11] = temp;
  206.     disp_all();
  207. }


zhuomuniao110 发表于 2018-9-19 16:11 | 显示全部楼层
HT1621B(中文).PDF.pdf (1.09 MB, 下载次数: 59)


zhuomuniao110 发表于 2018-9-19 16:36 | 显示全部楼层
N76E003.rar (3.56 MB, 下载次数: 74)


zhuomuniao110 发表于 2018-9-19 16:47 | 显示全部楼层
电路图与源码.rar (94.93 KB, 下载次数: 90)


 楼主| diguozhijia 发表于 2018-9-19 18:01 | 显示全部楼层
zhuomuniao110 发表于 2018-9-19 16:06
HT1621的驱动程序参考

你好,这个程序怎么用啊?头文件那些在哪里啊
zhuomuniao110 发表于 2018-9-19 19:57 | 显示全部楼层
diguozhijia 发表于 2018-9-19 18:01
你好,这个程序怎么用啊?头文件那些在哪里啊

头文件看你用哪个单片机了,反正操作函数给你了,你看着移植啊。其实把管脚映射上去就行了。
 楼主| diguozhijia 发表于 2018-9-19 22:07 | 显示全部楼层
zhuomuniao110 发表于 2018-9-19 19:57
头文件看你用哪个单片机了,反正操作函数给你了,你看着移植啊。其实把管脚映射上去就行了。 ...

用的新塘的N76E003芯片嘛,程序编译显示LCD的那些参数都没定义过,好像不太清楚怎么移植……,能再教一下吗
ou1220 发表于 2018-9-20 16:43 | 显示全部楼层
感谢分享
ruoyuzhiji 发表于 2018-9-23 17:06 | 显示全部楼层
二楼给力。
xixi2017 发表于 2020-3-7 21:47 | 显示全部楼层
666,二楼给力。
zhuomuniao110 发表于 2020-3-7 22:40 | 显示全部楼层
学习学习。
岭南江川 发表于 2020-4-5 23:08 | 显示全部楼层
很好的应用资料,谢谢分享!
芯片彭于晏 发表于 2020-7-9 10:14 | 显示全部楼层
专营HOLTEK合泰全系列原装正品,有原厂工程师,可提供技术支持/代开发方案/烧录等服务。V18576740188.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部