这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 基于高速单片机的液晶显示控制与设计

共3条 1/1 1 跳转至

基于高速单片机的液晶显示控制与设计

助工
2018-05-09 10:27:03     打赏

MSP430 系列单片机是 TI 公司推出的一种采用精简指令集( RISC) 结构的 16 位超低功耗单片机,可应用于仪器仪表、自动控制等传统的单片机应用领域; 更适合用于一些电池供电的便携式低功耗产品。ST7920 是一种液晶显示驱动控制器,常被装配在图形液晶显示模块上,以内置控制器式图形液晶显示模块的形式出现,它不仅具有一般液晶显示器所具有的抗干扰能力强、体积小、接口控制方便等优点,而且还具有其特有的硬件初始值设置功能。因此,以 MSP430 系列单片机为核心的内置 ST7920控制器的液晶显示模块更能满足人们特定的需要,具有较高的实用价值。本文采用 ST7920 作为显示控制模块,设计了由 MSP430F1611 单片机控制的液晶显示模块的硬件接口电路及显示程序。实际运行结果表明,本文中的硬件接口电路和软件程序设计合理,运行可靠,工作稳定。
1 液晶模块原理
  在智能控制系统中越来越多地使用了液晶显示屏 LCD,LCD 是一种介于液体和固体之间热力学的中间稳定相,它本身不会发光,是利用外部光的反射原理进行显示。液晶显示功耗小、字形美观,在系统中可用集成电池来供电。
1. 1 基本功能
  OCM12864—9 液晶显示屏以 ST7920 显示控制模块为内核,液晶显示屏幕为 128 ×64 点,可显示四行,每行可显示 16 ×16 中文字符或 32 × 32 中文字符以及 16 ×8 半宽字符,还可显示各种图形。
1. 2 指令系统
  OCM12864—9 内核 ST7920 模块内部有一个指令寄存器和一个数据寄存器,其指令分为基本指令集和扩充指令集。基本指令集用来初始化液晶屏和实现基本功能控制。对于指令寄存器来说,包括清除显示、位址清零、进入点设定、显示状态开/关、
光标或显示移位控制、功能设定、设定 CGRAM 位址、设定 DDRAM 位址、读取忙标志(BF)等指令;对于数据寄 存 器 来 说,包 括 写 数 据 到 RAM (DDRAM/CGRAM/GDRAM)、读出 RAM 的值等指令。扩充指令集主要用来绘图,包括待命模式、卷动位址或 RAM位址、选择睡眠模式、扩充功能设定、设定 IRAM 位址或卷动位址、设定绘图 RAM 地址等指令。
1. 3 ST7920 主要特性

  ST7920 同时作为控制器和驱动器,它可提供33 路com 输出和64 路 seg 输出。在驱动器 ST7921 的配合下,最多可以驱动 256 ×32 点阵液晶。提供 8 位,4 位并行接口及串行接口可选,并行接口适配 M6800 时序,自动电源启动复位功能内部自建振荡源,64 ×16 位字符显示RAM(DDRAM 最多16 字符 ×4 行,LCD 显示范围16 ×2 行),2M 位中文字型 ROM(CGROM),总共提供8192 个中文字型(16 ×16 点阵),16K 位半宽字型ROM(HCGROM),总共提供126 个西文字型(16 ×8 点阵),64 ×16 位字符产生 RAM(CGRAM)15 ×16 位总共240 点的 ICON RAM(ICONRAM)。

ST7920 128 ×64 系列原理简图

2 硬件电路设计
2. 1 MSP430F1611 单片机的特点
  MSP430F1611 单片机是 TI 公司推出的一款 16位超低功耗微控制器,该款单片机具有低工作电压1. 8 ~3. 6 V,在1 MHz 时钟条件下,最大工作电流仅有 350 μA;是 16 位总线结构,一个指令周期仅有125 ns;有 5 种低功耗工作模式,在不同的工作模式下,工作电流可下降到 70 ~ 0. 1 μA;从待机到唤醒的时间小于 6 μs。它还集成了部分外围模块,包括带有 3 个捕获/比较寄存器的 μ 定时器,一个 16 位的 A/D 转换器和一个 12 位 D/A 转换器,具有强大的中断功能[1,2] 。
2. 2 MSP430F1611 最小系统与液晶连接电路图见图 2。

单片机与液晶连接接口电路图

3 软件设计
  接口软件设计主要包括单片机 MSP430 初始化、液晶控制器 ST7920 初始化、数据采集通讯、字符或汉字的显示等。从系统的快速性考虑,这里通过液晶显示屏的初始化以及如何显示文本来具体说明单片机控制液晶显示屏的软件设计。

软件流程

3. 1 软件设计流程
  单片机要控制液晶显示屏系统运行,首先应将系统接通电源,系统自动复位。复位后进行单片机系统初始化、液晶初始化。在初始化完毕后,单片机需要相液晶发送显示数据,通过液晶内部控制器相关函数完成显示 [3] 。其软件流程图如图 3 所示。
3. 2 ST7920 的读写时序
  在软件设计过程中,只有产生符合 ST7920 的读写时序后才能对液晶正确操作,否则液晶显示屏不会有任何输出。根据时序图以及液晶模块的初始化流程,可以编写液晶模块初始化功能设置程序。
3. 3 驱动程序
  对于液晶显示屏的控制,归纳起来只有两种,第一是写数据;首先写入控制命令,然后写入控制参数或者显示数据;第二是数据;首先写入控制命令,然后堵住数据,数据和命令是由 A0 线来区分的。设 计 OCM12864—9 液 晶 显 示 屏 驱 动 程 序
如下[4,5] 。

* 函数名称 :send_cmd
* 功能描述 : 写命令到寄存器
* 返回值
:无
void send_cmd(unsigned char cmd)
{ check_busy();
RS_0;/ /clr rs;
RW_0;/ /clr rw; / /写命令
CS_0;/ /clr cs; / /片使能
P5OUT = cmd;/ /data_bus = cmd;
EN_1;/ /set e;
NOP;
EN_0;/ /clr e;
NOP;
CS_1;/ /set cs; / /片禁能 }
* 函数名称 :send_dat
* 功能描述 :写数据到 DDRAM
* 返回值
:无
void send_dat(unsigned char dataa)
{ check_busy();
RS_1;/ /set rs;
RW_0;/ /clr rw; / /写数据
P5OUT = dataa;/ /data_bus = dat;
CS_0;
EN_1;/ /set e;
NOP;
EN_0;/ /clr e;
NOP;
CS_1;/ /set cs; / /片禁能 }
* 函数名称 :read_dat
* 功能描述 :从 DDRAM 数据
* 返回值
:无
uchar read_dat(void)
{ uchar read_dataa;
check_busy();
DIRIN; / /端口设置为输入方式
RS_1;
RW_1;
CS_0;
EN_1;
NOP;
read_dataa = P5IN;
EN_0;
NOP;
CS_1;
DIROUT;

return read_dataa; }
void Set_Page_Address(uchar dataa) / / = = = = = = = 写
页地址 = = = = = = = = = = = = = =
{ send_cmd(0xb0|dataa); }
void Set_Colume_Address(uchar dataa) / / = = = = = = = 写
列地址 = = = = = = = = = = = = = =
{ uchar tmp;
tmp = dataa > >4;
send_cmd(0x10|tmp); / /送列地址高四位
tmp =0x0f&dataa;
send_cmd(tmp); / /送列地址低四位 }
void printf(char * ptr,uchar h,uchar l) / / - - - - 显示汉字函
数 - - - - - - - - - - - - - - - - - - - - - - -
{ unsigned char c1,c2,i,j;
unsigned char page_set,column_add,uLen;
unsigned int k;
i = 0; j = 0; uLen = 0; h = h -1; l = l -1;
page_set = h;
page_set = (page_set* 2)&0x06;
column_add = l;
column_add = (column_add);
send_cmd(0xC8);
Set_Page_Address(page_set);
Set_Colume_Address(column_add);
while (ptr[uLen]! =0){uLen + + ;}; / /探测字串长度
while(i < uLen)
{ c1 = ptr[i]; c2 = ptr[i +1];
if(c1 < 128) / / ASCII 字符与汉字内码的区别在于 128 做
分界,大于界线的为汉字码
{ for(j =0;j < ASC_CHR_WIDTH;j + + )
{ if(c1 > = 0x20)
send_dat(ascii[(c1 -0x20)* ASC_CHR_HEIGHT + j - (16 -
ASC_CHR_HEIGHT)]); }
Set_Page_Address(page_set +1);
Set_Colume_Address(column_add);
for(j =0;j < ASC_CHR_WIDTH;j + + )
{ if(c1 > = 0x20) send_dat(ascii[(c1 -0x20)* ASC_
CHR _ HEIGHT + ASC _ CHR _ WIDTH + j - (16 - ASC _ CHR _
HEIGHT)]); }
column_add + =8; }
else / / 中文
{ for(j =0;j < sizeof(GB_16) /sizeof(GB_16[0]);j + + )
/ / 查找定位
{ if(c1 = = GB_16. Index[0] && c2 = = GB_16. Index
[1])

break; }
for(k =0;k < sizeof(GB_16[0]. Msk) /2;k + + )
{ if(j < sizeof(GB_16) /sizeof(GB_16[0]))
{ send_dat(GB_16. Msk[k]);}
else / / 未找到该字
{ send_dat(0xff);}
}
Set_Page_Address(page_set +1);
Set_Colume_Address(column_add);
for(k =0;k < sizeof(GB_16[0]. Msk) /2;k + + )
{ if(j < sizeof(GB_16) /sizeof(GB_16[0]))
{ send_dat(GB_16. Msk[k +16]); }
else { send_dat(0xff); } / / 未找到该字 }
i + + ; column_add + =16; }
Set_Page_Address(page_set);
Set_Colume_Address(column_add); i + + ; }
/ /return uLen;/ /返回字串长度,汉字按 2 字节计算}

4 设计实例
  利用 MSP430F1611 片内外设 TB 定时器控制中断显示“湖北大学知行学院欢迎您”在液晶显示屏上移动,利用中断可以达到低功耗的目的,只在每次中段到来时更改显示位置。首先用汉字取模软件对“湖北大学知行学院欢迎您”取模,结果放在自
定义结构体类型汉字库里,再调用显示汉字函数显示。
代码如下:
#include < MSP430x16x. h >
#include"cr_yj. h"
int a =0;
int main( void )
{ WDTCTL = WDTPW + WDTHOLD;
TBCCTL0 = CCIE;
TBCCR0 =500 -1;/ /设置时间约 1/4 秒
TBCTL = TBSSEL_1 + MC_1 + ID_3;
csh_yj();
_BIS_SR(LPM0_bits + GIE); }
#pragma vector = TIMERB0_VECTOR / / Timer B0 interrupt
service routine
__interrupt void Timer_B (void)
{ a + + ; if(a = =128) a = -128;
printf(" 欢迎您",1,a) ; }



院士
2018-05-13 18:13:59     打赏
2楼

学习了,谢谢分享。


助工
2018-05-14 11:08:51     打赏
3楼

感谢支持


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]