✦ WELCOME TO MY WORLD ✦
✦ 2018-11-05 01:40 · 嵌入式 / MCU / Nuvoton新唐 / 新唐-8051

新唐N76E616段码液晶驱动功能小试

背景

一直都对驱动段码液晶很头痛,原理这里就不赘述了。简单来说需要偏压交流信号来驱动。比点亮数码管麻烦多了。
以前试过用IO口模拟交流信号驱动过,效果不是很理想。后来又用HT1621芯片驱动,可以是可以,不过还是嫌麻烦。买了不少段码液晶屏全部在那吃灰。
最近玩新唐,发现新唐N76E616自带段码驱动功能,于是翻出吃灰的液晶屏小试牛刀,效果很好。电路简单,控制逻辑也很清晰。

最终效果

板子是自己画的,很小的板子。画板子倒不难,难的从大覆铜板上切一小块下来。。。需要买个割板刀了。
我不太爱用热转印,都用纯化学转印,成功率比热转印高多了。可以看到转印效果不错,文字细节都保留下来了。
IMG_17901.jpg

可以直接插在最小系统板上。
IMG_17931.jpg

PCB。
WX20181105-013507@2x.png

使用的段码液晶图纸。
图纸s.jpg

关键代码(需要全部代码的可以留邮箱索取)

/**
 * Wire connection
 * MCU Pin: COM3  COM2  COM1  COM0  SEG0 SEG5 SEG4 SEG3 SEG2 SEG1
 * MCU Pin: P10   P11   P12   P13   P40  P45  P44  P43  P42  P41
 * LCD Pin: 1     2     3     4     5    6    7    8    9    10
 * --------------------------------------------------------------
 * COM1                       COM1  4G   1A   4D   2A   4A   3A
 * COM2                 COM2        1F   1B   2F   2B   3F   3B
 * COM3           COM3              1G   1C   2G   2C   3G   3C
 * COM4     COM4                    1E   1D   2E   2D   3E   3D
 */
void ShowDigitFor888E(UINT8 digitPlace, UINT8 num, UINT8 tempUnit) {

    UINT8 segABCD = 0;
    UINT8 segEFG = 0;

    // 参数检查
    if ((digitPlace < 1 || digitPlace > 3) ||
        (num > 9)) {
        return;
    }

    // MCU's SEG0-5 Enable
    // SEG0-SEG7 由 LCDSEG0 寄存器管理
    LCDSEG0 = SET_BIT0 | SET_BIT1 | SET_BIT2 | SET_BIT3 | SET_BIT4 | SET_BIT5;

    // 根据实际的引脚连接,以及LCD模块的段码表,确定改变哪些SEG的数据
    // 每个SEG是一个8位数据,1/4Duty时,高4位不使用,低4位的数据就是段码表的COM1-4的数据
    switch (digitPlace)
    {
        case 1:
            segABCD = 5;
            segEFG = 0;
            break;
        case 2:
            segABCD = 3;
            segEFG = 4;
            break;
        case 3:
            segABCD = 1;
            segEFG = 2;
            break;
        default:
            break;
    }

    // 确定了SEG以后,开始设置数字各段数据(其实可以全部计算出来结果放在一个code数组里即可)
    // 设置ABCD段数据(COM0-A,COM1-B,COM2-C,COM3-D)
    LCDPTR  = segABCD;
    switch (num)
    {
        case 0:
            LCDDAT  = COM0 | COM1 | COM2 | COM3;
            break;
        case 1:
            LCDDAT  = COM1 | COM2;
            break;
        case 2:
            LCDDAT  = COM0 | COM1 | COM3;
            break;
        case 3:
            LCDDAT  = COM0 | COM1 | COM2 | COM3;
            break;
        case 4:
            LCDDAT  = COM1 | COM2;
            break;
        case 5:
            LCDDAT  = COM0 | COM2 | COM3;
            break;
        case 6:
            LCDDAT  = COM0 | COM2 | COM3;
            break;
        case 7:
            LCDDAT  = COM0 | COM1 | COM2;
            break;
        case 8:
            LCDDAT  = COM0 | COM1 | COM2 | COM3;
            break;
        case 9:
            LCDDAT  = COM0 | COM1 | COM2 | COM3;
            break;

        default:
            break;
    }
    // 设置EFG段数据(COM1-F,COM2-G,COM3-E)
    LCDPTR  = segEFG;
    switch (num)
    {
        case 0:
            LCDDAT  = COM1 | COM3;
            break;
        case 1:
            LCDDAT  = 0x00;
            break;
        case 2:
            LCDDAT  = COM2 | COM3;
            break;
        case 3:
            LCDDAT  = COM2;
            break;
        case 4:
            LCDDAT  = COM1 | COM2;
            break;
        case 5:
            LCDDAT  = COM1 | COM2;
            break;
        case 6:
            LCDDAT  = COM1 | COM2 | COM3;
            break;
        case 7:
            LCDDAT  = 0x00;
            break;
        case 8:
            LCDDAT  = COM1 | COM2 | COM3;
            break;
        case 9:
            LCDDAT  = COM1 | COM2;
            break;

        default:
            break;
    }

    // 设置摄氏度符号段数据(COM0-SEG0,2,4)
    // 注意这里要用或计算,不然会覆盖之前设置好的数字部分的段码数据
    switch (tempUnit)
    {
        case 0xC:
            LCDPTR  = 2; // 4A段 set
            LCDDAT |= COM0;
            LCDPTR  = 4; // 4D段 set
            LCDDAT |= COM0;
            LCDPTR  = 0; // 4G段 clear
            LCDDAT &= ~COM0;
            break;
        case 0xF:
            LCDPTR  = 2; // 4A段 set
            LCDDAT |= COM0;
            LCDPTR  = 4; // 4D段 clear
            LCDDAT &= ~COM0;
            LCDPTR  = 0; // 4G段 set
            LCDDAT |= COM0;
            break;
        default:
            LCDPTR  = 2; // 4A段 clear
            LCDDAT &= ~COM0;
            LCDPTR  = 4; // 4D段 clear
            LCDDAT &= ~COM0;
            LCDPTR  = 0; // 4G段 clear
            LCDDAT &= ~COM0;
            break;
    }
}
标签:段码液晶
← 新唐ISP上位机程序加强版(支持HEX文件) 实测N76E616驱动段码液晶功耗 →

▣ 评论告示牌

  1. 吴 吴

    好帖,楼主可以分享一下吗。一直都没找到干货,也是第一次搞51内核的单片机开发,最近要搞一个N76E616的LCD这块的功能。410715998@qq.com

  2. 创新 创新

    1003099999@qq.com感谢楼主

  3. 木木 木木

    同求,现在低功耗应用段码LCD的不少,学习一下,wzwgeorge@foxmail.com

  4. 410715998@qq.com
    1003099999@qq.com
    wzwgeorge@foxmail.com
    都发过了

  5. 李偉喬 李偉喬

    求代碼:liweiqiao@126.com,謝謝!

  6. 18967089322@qq.com感谢!!

  7. PB25 PB25

    810165249@qq.com求发

  8. 鲁慧民 鲁慧民

    463963591@qq.com 谢谢楼主,发一份给我看看,谢谢

  9. 18967089322@qq.com
    810165249@qq.com
    463963591@qq.com
    已发。 ::aru:proud::

  10. 郑工 郑工

    最近要搞一个N76E616的LCD这块的功能。549287297@qq.com

  11. xcm xcm

    楼主发下代码,谢谢!474680233@qq.com

  12. 芒果123ooui 芒果123ooui

    2463574307@qq.com

  13. 芒果123ooui 芒果123ooui

    感谢楼主,好人一生平安 2463574307@qq.com

  14. 定领 定领

    感谢楼主,170189511@qq.com

  15. 549287297@qq.com
    474680233@qq.com
    2463574307@qq.com
    170189511@qq.com
    已发。

  16. 阿尔发 阿尔发

    第一次搞新唐单片机,最近学习N76E616的LCD这块的功能。467384410@qq.com,感谢楼主

  17. hanbing0898 hanbing0898

    最近也在学这个N76E616的LCD这块的功能。感谢楼主,发一下ryx0898@163.com ,谢谢了

  18. hanbing0898 hanbing0898

    楼主还能发吗,谢谢 !ryx0898@163.com

  19. 周 周

    1355950141@qq.com谢谢楼主!

  20. 467384410@qq.com
    ryx0898@163.com
    1355950141@qq.com
    已发

留下你的评论