面先展示一下XMEGA-B1 Xplained 板载段式LCD COM和SEG分布图。
使用段式LCD显示之前,需要对LCD进行初始化,在上面源代码中是 LCD_Init(void);需要以下准备流程:
①初始化系统时钟
②在conf_clock.h中配置RTC时钟源
③配置LCD时钟源
④配置LCD硬件连接类型
⑤配置LCD工作时序
⑥设置LCD闪烁频率
⑦设置LCD对比度
⑧使能LCD
由于使用的是XMEGA-B1 Xplained,所以还要在前面对评估板硬件进行初始化评估板,做好上面各个步骤之后,LCD就可以很轻松的用起来了,下面将逐一介绍每个步骤使用方法。
①初始化系统时钟
void sysclk_init(void); //初始化系统时钟
②在conf_clock.h中配置RTC时钟源
当CPU核心暂停,主振荡器停止时(节电模式),使用内部的32kHz振荡器,可以让LCD继续工作。配置方法是在conf_clock.h 中添加以下宏定义,如下图。
#define CONFIG_RTC_SOURCE SYSCLK_RTCSRC_ULP
③配置LCD时钟源
void lcd_clk_init(void); //设置LCD时钟源
④配置LCD硬件连接类型
该功能允许一个外部电阻偏置电压,对COM和SEG交替,LCD端口屏蔽和使用(或没有)。这个函数还可以对LCD进行清除显示(所有像素“关”),并可以停用液晶。根据以下表格对不同的LCD进行不同的配置,下面是配置函数说明。
void lcd_connection_init(com_swp, seg_swp, port_mask, x_bias); //配置LCD硬件连接类型
| COM 交替(false: 不交替,true: COM 交替) |
| SEG 交替(false: 不交替,true: SEG 交替) |
| |
| |
由于XMEGA-B1 Xplained中LCD连接COM、SEG都没有交替,LCD为4*40,所以SEG数量为40,使用的是内部偏置,所以函数如下:
lcd_connection_init(false, false, 40, false); //配置LCD硬件连接类型
⑤配置LCD工作时序
不同的LCD具有不同的工作时序,配置好工作时序,这是 MCU和LCD中间的桥梁。下面是配置函数说明。
void lcd_timing_init(lcd_pres, lcd_clkdiv, lcd_lp_wave, lcd_duty); //配置LCD工作时序
当LCD工作时钟时RTC时钟频率32.768KHz时,针对不同的LCD工作频率配置不同的LCD时序,见如下表格:
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy1_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy2_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy3_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy4_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy5_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy6_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy7_gc | LCD_DUTY_1_4_gc |
| LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy8_gc | LCD_DUTY_1_4_gc |
XMEGA-B1 Xplained板载LCD时序如下图所示,其工作占空比为1/4,典型工作频率为64Hz。
根据以上数据,并开启低功耗,这里配置LCD时序如下函数。
lcd_timing_init(LCD_PRESC_16_gc, LCD_CLKDIV_DivBy4_gc,
LCD_LP_WAVE_ENABLE_gc, LCD_DUTY_1_4_gc); //配置LCD工作时序
⑥设置LCD闪烁频率
在LCD驱动库函数里面对LCD闪烁频率有0.5Hz、1Hz、2Hz、4Hz可以配置,这里配置为2Hz。函数如下:
lcd_blinkrate_init(LCD_BLINKRATE_2Hz_gc); //设置LCD闪烁频率
⑦设置LCD对比度
此功能精确设置LCD的对比度。其电压转换式为:VLCD = 3.0 V + (fcont[5:0] * 0.016 V),设置LCD的对比度函数如下。
void lcd_set_contrast(int8_t fcont);
⑧使能LCD
void lcd_enable(); //使能LCD
到这里,段式LCD所有初始化就介绍完了,有了上面这些准备工作,后面就可以将LCD的任意段点亮,下面将详细介绍使用方法。
首先介绍一个概念,COM和SEG,如果大家用过数码管,COM就相当于是数码管的位码端,SEG就相当于数码管的段码端,XMEGA-B1 Xplained板载LCD 的COM=4,SEG=40。下面是LCD驱动库函数最常用的几个函数,使用好这几个函数后,就可以对LCD进行极为灵活的操作。
①void lcd_set_pixel(uint8_t pix_com, uint8_t pix_seg);
②void lcd_clear_pixel(uint8_t pix_com, uint8_t pix_seg);
③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,
const uint8_t *data, size_t width, uint8_t dir);
上面三个函数是最为常用的,函数①是将段式LCD的一个段SEG显示,函数②是将段式LCD的一个段SEG清除,函数③是对LCD写字符串。下面详细介绍这三个函数使用。要想理解和使用这些函数,首先看一个图片,如下图:
图中,由于XMEGA-B1 Xplained板载LCD COM=4,SEG=40,所以COM0~COM3,SEG0~SEG39,我们看到屏幕左下方AVR的logo编号为E1,在图中的表格中对应COM2,SEG0,其显示和清除如下表格:
| |
| 函数②:lcd_clear_pixel(2, 0); |
同时显示AVR logo,显示效果如下:
③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,
const uint8_t *data, size_t width, uint8_t dir);
函数③相对于前面两个稍显复杂,主要用来显示ASCII字符串的,其中的传递参数功能如下表格:
| LCD数码类型:7段3位、7段4位、14段4位、16段3位 |
| |
| |
| |
| |
其中lcd_tdg为数码类型,在LCD软件库中有明确的宏定义,如下表格:
根据上图,如果要在14段码区写入eefocus,所以数码类型lcd_tdg =LCD_TDG_14S_4C_gc,eefocus总共7个字符,所以width=7,eefocus的起始字母e写在上图的A6位上,而A6位对应的SEG=12,所以first_seg=12,根据不同的液晶内部电路排版,写入方向有所不同,图中eefocus从左往右写,依次是A6->A5->A4->A3->A2->A1->A0,从图中表格对应的SEG来看,也是从左往右写入,所以写入方向dir=0,有了这些信息之后,写入eefocus函数如下:
lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "eefocus", 7, 0);//14段屏显示字母eefocus
当然知道了LCD的写入原理后,可以对函数作进一步的封装,使得操作更简单,显示效果如下:
根据上图,如果要在7段码区写入“2015”(年),所以数码类型lcd_tdg =LCD_TDG_7S_4C_gc,2015总共4个字符,所以width=4,“2015”的起始数字2写在上图的D3位上,而D3位对应的SEG=8,所以first_seg=8,根据不同的液晶内部电路排版,写入方向有所不同,图中“2015”从左往右写,依次是D3->D2>D1->D0,从图中表格对应的SEG来看,而是从右往左写入,所以写入方向dir=1,有了这些信息之后,写入“2015”函数如下:
lcd_write_packet(LCD_TDG_7S_4C_gc, 8, "2015", 4, 1); //7段屏显示数字2015
显示效果如下:
段式LCD最常用的三个函数就介绍完了,下面来一张综合显示图:
所用函数代码:
lcd_set_pixel(2, 0); //显示AVR logo
lcd_set_pixel(1, 0); //显示USB logo
lcd_write_packet(LCD_TDG_7S_4C_gc, 8, "2015", 4, 1); //7段屏显示数字2015
/*** 显示Atmel的字母A斜体 ***/
lcd_set_pixel(1, 16);
lcd_set_pixel(1, 18);
lcd_set_pixel(2, 16);
lcd_set_pixel(2, 18);
lcd_set_pixel(2, 19);
lcd_write_packet(LCD_TDG_14S_4C_gc, 20, "tmel", 4, 0); //在斜体A后面显示tmel
显示效果如下图:
到这里,XMEGA段式LCD是使用方法就结束了,下面介绍工程编译和程序烧写(下载)。编译和生成烧写文件如下图:
生成成功后,用XMEGA所需的烧录工具进行烧写程序即可,如Atmel官方的Atmel-ICE、AVR Dragon、AVRISP MKII、AVR ONE!、JTAGICE3、JTAGICE MKII等等或者第三方的XMEGA烧录工具。
下面附上一些显示效果图片: