[牛人杂谈] 新唐N76E616段码液晶驱动功能小试

[复制链接]
1459|4
 楼主| 598330983 发表于 2019-11-27 13:49 | 显示全部楼层 |阅读模式
背景
一直都对驱动段码液晶很头痛,原理这里就不赘述了。简单来说需要偏压交流信号来驱动。比点亮数码管麻烦多了。
以前试过用IO口模拟交流信号驱动过,效果不是很理想。后来又用HT1621芯片驱动,可以是可以,不过还是嫌麻烦。买了不少段码液晶屏全部在那吃灰。
最近玩新唐,发现新唐N76E616自带段码驱动功能,于是翻出吃灰的液晶屏小试牛刀,效果很好。电路简单,控制逻辑也很清晰。
最终效果
板子是自己画的,很小的板子。画板子倒不难,难的从大覆铜板上切一小块下来。。。需要买个割板刀了。
我不太爱用热转印,都用纯化学转印,成功率比热转印高多了。可以看到转印效果不错,文字细节都保留下来了。
3002349739.jpg
可以直接插在最小系统板上。
1212198076.jpg
PCB。
2064049940.png
使用的段码液晶图纸。
2748267761.jpg
关键代码(需要全部代码的可以留邮箱索取)
 楼主| 598330983 发表于 2019-11-27 13:50 | 显示全部楼层
  1. /**
  2. * Wire connection
  3. * MCU Pin: COM3  COM2  COM1  COM0  SEG0 SEG5 SEG4 SEG3 SEG2 SEG1
  4. * MCU Pin: P10   P11   P12   P13   P40  P45  P44  P43  P42  P41
  5. * LCD Pin: 1     2     3     4     5    6    7    8    9    10
  6. * --------------------------------------------------------------
  7. * COM1                       COM1  4G   1A   4D   2A   4A   3A
  8. * COM2                 COM2        1F   1B   2F   2B   3F   3B
  9. * COM3           COM3              1G   1C   2G   2C   3G   3C
  10. * COM4     COM4                    1E   1D   2E   2D   3E   3D
  11. */
  12. void ShowDigitFor888E(UINT8 digitPlace, UINT8 num, UINT8 tempUnit) {
  13.    
  14.     UINT8 segABCD = 0;
  15.     UINT8 segEFG = 0;

  16.     // 参数检查
  17.     if ((digitPlace < 1 || digitPlace > 3) ||
  18.         (num > 9)) {
  19.         return;
  20.     }

  21.     // MCU's SEG0-5 Enable
  22.     // SEG0-SEG7 由 LCDSEG0 寄存器管理
  23.     LCDSEG0 = SET_BIT0 | SET_BIT1 | SET_BIT2 | SET_BIT3 | SET_BIT4 | SET_BIT5;
  24.    
  25.     // 根据实际的引脚连接,以及LCD模块的段码表,确定改变哪些SEG的数据
  26.     // 每个SEG是一个8位数据,1/4Duty时,高4位不使用,低4位的数据就是段码表的COM1-4的数据
  27.     switch (digitPlace)
  28.     {
  29.         case 1:
  30.             segABCD = 5;
  31.             segEFG = 0;
  32.             break;
  33.         case 2:
  34.             segABCD = 3;
  35.             segEFG = 4;
  36.             break;
  37.         case 3:
  38.             segABCD = 1;
  39.             segEFG = 2;
  40.             break;
  41.         default:
  42.             break;
  43.     }

  44.     // 确定了SEG以后,开始设置数字各段数据(其实可以全部计算出来结果放在一个code数组里即可)
  45.     // 设置ABCD段数据(COM0-A,COM1-B,COM2-C,COM3-D)
  46.     LCDPTR  = segABCD;
  47.     switch (num)
  48.     {
  49.         case 0:
  50.             LCDDAT  = COM0 | COM1 | COM2 | COM3;
  51.             break;
  52.         case 1:
  53.             LCDDAT  = COM1 | COM2;
  54.             break;
  55.         case 2:
  56.             LCDDAT  = COM0 | COM1 | COM3;
  57.             break;
  58.         case 3:
  59.             LCDDAT  = COM0 | COM1 | COM2 | COM3;
  60.             break;
  61.         case 4:
  62.             LCDDAT  = COM1 | COM2;
  63.             break;
  64.         case 5:
  65.             LCDDAT  = COM0 | COM2 | COM3;
  66.             break;
  67.         case 6:
  68.             LCDDAT  = COM0 | COM2 | COM3;
  69.             break;
  70.         case 7:
  71.             LCDDAT  = COM0 | COM1 | COM2;
  72.             break;
  73.         case 8:
  74.             LCDDAT  = COM0 | COM1 | COM2 | COM3;
  75.             break;
  76.         case 9:
  77.             LCDDAT  = COM0 | COM1 | COM2 | COM3;
  78.             break;
  79.    
  80.         default:
  81.             break;
  82.     }
  83.     // 设置EFG段数据(COM1-F,COM2-G,COM3-E)
  84.     LCDPTR  = segEFG;
  85.     switch (num)
  86.     {
  87.         case 0:
  88.             LCDDAT  = COM1 | COM3;
  89.             break;
  90.         case 1:
  91.             LCDDAT  = 0x00;
  92.             break;
  93.         case 2:
  94.             LCDDAT  = COM2 | COM3;
  95.             break;
  96.         case 3:
  97.             LCDDAT  = COM2;
  98.             break;
  99.         case 4:
  100.             LCDDAT  = COM1 | COM2;
  101.             break;
  102.         case 5:
  103.             LCDDAT  = COM1 | COM2;
  104.             break;
  105.         case 6:
  106.             LCDDAT  = COM1 | COM2 | COM3;
  107.             break;
  108.         case 7:
  109.             LCDDAT  = 0x00;
  110.             break;
  111.         case 8:
  112.             LCDDAT  = COM1 | COM2 | COM3;
  113.             break;
  114.         case 9:
  115.             LCDDAT  = COM1 | COM2;
  116.             break;
  117.    
  118.         default:
  119.             break;
  120.     }

  121.     // 设置摄氏度符号段数据(COM0-SEG0,2,4)
  122.     // 注意这里要用或计算,不然会覆盖之前设置好的数字部分的段码数据
  123.     switch (tempUnit)
  124.     {
  125.         case 0xC:
  126.             LCDPTR  = 2; // 4A段 set
  127.             LCDDAT |= COM0;
  128.             LCDPTR  = 4; // 4D段 set
  129.             LCDDAT |= COM0;
  130.             LCDPTR  = 0; // 4G段 clear
  131.             LCDDAT &= ~COM0;
  132.             break;
  133.         case 0xF:
  134.             LCDPTR  = 2; // 4A段 set
  135.             LCDDAT |= COM0;
  136.             LCDPTR  = 4; // 4D段 clear
  137.             LCDDAT &= ~COM0;
  138.             LCDPTR  = 0; // 4G段 set
  139.             LCDDAT |= COM0;
  140.             break;
  141.         default:
  142.             LCDPTR  = 2; // 4A段 clear
  143.             LCDDAT &= ~COM0;
  144.             LCDPTR  = 4; // 4D段 clear
  145.             LCDDAT &= ~COM0;
  146.             LCDPTR  = 0; // 4G段 clear
  147.             LCDDAT &= ~COM0;
  148.             break;
  149.     }
  150. }
 楼主| 598330983 发表于 2019-11-27 13:50 | 显示全部楼层
http://blog.mangolovecarrot.net/2018/11/05/78/
原文出处。
xuanhuanzi 发表于 2019-11-29 11:29 来自手机 | 显示全部楼层
非常不错,驱动这种可以做手持仪器
danq 发表于 2020-11-21 11:05 | 显示全部楼层
楼主可以发一下邮箱吗2463574307@qq.com,谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

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