STM8L部分型号集成了段式液晶驱动器,可以驱动4*28=112个液晶段.段式液晶屏为低功耗显示器件,功耗根据屏的大小和显示段数会有所不同,通常功耗在10ua左右.生活中,数字电子表,数字万用表,数显温度计等,使用的都是段式液晶屏,通常一颗纽扣电池可以保证设备间隔不断显示数字两年或更久.
大家比较熟悉的液晶屏1602模块其实也是段式液晶,是一个有很多段的点组成的,由于点比较多,所以1602模块集成了驱动芯片,我们只需给1602送数据,就可以控制1602进行显示了.液晶本身不会发光,1602之所以会发光是因为使用了LED背光板.
段式液晶驱动器,通常会含有一个电压泵,一个频率分频器.电压泵用来提供驱动液晶段的电压,电压的高低决定着显示的清晰度,也就是决定着液晶的对比度.提供给LCD驱动器的频率决定着,刷新段式液晶的频率,如果提供给LCD的频率太低,会看到显示时的频闪.
从上图可以看到,除了分频器和电压泵部分,还有显存.所有液晶屏都会有显存,每个显存控制着对应的引脚,对于STM8L的八位显存,可以控制8个引脚和一个COM引脚,比如STM8L的RAM0控制着COM0对应的S0~S7引脚.
当我们需要驱动一块液晶屏时,首先要拿到这种液晶屏的引脚对应显示段的图纸.如下图,由于STM8L152C6的RAM0控制着COM0对应的S0~S7引脚,如果要显示下图的"元",那么我们只需要向RAM0写入数据0x01.
本例程的硬件平台仍然是ST官方的开发板STM8L-DISCOVERY.在ST官网的编号为UM0970这份文档中,有对开发板上液晶屏的介绍.
这份资料,并不是十分直观.找到显存对应的液晶屏上的段,对写程序来说很重要.
本例程,参考ST提供的例程,根据自己的理解,编写了LCD驱动程序,提供一个可以在液晶屏上最多显示六位数字的接口的程序,读者可以调用此程序,显示任意六位以内的数字.
/****************************************************************************************
*开发环境:IAR for stm8 v6.5.3
*硬件平台:STM8L-DISCOVERY
*功能说明:使用STM8L-DISCOVERY液晶屏显示一串6位数字
*作 者:茗风
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdint.h"
/* =========================================================================
LCD MAPPING
=========================================================================
A
_ ----------
COL |_| | |J /|
F| H | K |B
_ | | / |
COL |_| --G-- --M--
| /| |
E| Q | N |C
_ | / |P |
DP |_| -----------
D
*/
#define a 0x01
#define b 0x02
#define c 0x04
#define d 0x08
#define e 0x10
#define f 0x20
#define g 0x40
#define m 0x80
const uint8_t LCD_Tab[10] = {
a + b + c + d + e + f, // Displays "0"
b + c, // Displays "1"
a + b + m + g + e + d, // Displays "2"
a + b + m + g + c + d, // Displays "3"
f + g + m + b + c, // Displays "4"
a + f + g + m + c +d, // Displays "5"
a + f + e + d + c + g + m , // Displays "6"
a + b + c, // Displays "7"
a + b + c + d + e + f + g + m, // Displays "8"
a + b + c + d + f + g + m // Displays "9"
};
/******************************************************************************************************
* 名 称:void LCD_Config(void)
* 功 能:配置DAC,禁用DMA,不使用TIM4触发,也不用软件触发,写入DHR的数据被立即送入DOR寄存器,
* 立即输出对应电压
* 入口参数:无
* 出口参数:无
* 说 明:STM8L152C6属于中等容量MCU,只有一路DAC输出,输出引脚为PF0
* 范 例:无
******************************************************************************************************/
void LCD_Config(void)
{
//------打开LCD/RTC时钟------
CLK_PCKENR2_PCKEN22=1;//打开RTC时钟,LCD刷新频率与此时钟有关
CLK_PCKENR2_PCKEN23=1;//打开LCD时钟,读写LCD寄存器用到此时钟
//---选择LSE作为RTC时钟---
CLK_CRTCR_RTCSEL0=0;
CLK_CRTCR_RTCSEL1=0;
CLK_CRTCR_RTCSEL2=0;
CLK_CRTCR_RTCSEL3=1;
/* 0000: No clock selected
0001: HSI clock used as RTC clock source
0010: LSI clock used as RTC clock source
0100: HSE clock used as RTC clock source
1000: LSE clock used as RTC clock sourc*/
//----设置RTC时钟分频值----
CLK_CRTCR_RTCDIV0=0;
CLK_CRTCR_RTCDIV1=0;
CLK_CRTCR_RTCDIV2=0;
/*000: RTC clock source/1
001: RTC clock source /2
010: RTC clock source /4
011: RTC clock source /8
100: RTC clock source /16
101: RTC clock source /32
110: RTC clock source /64
111: RTC clock source /128*/
//----设置LCD预分频值----
LCD_FRQ_PS0=0;// 2^PS[3:0]
LCD_FRQ_PS1=0;//分频值为1
LCD_FRQ_PS2=0;
LCD_FRQ_PS3=0;
//----设置LCD分频值----
LCD_FRQ_DIV0=1;//DIV[3:0]+16
LCD_FRQ_DIV1=1;//分频值为15+16=31
LCD_FRQ_DIV2=1;
LCD_FRQ_DIV3=1;
//以上分频值的设置,最为了得到适合的LCD的刷新频率,如果增大分频值,会导致
//LCD刷新频率变低,会看到LCD显示出现闪烁
//比如,我们将PS[3:0]设置为0011,会看到液晶闪烁
//----1/4 duty----
LCD_CR1_DUTY0=1;//1/4 duty
LCD_CR1_DUTY1=1;
/* Duty ratio selection
00: Static duty
01: 1/2 duty
10: 1/3 duty
11: 1/4 duty */
//----1/3 bias----
LCD_CR1_B2=0;//1/3 bias
/* 0: 1/3 bias
1: 1/2 bias */
//----内部电压源----
LCD_CR2_VSEL=0;
//----打开引脚的SEG功能----
// LCD_PM0=0xFF;//头文件这个地方定义错误,无法直接向LCD_PM0写入数据
// LCD_PM1=0xFF;//PM0寄存器定义错误,导致PM1也无法直接写入
// LCD_PM2=0xFF;//PM0寄存器定义错误,导致PM2也无法直接写入
*((uint8_t *)0x5404)=0xFF;//直接向LCD_PM0寄存器的地址写入数据
*((uint8_t *)0x5405)=0xFF;//直接向LCD_PM1寄存器的地址写入数据
*((uint8_t *)0x5406)=0xFF;//直接向LCD_PM2寄存器的地址写入数据
//----To set contrast to mean value----
LCD_CR2_CC0=0;//对比度
LCD_CR2_CC1=1;
LCD_CR2_CC2=0;
/* 000: VLCD0 2.6V
001: VLCD1 2.7V
010: VLCD2 2.8V
011: VLCD3 2.9V
100: VLCD4 3.0V
101: VLCD5 3.1V
110: VLCD6 3.2V
111: VLCD7 */
//----Dead time 0----
LCD_CR3_DEAD0=0;//no dead time
LCD_CR3_DEAD1=0;
LCD_CR3_DEAD2=0;
//----LCD_PulseOnDuration_1----
LCD_CR2_PON0=1;
LCD_CR2_PON1=0;
LCD_CR2_PON2=0;
/* 000: 0 CLKps pulses
001: 1 CLKps pulses
010: 2 CLKps pulses
011: 3 CLKps pulses
100: 4 CLKps pulses
101: 5 CLKps pulses
110: 6 CLKps pulses
111: 7 CLKps pulses */
//----Enable LCD peripheral----
LCD_CR3_LCDEN=1;
}
/******************************************************************************************************
* 名 称:LCD_DisplayNum(uint8_t number)
* 功 能:控制段式液晶屏的数字显示部分
* 入口参数:number:要显示的数字
* 出口参数:无
* 说 明:根据数字的长度,判断要显示的长度,长度大于6位,只显示后六位
* 范 例:无
******************************************************************************************************/
void LCD_DisplayNum(uint32_t number)
{
uint8_t cnts=0,tmp=0;
if(number<10)cnts=1;
else if(number<100)cnts=2;
else if(number<1000)cnts=3;
else if(number<10000)cnts=4;
else if(number<100000)cnts=5;
else if(number<(uint32_t) 1000000)cnts=6;
else cnts=6;
//判断需要显示数字的长度,确定在LCD屏上需要的位数
switch(cnts)
{
case 6:
tmp = LCD_Tab[number%1000000/100000];
((tmp&m)==0)?(LCD_RAM0&=~0x02):(LCD_RAM0 |=0x02) ;
((tmp&e)==0)?(LCD_RAM0&=~0x01):(LCD_RAM0 |=0x01) ;
((tmp&g)==0)?(LCD_RAM2&=~0x80):(LCD_RAM2 |=0x80) ;
((tmp&b)==0)?(LCD_RAM2&=~0x40):(LCD_RAM2 |=0x40) ;
上一篇:STM8S003单片机串口接收与ADC设置冲突
下一篇:软件模拟I2C(基于Microchip 24LC16B的操作函数库)
推荐阅读最新更新时间:2024-11-04 12:08
设计资源 培训 开发板 精华推荐
- L7809A 0.5 至 10 V 输出稳压器的典型应用
- LT3150CGN 演示板,低压 LDO 线性稳压器 (1.5-2.5Vin),1.2V/1.5Vout @ 4A 或 1.8Vout @ 1.7A
- 用于白光 LED 的 TB62752AFUG 升压型 DC/DC 转换器的典型应用
- ADP160-3.3-EVALZ,ADP160-AUJZ-3.3-R7线性稳压器评估板3.3V
- 使用 ROHM Semiconductor 的 BD4848 的参考设计
- 两个 LTC1921 监控电源电压,以及用于冗余 -48V 电源的电源和返回保险丝设计电路
- LT6656AIDC-1.25、1.25V 低功率精密高压电源监视器的典型应用
- STEVAL-ILL064V1,基于 BB 拓扑结构的 LED5000 3A LED 驱动器的评估板
- 单面洞洞板
- 具有准确输入电流限制的 LT3477EFE 800mA、5V 至 12V 升压转换器的典型应用电路