STM8L的LCD接口详解及驱动程序

发布者:朱雀最新更新时间:2019-11-29 来源: eefocus关键字:STM8L  LCD接口  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

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) ;

[1] [2]
关键字:STM8L  LCD接口  驱动程序 引用地址:STM8L的LCD接口详解及驱动程序

上一篇:STM8S003单片机串口接收与ADC设置冲突
下一篇:软件模拟I2C(基于Microchip 24LC16B的操作函数库)

推荐阅读最新更新时间:2024-11-04 12:08

基于MSP430的ADS7841驱动程序
师姐(博士)反向设计了ADS7841芯片。为了测试其稳定性和精度,所以帮忙写了这个驱动程序。最初是师兄用FPGA写的,但读出来的数据差距太大,所以我就用430单片机帮忙搞了一个!但这个程序调试的并不顺利,简直就是痛苦,我昨天中午和晚上都没吃饭!首先碰到I/O口坏的情况,还有就是这个芯片的 DATASHEET关于读数的说明是错的,害人不浅!据datasheet解释是等待busy信号为低才开始读数,其实这个时候已经晚了,会漏掉一位。所有上面这些问题我是借助逻辑分析仪看出来的,把抓出来的时序一点点的分析,终于发现了读数方面DATASHEET的漏洞。还有就是她没提写数据和读数据分别应该在时钟的什么沿触发。实在让人郁闷~!~正常应该在下降沿写
[单片机]
nRF24L01 MSP430 发送接收驱动程序
nrf24l01.c 智芯锐电子技术论坛:http://www.zhixinrui.com #include nrf24l01.h unsigned char flag=0;//状态寄存器(STATUS)标志 unsigned char success=0;//发送接收成功与否标志,0为失败,1为发送成功,2为接收成功 unsigned char TXBuf ={0x68,0x86,0x00}; unsigned char RXBuf ={0x00,0x00,0x00}; unsigned char TX_ADDRESS ={0x04,0x01,0x02,0x03,0x00}; //接收节点地址(0通道
[单片机]
TLV5616 51单片机 驱动 程序
========================================第1页======================================== #include reg51.h // 通用的头文件定义 #include intrins.h #define uchar unsigned char #define uint unsigned int //* 函数声明 void tlv5616_da(uint da); //DA 转换函数 //tlc5615 的信号线 sbit tlv5616_clk=P0^2; //TLC5615
[单片机]
LCD驱动器SD0432与嵌入式系统的接口设计
摘要:集成LCD显示驱动器SD0432是深圳兴威帆电子有限公司生产的低工作电压串行接口芯片,它内部具有看门狗(WDT)及语音输出电路。文中介绍了SD0432的工作特性及工作原理,给出了SD0432与8051嵌入式微处理器的接口电路及部分程序代码。 关键词:LCD显示驱动器 SD0432 嵌入式系统芯片8051 看门狗(WDT) 1 SD0432的主要特性 现今,随着LCD价格的下降,LCD的使用已经越来越普遍了,如在电脑显示器方面,大有LCD显示器取代CRT显示器的趋势。同时由于LCD显示器具有直观、小巧轻薄、耐用等特性,因而得到了广泛的使用。 SD0432是具有128段(32%26;#215;4位)和映射存储器
[应用]
基于USB通信的多功能智能插座
1.概述   现有的插座在其使用方式、功能以及外形特征等诸方面都表现出多样化的趋势。有的增加了保险功能、电源指示功能、开关功能,有的增加了调压功能。这些插座的功能无论怎样,只能是单一的目的:为用电设备提供电源接口。它们的共同缺陷就是不具有信息化和智能化功能。为了实现插座的信息化和智能化,我们将研究设计的智能信息系统与插座结合,将该智能设备与电源插座合为一体,设计成多功能智能监测插座。该插座由于在建筑电气安装时一次性固定完成,采用照明电源供电,人们使用时就好象使用普通电源插座一样,免除了过多的连接线。 2.系统功能与组成 2.1功能 该多功能智能监测插座是在普通插座的基础上,结合信息的需要,增加了如下功能:   1) 对
[单片机]
基于USB通信的多功能智能插座
基于新唐NUC120RD2BN的EBI接口的ILI9327的驱动程序
基于新唐NUC120RD2BN的EBI接口的ILI9327的驱动程序 本程序采用了新唐NUC120RD2BN带了EBI总线的CPU,因为ILI9327只有一个地址线RS,也就是命令,数据寄存器地址,而且又支持16位总线,所以把此地址线接到多余的ALE上,把ALE配置成GPIO模式,把ALE地址锁存的时序忽略掉,直接用EBI总线驱动ILI9327的数据总线。 其余不多说,请查看源码文件:ili9327.c 文件内容如下: * Includes ------------------------------------------------------------------*/ #include stdio.h
[单片机]
51单片机和图形LCD接口技术的实现
  LCD 近年来越来越多地应用在单片机控制的仪器仪表中。仪表显示时良好的人机界面始终是人们的追求。近日用单片机控制成功地在EDM240128 图形LCD 上显示出图片。 1、液晶模块的特点:   EDM240128 图形LCD 是大连神迅信息股份有限公司生产的240*128 点阵式LCD。 内置8K 的数据存储器,液晶显示控制芯片为东芝公司生产的T6963C。它的总线可以直接适配MCS51 总线。允许单片机随时访问显示缓冲区,甚至可以进行位操作,直接控制某一点。同时这款液晶还有读/写地址自动加/减1 的功能,为大量数据的传送编程提供了方便。 2、硬件实现:   采用89S52 单片机,其内部有8K的FLASH ROM,将需
[单片机]
51单片机和图形<font color='red'>LCD</font><font color='red'>接口</font>技术的实现
STM8L通过内部参考电压计算电池电压
STM8L内部有个固定的参考电压值,在外部接入参考电压3V的情况下,这个模拟电压值为1.225V,转换后的工厂测量电压LSB值在寄存器地址(0x4910)中,MSB部分为固定值0x6,则转换后的参考电压值为(0x6 8) + LSB。 本人项目中参考电压为3.3V所以内部固定参考电压值需要转换得到。因为内部固定参考电压值为1.225V,通过Vref通道测得电压值,得到转换值,通过分压电路极端电池的电压
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved