stm8lLCD显示
title: stm8l LCD显示
date: 2021/12/14
categoreies:
tags:
如图所示,可以看到LCD配置寄存器包含4个控制寄存器LCD_CRx、频率选择寄存器LCD_FRQ、端口掩码寄存器LCD_PM、LCD显示寄存器LCD_RAM。
LCD初始化配置
stm8L的LCD显示
初始化配置分为以下几个步骤:
- 背光LED灯初始化
- 使能LCD外设时钟
- LCD参数设置
- LCD端口设置
- 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显示相关推荐
- ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle <span id="172_nwp" style="width: auto; height: auto; float ...
- Android开发从入门到精通
Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...
- java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...
EXCEL中,如何不跨页断行打印或显示,谢谢 打印预览--页面设置--工作表--网格线(打勾) 试试! java导入excel 判断当前行有没有数据 工作中用到入excel一个方法,你还可以通过一些插 ...
- 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...
- Git 常用操作(3)- 本地分之显示、创建、切换、合并和删除操作
1. 分支简介 Git 的 "master" 分支并不是一个特殊分支.它就跟其它分支完全没有区别.之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创 ...
- Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存
Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...
- Linux df -h 显示磁盘空间满,但实际未占用满——问题分析
问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...
- 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
code 将下面文档存为load_display_save.py #-*- coding:utf-8 -*- from __future__ import print_function #1 impo ...
- Visual Studio 中文显示乱码问题
今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...
最新文章
- 注意Class类的特殊性
- 快速排序python实现
- 关于CMMI级别阶梯式前进路线图的对话
- Maven学习(六)————企业Maven项目最佳实践
- android权限允许,android – 允许多次运行时权限
- 机器学习第六回-无监督学习—— K-均值算法
- Android学习JNI,使用JNI实现字符串加密
- 函数式编程的兴衰(Composing Software 1)
- pta初级题库151-200
- 微信小程序不同类型demo集合含源码
- STAR:转录组数据比对工具简介
- 游戏打不开该怎么设置计算机,驱动人生游戏修复工具,轻松解决DNF打不开的问题。...
- pyautogui图形识别-confidence,grayscale
- MAC微信接收到的文档打开都变成(只读)解决办法
- bestpay学习 - - 一个轻量级的完全开源项目
- 『这辈子就相爱《何苦要等下辈子》 李草青青、肖玄MV』
- C++ operator重载运算符详解
- 电脑发到,电脑发送到手机的文件在哪里
- shell 编程的老臣 - sed
- 数字集成电路物理设计学习总结——布图规划和布局