title: stm8l LCD显示
date: 2021/12/14
categoreies:
tags:

如图所示,可以看到LCD配置寄存器包含4个控制寄存器LCD_CRx、频率选择寄存器LCD_FRQ、端口掩码寄存器LCD_PM、LCD显示寄存器LCD_RAM。


LCD初始化配置


stm8L的LCD显示
初始化配置分为以下几个步骤:

  1. 背光LED灯初始化
  2. 使能LCD外设时钟
  3. LCD参数设置
  4. LCD端口设置
  5. LCD对比度设置

注:使用寄存器库将指针->更改为下划线_即可。u8_t即unsigned char类型。

void HW_Init_LcdIO(void)
{  /* configure PB5, Output and push-pull and Low level  */GPIOB->DDR |= 0x20;GPIOB->CR2 &= ~0x20;GPIOB->ODR &= ~0x20;GPIOB->CR1 |= 0x20;/*Enables the LCD peripheral clock*/CLK->PCKENR2 |= 0x08;/*lcd configure */   LCD->FRQ = 0x30;      /* LCD_Prescaler_8,LCD_Divider_16 */LCD->CR1 &= ~0x06;    /* Clear the duty bits */LCD->CR4 &= ~0x02;   /* Clear the DUTY8 bit */LCD->CR1 |= 0x02;    /* Configure the Duty cycle 1/2 */LCD->CR1 |= 0x00;    /* Configure the Bias cycle 1/3 */LCD->CR2 &= ~0x01;    /* Clear the voltage source bit */LCD->CR2 |= 0x01;   /* External voltage source for the LCD *//*LCD port configuration*/ LCD->PM[0x00] = 0xff;           /* seg 0-7 */LCD->PM[0x01] = 0x3f;          /* seg 8,9 12,13*/LCD->PM[0x02] = 0x00; LCD->PM[0x03] = 0x00;/*Configure LCD Contrast*/LCD->CR2 |= 0x0E;/*Configure LCD DeadTime*/LCD->CR3 |= 0x01;/*Configures the LCD pulses on duration*/LCD->CR2 |= 0xA0;/* Enable Lcd */LCD->CR3 |= 0x40;
}

LCD段码配置


首先查看LCD规格书中的段码的对应表,本文采用的LCD如下图所示:

实际LCD使用的端口是COM0和COM1,查看stm8l参考手册的LCD寄存器表:

如果想要点亮图标L、M、H,从上图可以看到L对应COM1的seg1[0],M对应seg1[1],H对应COM0的seg0[1]。

因此将LCD_RAM3的高位第0位置1,就可以点亮L,图标显示代码如下:

void HW_Set_LcdShowIcon(IN u8_t nLcdIconNo,IN u8_t nValue)
{switch (nLcdIconNo){case eLcdIcon_L:if (nValue){LCD->RAM[LCD_RAMRegister_3] |= 0x10;}else{LCD->RAM[LCD_RAMRegister_3] &= (~0x10);}break;case eLcdIcon_M:if (nValue){LCD->RAM[LCD_RAMRegister_3] |= 0x20;}else{LCD->RAM[LCD_RAMRegister_3] &= (~0x20);}break;case eLcdIcon_H:if (nValue){LCD->RAM[LCD_RAMRegister_0] |= 0x02;}else{LCD->RAM[LCD_RAMRegister_0] &= (~0x02);}break;case eLcdIcon_COL:if (nValue){LCD->RAM[LCD_RAMRegister_4] |= 0x04;}else{LCD->RAM[LCD_RAMRegister_4] &= (~0x04);}break;case eLcdIcon_PM:if (nValue){LCD->RAM[LCD_RAMRegister_5] |= 0x02;}else{LCD->RAM[LCD_RAMRegister_5] &= (~0x02);}break;case eLcdIcon_S1:if (nValue){LCD->RAM[LCD_RAMRegister_1] |= 0x20;}else{LCD->RAM[LCD_RAMRegister_1] &= (~0x20);}break;default:break;}
}

注:LCD_RAMRegister_x 为宏定义,对应的是数字x。


七段数码管数字和字母显示


我们将数码管各段命名,并对其进行宏定义:

#define  a       0x01
#define  b       0x02
#define  c       0x04
#define  d       0x08
#define  e       0x10
#define  f       0x20
#define  g       0x40
#define NONE     0x00

然后根据所需的数字和字母进行段码组合:

const u8_t LCD_Num[]=
{ {a+b+c+d+e+f},               //0   {c+b},                       //1   {a+b+d+e+g},                 //2   {a+c+b+d+g},                 //3   {c+b+f+g},                   //4   {a+c+f+d+g},                 //5   {a+c+e+f+d+g},               //6   {a+c+b},                     //7   {a+c+e+b+f+d+g},             //8   {a+c+b+f+d+g},               //9 {b+c+d+e+f},                 //U{a+d+e+f+g},                 //E{a+b+c+e+f+g},               //R{d+e+f},                     //L{b+c+e+f+g},                 //H{0x00},                      //NULL
};

此时,对于每一个种数字和字母,组合的数都是唯一的,不会出现重复的情况。


现在我们将第二个数码管的7个段对应的寄存器位置表示出来:

2C: seg0[5]  RAM0[5]
2D: seg0[2]  RAM0[2]
2E: seg0[3]  RAM0[3]
2G: seg0[4]  RAM0[4]
2A: seg1[4]  RAM4[0]
2B: seg1[5]  RAM4[1]
2F: seg1[3]  RAM3[7]

这样我们输入一个数num,比如1,LCD_Num[1] = {c+b},此时c和b对应的第1和第2位将置1,然后我们将这个值赋给RAM对应的位置即可点亮2C和2D,将会显示数字1。显然实际2B2C和我们定义的数组中的bc位置不是一一对应的,所以我们需要根据实际情况进行移位操作。

比如c在我们的宏定义中是第2位,而2C是在RAM0的第5位,所以将其左移3位即可。

void HW_LCD_WriteNum2(u8_t nNum)
{ /* COM0-3: first page 0x00 *//* COM4-7: second page 0x04 */LCD->CR4 = 0x00; //The LCD RAM is selected as the first page//COM0  LCD->RAM[LCD_RAMRegister_0] &= (~0x3c);  LCD->RAM[LCD_RAMRegister_0] |= (u8_t)((LCD_Num[nNum]<< 3) & 0x20);// 2CLCD->RAM[LCD_RAMRegister_0] |= (u8_t)((LCD_Num[nNum]>> 1) & 0x04);// 2DLCD->RAM[LCD_RAMRegister_0] |= (u8_t)((LCD_Num[nNum]>> 1) & 0x08);// 2ELCD->RAM[LCD_RAMRegister_0] |= (u8_t)((LCD_Num[nNum]>> 2) & 0x10);// 2G//COM1LCD->RAM[LCD_RAMRegister_3] &= (~0x80);LCD->RAM[LCD_RAMRegister_3] |= (u8_t)((LCD_Num[nNum]<< 2) & 0x80);// 2FLCD->RAM[LCD_RAMRegister_4] &= (~0x03);LCD->RAM[LCD_RAMRegister_4] |= (u8_t)(LCD_Num[nNum] & 0x03);// 2AB
}

我们将7个段码依次进行赋值,即可显示对应的数字和字母,这样简单的显示程序就写好了。可以根据自己需求进行进一步包装优化。

stm8lLCD显示相关推荐

  1. ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle <span id="172_nwp" style="width: auto; height: auto; float ...

  2. Android开发从入门到精通

    Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...

  3. java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...

    EXCEL中,如何不跨页断行打印或显示,谢谢 打印预览--页面设置--工作表--网格线(打勾) 试试! java导入excel 判断当前行有没有数据 工作中用到入excel一个方法,你还可以通过一些插 ...

  4. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  5. Git 常用操作(3)- 本地分之显示、创建、切换、合并和删除操作

    1. 分支简介 Git 的 "master" 分支并不是一个特殊分支.它就跟其它分支完全没有区别.之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创 ...

  6. Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存

    Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...

  7. Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...

  8. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存

    code 将下面文档存为load_display_save.py #-*- coding:utf-8 -*- from __future__ import print_function #1 impo ...

  9. Visual Studio 中文显示乱码问题

    今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...

最新文章

  1. 注意Class类的特殊性
  2. 快速排序python实现
  3. 关于CMMI级别阶梯式前进路线图的对话
  4. Maven学习(六)————企业Maven项目最佳实践
  5. android权限允许,android – 允许多次运行时权限
  6. 机器学习第六回-无监督学习—— K-均值算法
  7. Android学习JNI,使用JNI实现字符串加密
  8. 函数式编程的兴衰(Composing Software 1)
  9. pta初级题库151-200
  10. 微信小程序不同类型demo集合含源码
  11. STAR:转录组数据比对工具简介
  12. 游戏打不开该怎么设置计算机,驱动人生游戏修复工具,轻松解决DNF打不开的问题。...
  13. pyautogui图形识别-confidence,grayscale
  14. MAC微信接收到的文档打开都变成(只读)解决办法
  15. bestpay学习 - - 一个轻量级的完全开源项目
  16. 『这辈子就相爱《何苦要等下辈子》 李草青青、肖玄MV』
  17. C++ operator重载运算符详解
  18. 电脑发到,电脑发送到手机的文件在哪里
  19. shell 编程的老臣 - sed
  20. 数字集成电路物理设计学习总结——布图规划和布局

热门文章

  1. DES算法原理完整版
  2. PostMan 请求LocalDateTime参数输入和返
  3. 阿里这份安全渗透内容火了!完整版免费开放下载,限时三小时
  4. 入门计算机知识,计算机基础知识入门
  5. 淘晶驰串口屏产品简单介绍
  6. 可见光相机与红外相机标定
  7. Android TV系列 TV APP分析(二)
  8. 疯了疯了,基金疯了。
  9. 老男孩教育day2学习总结
  10. Activity快速转换为Diglog