文档库 最新最全的文档下载
当前位置:文档库 › LCD1602汉字显示技术在万年历中的应用及Proteus仿真.

LCD1602汉字显示技术在万年历中的应用及Proteus仿真.

LCD1602汉字显示技术在万年历中的应用及Proteus仿真.
LCD1602汉字显示技术在万年历中的应用及Proteus仿真.

第 3卷第 3期 2010年 6月清远职业技术学院学报 Journal of Qingyuan Polytechnic Vol. 3, No. 3June. 2010

1

简介

1602是一款最常用也是最便宜的液晶显示屏, 可以显示两行标准字符,每行显示16个字符,广泛应用于智能仪表、通信、办公自动化设备中。它的主要作用是显示 ASCII 码字符,因此又被称

作“ 字符型显示器件” [1]

。对于内部没有标准汉字库的液晶显示器要显示汉字,第一步要取得想要的中文或者图形的字模数据。通过字模软件不能直接提取 5*8点阵的字模数据,可以通过手动提取的方法从汉字字型取模。第二步,将取得的汉字字模数据保存到液晶存储器内部。第三步,将汉字显示到需要位置,用 Proteus 仿真或下载调试 [2-5]。 2液晶显示器内部存储器

1602里的存储器有三种:DDRAM 、 CGROM 和 CGRAM 。

2.1DDR AM 存储器

DDRAM 存储器是和显示屏的内容对应的, 1602内部的 DDRAM 有 80字节,显示屏上第一行的内容对应 DDRAM 中 80H 到 8FH 的内容,第二行的内容对应DDRAM 中 C0H 到 CFH 的内容,每行 16个,共 2行, 16×2共显示 32个字符 (图 1 。使用时,将显示的字符写入合适行列即可 (详见 3.4液晶 1602显示子程序。

图 1字符型液晶 1602的 DDRAM 存储器

2.2CGR OM 存储器

CGROM 称为字符发生 ROM , 其作用是存储各类字符的码,保存了厂家生产时固化在 LCM 中的点阵型显示数据。 1602液晶模块内部的字符发生存储器CGROM 已经存储了 160个不同的点阵字符图形,有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,这部分代码与 ASCII 码基本一致,比如小写的英文字母“ a ” 的代码是 61H ,大写的英文字母“ A ” 的代码是 41H 。 2.3CGR AM 存储器

CGRAM 称为字符发生 RAM ,是厂家留给用户自己定义点阵型显示数据的,作用是存储用户自定义的字符代码。用户自定义字符代码有 2种格式:5×8点阵格式和 5×11点阵格式。 CGRAM 数量为 64个字节,采用 5×8点阵格式时,每 8

收稿日期:2009-12-27, 2010-03-06修回基金项目:广东机电职业技术学院资助项目 (YJ200943 。作者简介:李建波 (1973— , 男, 河北栾城人, 讲师, 家电维修高级技师, 高级考评员, 在职博士, 主要从事自动控制、单片机教学与研究。

LCD1602汉字显示技术

在万年历中的应用及 Proteus 仿真

李建波 1,

2

(1. 华南理工大学聚合物新型成型装备国家工程研究中心广东广州 510640;

2. 广东机电职业技术学院计算机与信息工程系

广东广州 510515

摘要:LCD1602是一款最常用也是最便宜的液晶显示屏,由于内部没有汉字库,在界面和数据显示时,只能显示英文单词,对使用者要求较高,很不方便。本文介绍了LCD1602内部存储器,利用厂家留给用户自己定义点阵型显

示数据的 CGR AM 存储器,建立了自定义汉字点阵字库,在 Proteus 环境仿真显示了汉字,实际应用在带温度显示的万年历中,使其成为一款具有中文界面的显示器件。这种用法提供了良好的人机界面,不需要使用者有英文水平,降低了开发成本,而且可以更广泛的在智能仪表、通信和控制等领域推广。

关键词:字符型液晶;汉字显示;万年历;仿真

中图分类号:TP391.41

文献标识码:B

文章编号:1674-4896(2010 03-0036-03

36

个字节存储一个自定义字符代码,一共可容纳 8个自定义字符。这 8个字节所占的 CGRAM 具有同一个地址, 64个字节的地址共 8个,编码为 0~7 (用十六进制表达则为 0x00~0x07 。使用时,如果要显示某个自定义字符,只要将其在 CGRAM 中地址编码写入即可。

3汉字取模及 C 语言编程

3.1汉字取模

每个字节为 8个 bit ,当以 5×8点阵格式取模时,每个自己前 3个 bit 为零。以1表示亮, 0表示暗,汉字“ 年” “ 月” “ 日” 三个字取模如 (表 1 。

表 1汉字“ 年”“ 月”“ 日” 的取模

3.2汉字点阵数组的建立

单片机内部 RAM 空间不足,需要将汉字点阵数据以数组形式保存在程序存储器空间。

unsigned char code hanzi[][8]=

{

{0x04, 0x0f , 0x12, 0x0f , 0x0a , 0x1f , 0x0 2, 0x02}, //0年

{0x0f , 0x09, 0x0f , 0x09, 0x0f , 0x09, 0x1 3, 0x11}, //1月

{0x1f , 0x11, 0x11, 0x1f , 0x11, 0x11, 0x1f , 0x00}, //2日

...... //其他

}

3.3将自定义字型码装入 CGR AM 存储器

将汉字点阵数据装入装入 1602的 CGRAM 存储器,需要先写地址后写数据。可以反复写入, 但是同时最多只能写入 8个自定义字符。

延时子程序 :

void delay_ms(unsignedchar i

{

unsigned int j;

for(;i>0;i--

for(j=155;j>0;j--;

}

写指令进入 LCD1602子程序 :

void LCD_command(unsignedchar ch

{

P3=ch;//送信息

LCD_RS=0;LCD_RW=0;

LCD_E=0;delay_ms(2;

LCD_E=1;

}

把数据写入 LCD1602子程序 :

void LCD_data(unsignedchar ch

{

P3=ch;//送信息

LCD_RS=1;LCD_RW=0;

LCD_E=0;delay_ms(2;

LCD_E=1;

}

将自定义字型码装入 CGRAM 存储器子程序 : void Write_CGRAN( {

unsigned char i , j;

LCD_command(0x40;//先写命令,后写汉字 for(i=0;i<8;i++//i 表示第几个汉字for(j=0;j<8;j++//j 表示汉字的第几个字节 LCD_data(hanzi[i][j];

}

3.4液晶 1602显示子程序

将数据 ch 显示在第 i 行第 j 列的液晶显示子程序如下:

void LCD_dis(uchari , uchar j , uchar ch

{

uchar addr;

if(i==0addr =0x80+j;

第 3卷清远职业技术学院学报 2010年 37

else addr =0xc0+j;

LCD_command(addr;//先写地址 LCD_data(ch;//后送数据 }

4单片机与液晶接口及 Proteus 仿真 4.1AT89C52单片机与 1602接口

单片机采用直接驱动方式与 1602连接 (为了节省篇幅没有介绍时钟芯片

DS1302、没有介绍 P3口第二功能 ,电路图如图 2所示,引脚定义如下

sbit LCD_RS=P2^5; //RS1:DATA0:COMMANDsbit LCD_RW=P2^6;

//R/W1:READ0:WRITEsbit LCD_E=P2^7; //E1:ENABLE

图 2AT89C52单片机与 1602接口及仿真效果

4.2汉字显示仿真

如果显示汉字则需要将汉字所在 CGRAM 存储器编码代入到显示子程序。从3.2汉字点阵数组的建立和 3.3将自定义字型码装入 CGRAM 存储器

可以看出“ 年” 在 CGRAM 中编码为 0,

“ 月” 在 CGRAM 中编码为1, “ 日” 在 CGRAM 中编码为 2。

如果想将“ 年” 显示在第 0行第 4列,将“ 月” 显示在第 0行第 7列,将“ 日” 显示在第 0行第 10列,则代码如下

LCD_dis(0, 4, 0; //第 0行第 4列, “ 年” LCD_dis(0, 7, 1; //第 0行第 7列, “ 月” LCD_dis(0, 10, 2; //第 0行第 10列, “ 日” 在 Keil 中编辑编译,装载到 Proteus 中运行, 仿真结果如图 2所示。将生成的十六进制代码下载到单片机中,驱动液晶效果与仿真相同。 5结论

本文提出了利用字符型液晶显示汉字的思路, 采用手工提取汉字字模数据,并用C 语言编程将字模数据保存在 1602的 CGRAM 存储器,并在液

晶合适位置显示, 程序在 Proteus 环境仿真通过,

下载到单片机芯片中驱动液晶, 结果符合预期要求。

字符型液晶显示汉字的技术,为用户提供了良好的人机界面,降低了开发成本,降低了对使用者的使用要求,可以更广泛的在智能仪表、通信和控制等领域推广。

参考资料:

[1]于志赣 , 刘国平 , 张旭斌 . 液显 LCD1602模块的应用 [J].机电技术

[J],2009(3:21-23.

[2]

王立文 , 邵晓根 , 席建中 , 等 . LCD1602在温室 CO2增施控制器中的应用 [J].安徽农业科学 ,2008, (3:14822-14824. [3]

赵秋 . 利用 LCD1602的自定义字库显示汉字 [J].电子制作, 2008, (4:28-30.

[4]赵亮 . 液晶显示模块 LCD1602应用 [J].电子制作 ,2007,(3:58-59. [5]周润景 . 基于 PROTEUS 的电路及单片机系统设计与仿真 [M].

北京航空航天大学出版社 ,2006:1-6.

Application of Chinese Characters Display Technology of 1602in Calendar and Proteus Simulation

LI Jianbo 1,2

(1. National Engineering Research Center of Novel Equipment for Polymer Processing,

South China University of Technology, Guangzhou, 510640, China ; 2. Guangdong Jidian Polytechnic, Guangzhou , Guangdong , 510515, China

Abstract :LCD1602is a most common and the least expensive LCD screen. Because it lacked Chinese characters base,

it can only display English words, which cause inconvenience for users. This article describes the internal memory of the LCD1602, and how to use user -defined points of CGRAM memory which designed by manufacturers, to build their own character dot-matrix font. In the Proteus environment the Chinese characters are simulated, and used in the calendar with a temperature display, making it a display device with a Chinese language interface. This usage provides a good human-machine interface, lowers development costs, and widens its application in intelligent instrument, communication and control areas etc..

Keywords:character mode LCD ; characters display technology ; Calendar ; Simulation

总第 11期

李建波 LCD1602汉字显示技术在万年历中的应用及 Proteus 仿真第 3期 38

lcd12864并行数据传输汉字及图形显示程序

今天终于完成了12864带字库液晶模块的图象和中英文字母显示,图象显示显示了自己的一副照片,呵呵,还认得出是自己,开心啊。。。硬件连接方式是:并口直接访问。 这是汉字显示程序: #include #include #define uchar unsigned char #define datawr 0x1200 //写数据通道 #define comwr 0x1000 //写控制命令通道 #define datare 0x1300 //读数据通道 #define comre 0x1100 //读忙通道 uchar code disp_data[]={" 浙江大学 " //第一行,第一页 "04级通信工程一班" //第三行 " 宁波理工学院 " //第二行 " 竞赛小组 " //第四行 "128X64液晶显示器" //第一行,第二页 " 测试程序 " //第三行 " 07年07月25日 " //第二行 " Tornado "}; //第四行 void set12864(); void write_command(uchar command); void write_page(uchar data_add); void read_page(uchar data_add); void delays(uchar cont); void main() { while(1) { set12864(); //初始化12864 write_page(0); //写入一页数据 read_page(0x30); //读出一页数据到内部RAM delays(2); //延时2s write_page(64); //写入下一页数据 delays(2); //延时2s } }

LCD12864汉字显示

//在12864液晶上显示汉字和英文字符 /***********************头文件*********************/ #include "regx52.h" typedef unsigned char uchar; typedef unsignedintuint; sbitlcdrs=P1^5; //12864:0写指令,1写数据 sbitlcdwr=P1^6; //12864读写信号 sbitlcden=P1^7; //12864片选信号 uchar code tab[]={" ATI-51S"}; uchari; /***********************1ms延时函数**********************/ void delay(uint z) { uint y; while(z--) { for(y=0;y<125;y++); } } /***********************LCD写指令写数据**********************/ voidwrite_comdata(uchara,uchardatas) { lcdrs=a; lcdwr=0; delay(1); P0=datas; lcden=1; delay(1); lcden=0; } /***********************光标位置*********************/ void cursor(uchar x, uchar y ) { uchar address; switch(x){ case 0: address=0x80+y;break; case 1: address=0x90+y;break;

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

12864中文资料及字库说明书

FYD12864液晶中文显示模块 一、概述 FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: ●●低电源电压(VDD:+3.0--+5.5V) ●●显示分辨率:128×64点 ●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) ●●内置 128个16×8点阵字符 ●●2MHZ时钟频率 ●●显示方式:STN、半透、正显 ●●驱动方式:1/32DUTY,1/5BIAS ●●视角方向:6点 ●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选 ●●内置DC-DC转换电路,无需外加负压 ●●无需片选信号,简化软件设计 ●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 二、方框图

三、模块接口说明 *注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口

protues中无字库12864汉字显示程序

#include #define uint unsigned int #define uchar unsigned char void page(uchar ye); void lie(uchar lie); sbit reset1=P3^0; sbit rs=P3^7; sbit e=P3^5; sbit cs1=P3^3; sbit cs2=P3^4; sbit rw=P3^6; sbit busy1=P1^7; const uchar code hz[]={ /*-- 文字: 王--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, /*-- 文字: 者--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00, 0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00, /*-- 文字: 归--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFC,0x00,0x00,0xFF,0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00, 0x00,0x87,0x40,0x30,0x0F,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00, /*-- 文字: 来--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x08,0x08,0x28,0xC8,0x08,0x08,0xFF,0x08,0x08,0x88,0x68,0x08,0x08,0x00,0x00, 0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x11,0x21,0x21,0x00, /*-- 文字: 谁--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x42,0xCC,0x00,0x40,0x20,0xF8,0x4F,0x48,0x49,0xFE,0x48,0x48,0x48,0x08,0x00, 0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x22,0x22,0x22,0x3F,0x22,0x22,0x22,0x20,0x00, /*-- 文字: 的--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00, 0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00, /*-- 文字: 时--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00, 0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00, /*-- 文字: 代--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x80,0x60,0xF8,0x07,0x20,0x20,0x20,0x7F,0xA0,0x10,0x11,0x16,0x10,0x10,0x00, 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00, /*-- 文字: 大--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

LCD12864编码显示汉字

#include <> #include <> #define uint unsigned int #define uchar unsigned char #define DATA P0 //LCD12864数据线 sbit RS=P2^2; // 数据\指令选择 sbit RW=P2^1; // 读\写选择 sbit EN=P2^0; // 读\写使能 sbit CS1=P2^3; // 片选1 sbit CS2=P2^4; // 片选2 /********************************/ /* 定义中文字库*/ /********************************/ uchar code Hzk[]={ /*-- 文字: 各 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x20,0x20,0x10,0x08,0x8F,0xB4,0x44,0x44,0xA4,0x9C,0x04,0x00,0x00,0x00, 0x00, 0x02,0x02,0x02,0x01,0x7F,0x42,0x42,0x42,0x42,0x42,0x42,0x7F,0x01,0x03,0x01, 0x00, /*-- 文字: 位 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xC0,0x30,0xEC,0x03,0x2A,0xC8,0x09,0x0A,0x0E,0x08,0xE8,0x48,0x08,0x00, 0x00, 0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x27,0x20,0x30,0x2E,0x21,0x20,0x20,0x20, 0x00, /*-- 文字: 单 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0xF8,0x28,0x29,0x2E,0x2A,0xF8,0x28,0x2C,0x2B,0x2A,0xF8,0x00,0x00, 0x00, 0x08,0x08,0x0B,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x0B,0x08,0x08, 0x00, /*-- 文字: 机 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00, 0x00,

12864串行显示中文讲解

12864串行显示中文,按键选择显示页面,并且可调数值。 单片机P1口接矩阵按键,其它接口按程序中定义去接 只需要接12864LCD上GND VCC RS RW E PSB RST A K 程序如下 /********************************12864.h头文件*******************************/ #ifndef _12864_h #define _12864_h /*****包含头文件**************/ #include /********定义I/0口**********/ #define GPIO_KEY P1 sbit LCD12864_SCLK = P2^7; //E sbit LCD12864_SID = P2^5; //RW sbit LCD12864_CS = P2^6; //RS sbit LCD12864_RET= P2^0; sbit LCD12864_PSB =P2^2; /*声明全局变量*/ extern unsigned char keyvalue; /******声明全局函数*********/ void Delay1ms(unsigned int); //声明延时函数 unsigned char KeyDown(void); void LCD_sendbyte(unsigned char); void WrCom(unsigned char); void WrDat(unsigned char); void LcdInit(void); //void Print(unsigned char); void SetAddress( unsigned char,unsigned char ); void DisplayString(unsigned char x ,unsigned char y,unsigned char *add); #endif /********************************12864.C*************************************/ #include"12864.h" #include #include"string.h" //#define LCM_ST7920_FIRST_LINE_ADDRESS 0x80 //#define LCM_ST7920_SECOND_LINE_ADDRESS 0x90 //#define LCM_ST7920_THIRD_LINE_ADDRESS 0x88 //#define LCM_ST7920_FOURTH_LINE_ADDRESS 0x98

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

12864液晶显示程序(图案+文字)

#include sbit LCD12864_RS = P2^0; //RS控制引脚 sbit LCD12864_RW = P2^1; //RW控制引脚 sbit LCD12864_EN = P2^2; //EN控制引脚 sbit LCD12864_PSB = P2^3; //模式选择引脚,ST7920控制器,1为8位并行接口,0为串行接口 #define LCDPORT P0//数据引脚 void LCD12864_Init(void); //LCD12864初始化函数 void LCD12864_WriteInfomation(unsigned char ucData,bit bComOrData); //向LCD12864写入数据,bComOrData为1时写入的是数据,0时写入的是命令 void LCD12864_CheckBusy(void);//忙检测函数 void LCD12864_DisplayImage(unsigned char code *ucImage); void Delay(unsigned int uiCount); unsigned char code ucPic1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

51单片机12864显示汉字画图画点常用例程

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 ////////////////////////////////画点例程////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////以下是主文件main.c 的内容 #include #include"lcd12864.h" //--声明全局函数--// void Delay10ms(unsigned int c); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main() { while(1) { LCD12864_ClearScreen(); LCD12864_DrowPoint(127,63); while(1); } } /****************************************************************************** * * 函数名: Delay10ms * 函数功能: 延时函数,延时10ms * 输入: 无 * 输出: 无 ******************************************************************************* / void Delay10ms(unsigned int c) //误差0us

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

12864程序,字库与自定义字符的显示

/*------------------------------------ 12864并口输入,在输入输出数据是注意时序 之前由于忙检测时序写错,而无法显示字库文字 自定义字符注意地址与编码方式对应,不然会 显示乱码 --------------------------------------*/ #include sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit RES = P2^3; sbit PSB = P2^1; #define data_port P0 #define uchar unsigned char #define uint unsigned int uchar code display[]={"西华"}; uchar code user[]={ /*-- 文字: 我--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48, 0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02 }; uchar code user1[]={ /*-- 文字: 你--*/ /*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x38,0x11,0xC8,0x32,0x10,0x50,0x40, 0x90,0x40,0x12,0x50,0x12,0x4C,0x14,0x44,0x11,0x40,0x10,0xC0,0x00,0x00,0x00,0x00 }; void delay(uint xms) { uint i,j; for(i=0;i

不带字库的12864液晶汉字显示程序

不带字库的128*64液晶汉字显示程序 下面是线路连接图,我自己已经搞了整整一个测试成功了绝对可用 由于篇幅有限完整的c51代码下载: https://www.wendangku.net/doc/f72283902.html,/f/12864wu.rar 源代码: #include; #define LCD P0 unsigned char i,j,k; sbit EN=P2^0;

sbit RW=P2^1; sbit RS=P2^2; sbit CS1=P2^3; sbit CS2=P2^4; sbit BUSY=P0^0; void delay(unsigned char a); unsigned char code ban[16][16]={ {0x00,0x00,0x00,0xf0,0x90,0x90,0x90,0xfe,0x90,0x9 0,0x90,0xf0,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x3f,0x24,0x2 4,0x24,0x27,0x20,0x38,0x00,0x00},//电 {0x00,0x00,0x00,0x00,0x8c,0x88,0x88,0x88,0x88,0xc 8,0xa8,0x98,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x7f,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00},//子 {0x00,0x00,0x00,0x00,0x10,0x10,0x30,0x54,0x9c,0x9 0,0x50,0x00,0x30,0x10,0x00,0x00}, {0x00,0x40,0x30,0x0c,0x03,0x01,0x01,0x01,0x01,0x0 1,0x01,0x01,0x01,0x00,0x00,0x00},//产 {0x00,0x00,0x00,0x00,0x7c,0x44,0x44,0x44,0x44,0x4 4,0x44,0x7c,0x00,0x00,0x00,0x00}, {0x00,0x00,0x3f,0x21,0x21,0x21,0x3f,0x00,0x00,0x3

12864液晶显示汉字

单片机综合实训题目:12864液晶显示 专业:电气工程与自动化 班级:自动化12-13班 姓名:刘子欧 学号:04121737

1.1 基于单片机控制液晶显示系统的设计任务 设计一款基于单片机AT89S51液晶滚动显示系统。 1.2 系统设计要求 (1)通过单片机的控制使液晶进行滚动显示学校。 (2)通过单片机的控制使液晶进行滚动显示专业。 (3)通过单片机的控制使液晶进行滚动显示姓名。 (4)通过单片机的控制使液晶进行滚动显示学号。 1.3 系统设计思路 根据系统设计要求,初步思路如下: (1)通过单片机最小系统的控制使液晶进行滚动显示。 (2)液晶模块采用LCD12864。 (3)系统采用并口连接方式。 (4)通过驱动ST7920控制器使用其自带字库来提取所需文字。 二、液晶显示控制电路与程序方案设计 2.1系统设计思路与框图 液晶显示器YM12864R 的控制器ST7920 可以显示字母、数字符号、中文字型及自定图形显示,只要一个最小的微处理系统,将液晶显示模块的接口作为I/O 设备直接与之连接,就可以进行控制液晶显示器和数据传输,从而达到理想的显示效果。使用P3 口给液晶显示器提供控制信号,P0 口给液晶显示器传送数据。YM12864R 液晶显示器的控制信号有PSB、RS、R/W、E,其中RS、R/W、E分别对应接在AT89C51 的P3.0、P3.1、P3.2、P2.3 上,在本次设计中采用并行接口,故PSB接高电平,而8位数据口DB0~ DB7对应接在P0 口上。背光灯的电源正极、液晶显示器模块的电源正极以及LCD 驱动电压输入端都接在+5V 的稳压电源上。背光灯负极和模块的电源负极统一接地。液晶显示器模块的复位脚连接开关按纽与地相连。选择按键接高电平,即可实现单片机对液晶显示汉字的控制。 系统设计图框如下图2.1所示,主要由单片机的最小系统AT89C51、YM12864R 液晶显示电路及外围电路构成。

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

相关文档
相关文档 最新文档