课程设计说明书12864LCD显示汉字
- 格式:doc
- 大小:933.63 KB
- 文档页数:19
程序:#include<A T89X52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define LCD_databus P0sbit RS=P2^2; /*复位信号*/sbit RW=P2^1; /*读/写选择*/sbit EN=P2^0; /*读/写使能*/sbit CS1=P2^4; /*片选1*/sbit CS2=P2^3; /*片选2*/void delay(int x) /*延时程序*/{while(x--);}void Read_busy() /*状态检查,LCD是否忙*/{P0=0X00;RS=0;RW=1;EN=1;while(P0&0x80);EN=0;}void write_LCD_command(uchar value) /*写命令*/ {Read_busy();RS=0;RW=0;LCD_databus=value;EN=1;_nop_();_nop_();EN=0;}void write_LCD_data(uchar value) /* 根据时序图写程序*/ {Read_busy();RS=1;RW=0;LCD_databus=value;EN=1;_nop_();_nop_();EN=0;}void Set_page(uchar page) /* 选择页,页地址起始0xb8*/ {page=0xb8|page;write_LCD_command(page);}void Set_line(uchar startline) /* 选择行,页地址起始0xc0*/ {startline=0xc0|startline;write_LCD_command(startline);}void Set_column(uchar column) /* 选择列,页地址起始0x3f*/ {column=column&0x3f;column=0x40|column;write_LCD_command(column);}void Setonoff(uchar onoff){onoff=0x3e|onoff;write_LCD_command(onoff);}void SelectScreen(uchar screen) /* 选择屏*/{switch(screen){case 0:CS1=0;CS2=0;break; /* 选择左右屏*/case 1:CS1=0;CS2=1;break; /* 选择左屏*/case 2:CS1=1;CS2=0;break; /* 选择右屏*/default:break;}}void ClearScreen(uchar screen) /* 清屏*/{uchar i,j;SelectScreen(screen);for(i=0;i<8;i++){Set_page(i);Set_column(0);for(j=0;j<64;j++){write_LCD_data(0x00);}}}void initLCD() /* 液晶初始化*/{Read_busy();SelectScreen(0);Setonoff(0);SelectScreen(0);Setonoff(1);SelectScreen(0);ClearScreen(0);Set_line(0);}void Display(uchar ss,uchar page,uchar column,uchar *p) /* 显示*/{uchar i;SelectScreen(ss);Set_page(page);Set_column(column);for(i=0;i<16;i++){write_LCD_data(p[i]);}Set_page(page+1);Set_column(column);for(i=0;i<16;i++){write_LCD_data(p[i+16]);}}unsigned char code chong[]={/*-- 文字: 重--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFE,0xAA,0xAA,0xA9,0xF9,0x29,0x0C,0x08,0x00, 0x40,0x40,0x48,0x4B,0x4A,0x4A,0x4A,0x7F,0x4A,0x4A,0x4A,0x4B,0x48,0x60,0x40,0x00};unsigned char code qing[]={/*-- 文字: 庆--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x45,0xFE,0x44,0x44,0x44,0x66,0x44,0x00,0x00,0x40,0x20,0x9F,0x80,0x40,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0xC0,0x40,0x00};unsigned char code wen[]={/*-- 文字: 文--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x08,0x18,0x68,0x88,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x0C,0x08,0x00,0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x10,0x20,0x40,0xC0,0x40,0x00};unsigned char code li[]={/*-- 文字:理--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x44,0x44,0xFC,0x46,0x44,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0xFF,0x02,0x00,0x00,0x10,0 x30,0x1F,0x08,0x48,0x48,0x44,0x44,0x44,0x7F,0x44,0x46,0x44,0x60,0x40,0x00};unsigned char code xue[]={/*-- 文字: 学--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,0x04,0x 04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00};unsigned char code yuan[]={/*-- 文字: 院--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x22,0x5A,0x96,0x0C,0x24,0x24,0x25,0x26,0x24,0x34,0xA4,0x14,0x0C,0x00,0x00, 0xFF,0x04,0x08,0x87,0x81,0x41,0x31,0x0F,0x01,0x3F,0x41,0x41,0x41,0x70,0x00};unsigned char code dian[]={/*-- 文字: 电--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00};unsigned char code zi[]={/*-- 文字: 子--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x80,0xC0,0x80,0x00,0x00,0 x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsigned char code qi[]={/*-- 文字: 气--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x20,0x58,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x14,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x80,0x70,0x00};unsigned char code gong[]={/*-- 文字: 工--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x20,0x 20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00};unsigned char code cheng[]={/*-- 文字: 程--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x24,0x24,0xA4,0xFE,0xA3,0x22,0x20,0x7E,0x42,0x42,0x42,0x42,0x42,0x7F,0x02,0x00,0x08,0 x06,0x01,0xFF,0x00,0x43,0x41,0x49,0x49,0x49,0x7F,0x49,0x4D,0x69,0x41,0x00};unsigned char code yu[]={/*-- 文字: 与--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xCC,0x88,0x00,0x00,0x08,0 x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x4C,0x88,0x40,0x3F,0x00,0x00,0x00};unsigned char code zhi[]={/*-- 文字: 自--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x10,0x08,0xFC,0x8A,0x89,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0xFF,0x00,0x00,0x00,0x 00};unsigned char code dong[]={/*-- 文字: 动--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x24,0x24,0xE4,0x26,0x34,0x20,0x10,0x10,0xFF,0x10,0x10,0x10,0xF8,0x10,0x00,0x08,0x1C,0x0B,0x08,0x08,0x8A,0x4C,0x30,0x0C,0x03,0x40,0x80,0x40,0x3F,0x00, 0x00};unsigned char code hua[]={/*-- 文字: 化--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0x20,0xF8,0x07,0x00,0x00,0x00,0xFF,0x40,0x20,0x10,0x18,0x00,0x00,0x00,0x00,0x 00,0x00,0xFF,0x00,0x04,0x02,0x01,0x3F,0x40,0x40,0x40,0x40,0x40,0x70,0x00};unsigned char code hu[]={/*-- 文字: 胡--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0xFF,0x10,0x90,0x18,0x10,0xFE,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,0x 00,0x7F,0x21,0x21,0x21,0x7F,0x81,0x40,0x3F,0x02,0x42,0x82,0x7F,0x00,0x00};unsigned char code jie[]={/*-- 文字: 杰--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x08,0x88,0x48,0x28,0x18,0xFF,0x18,0x28,0x48,0x88,0x08,0x0C,0x08,0x00,0x02,0x 82,0x71,0x00,0x00,0x10,0x60,0x07,0x10,0x60,0x00,0x10,0x21,0xC3,0x01,0x00};unsigned char code ling[]={/*-- 文字: 0 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xE0,0xF0,0x18,0x0C,0x04,0x04,0x04,0x0C,0x18,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x18,0x30,0x20,0x20,0x20,0x30,0x18,0x0F,0x07,0x00,0x00};unsigned char code jiu[]={/*-- 文字: 9 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x04,0x0D,0x19,0x12,0x19,0x0F,0x07,0x00,0x00,0x00,0x00};unsigned char code yi[]={/*-- 文字: 1 --*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00};unsigned char code ban[]={/*-- 文字: 班--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x84,0x84,0xFC,0x84,0x06,0xF4,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x86,0x84,0x00,0x20,0 x60,0x3F,0x10,0x92,0x41,0x38,0x07,0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00};unsigned char code dan[]={/*-- 文字: 单--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xFC,0x08,0x00,0x00,0x10, 0x10,0x17,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x18,0x10,0x00};unsigned char code pian[]={/*-- 文字: 片--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x80,0x 40,0x3F,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00};unsigned char code ji[]={/*-- 文字: 机--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,0x00,0x00,0x04,0x03,0x00,0xFF,0x80,0x41,0x20,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x70,0x00};unsigned char code zuo[]={/*-- 文字: 作--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0x20,0xF8,0x87,0x40,0x30,0x0F,0xF8,0x88,0x88,0xC8,0x88,0x0C,0x08,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x0C,0x08,0x00,0x00};unsigned char code ye[]={/*-- 文字: 业--*//*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x60,0x80,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xC0,0x30,0x00,0x00,0x40, 0x40,0x40,0x47,0x40,0x7F,0x40,0x40,0x40,0x7F,0x44,0x43,0x40,0x60,0x40,0x00};void main(){initLCD();ClearScreen(0);Set_line(0);Display(1,0,1*16,chong);Display(1,0,2*16,qing);Display(1,0,3*16,wen);Display(2,0,0*16,li);Display(2,0,1*16,xue); Display(2,0,2*16,yuan); Display(1,2,0*16,dian); Display(1,2,1*16,zi); Display(1,2,2*16,dian); Display(1,2,3*16,qi); Display(2,2,0*16,gong); Display(2,2,1*16,cheng); Display(2,2,2*16,xue); Display(2,2,3*16,yuan); Display(1,4,0*16,dian); Display(1,4,1*16,qi); Display(1,4,2*16,gong); Display(1,4,3*16,cheng); Display(2,4,0*16,yu); Display(2,4,1*16,zhi); Display(2,4,2*16,dong); Display(2,4,3*16,hua); Display(1,6,3*16,hu); Display(2,6,0*16,jie); delay(50000);initLCD();ClearScreen(0);Set_line(0);Display(1,2,1*16,dan); Display(1,2,2*16,pian); Display(1,2,3*16,ji); Display(2,2,0*16,zuo); Display(2,2,1*16,ye); Display(1,4,1*16,ling); Display(1,4,2*16,jiu); Display(1,4,3*16,dian); Display(2,4,0*16,qi); Display(2,4,1*16,yi); Display(2,4,2*16,ban); delay(50000);}取字软件:PCTOLCD2002。
摘要因为汉字本身的特点,显示汉字始终是计算机在我国应用普及的一个障碍。
随着单片机和显示技术的发展,加上人们不满足单片机系统采用LED 数码管的简单显示,利用单片机控制液晶显示成为当前显示系统的主流。
本文主要介绍了89S52 单片机为控制设备,液晶显示器为显示设备。
实现的一个可以显示汉字、字符和动态显示汉字的液晶显示器设备。
通过汉字显示程序的地址,接着运行相应的程序取汉字机内码和西文字符的ASCII 码,并在存储器中进行寻址找出相对应的显示代码或汉字字模,提取后作为阵显示信息送液晶显示器显示。
再者通过按键控制可以实现显示的汉字左右移动。
利用液晶显示器显示汉字操作灵活,汉字显示果可以大大提高。
关键词液晶显示点阵显示单片机Because of the characteristics of Chinese characters, displaying Chinese characters itself isalways computer is applied in our country popularity of an obstacle. With single-chip microcomputerand display technology development, and people don't satisfy SCM system using LED digital display,use simple tube of single-chip microcomputer control LCD display currently become the mainstreamof the display system. This article mainly introduced the 89S52 of control equipment, LCD monitorsfor display device. Implements a can display Chinese characters, characters and dynamic display ofChinese LCD equipment. Through Chinese displaying a program's address, and then run thecorresponding program take Chinese characters Machine code and cataloguing of ASCII characters,and in storage addressing find corresponding display code or Chinese character, after extractionword-model as Array display information sent LCD display. Moreover through button control can berealized display characters move around. Using LCD display characters operation is flexible andChinese displaying fruit can improve greatly.Keywords LCD dot matrix display button control目录第一章绪论1.1 液晶显示的发展趋势和介绍第二章系统总体设计2.1 简介2.2 电路硬件原理图2.3 软件设计方案2.4 仿真结果第三章ATMEL 89S52系列单片机3.1 A T89S52单片机内部的组成结果图3.2 单片机CPU结构3.3 AT89S52用户系统3.4 引脚介绍第四章液晶12864LCD (8)4.1 12864 液晶显示模块概述 (8)4.2 模块引脚说明 (9)4.3 资料传输与接口时序 (9)4.4 12864LCD模块指令 (11)4.5 显示步骤 (14)3.4 汉字显示设计 (15)3.4.1 开发板的介绍 (15)3.4.2 汉字液晶显示介绍 (15)3.4.3 汉字液晶显示设计分析 (16)3.4.4 程序分析及显示成果 (18)3.4.5 程序及调试 (20)4结论 (21)参考文献 (22)附录一程序 (23)附录二、字符表与地址坐标 (28)附录三、显示结果 (29)3.1 单片机51 单片机:单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
12864中文字库液晶模块使用说明书第 1 页共16 页一、12864液晶显示模块概述1. 12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。
具有多种功能:光标显示、画面移位、睡眠模式等。
2. 外观尺寸:93×70mm(4X8C), 84×44mm(2X8C),110×65mm(2x8 C _2), 116×39mm(2X10),180×65mm(4X16A)3. 视域尺寸:73×39mm(4X8C), 78×25mm(2x8 C _2), 70×20mm(2X8C),85×20mm(2X10), 132×39mm(4X16A),补充说明:外观尺寸可根据用户的要求进行适度调整。
二、模块引脚说明1)表—1:(128X32)、(160X32)模块引脚说明引脚名称 方向 说明 引脚名称方向 说明1 VSS - GND(0V) 11 DB4 I/O 数据42 VDD - Supply Voltage For Logic (+5v) 12 DB5 I/O 数据53 VO - Supply Voltage For LCD (悬空)13 DB6 I/O 数据64 RS(CS) H/L H: Data L: Instruction Code 14 DB7 I/O 数据75 R/W(STD) H/L H: Read L: Write15 PSB H/L 16032此脚为:RESET脚 6 E(SCLK) H,H/L Enable Signal7 DB0 I/O 数据0 16 /RST H/L 16032此脚为空8 DB1 I/O 数据1 17 LEDK - 16032此脚为A9 DB2 I/O 数据2 18 LEDA - 16032此脚为K10 DB3 I/O 数据3 注:以上K为负,A为正4)表—4:(256X64)引脚说明引脚名称 方向 说明引脚名称 方向 说明 1 FG - FRAME GROUND 11 DB0 I/O 数据0 2 VSS - GND(0V)12 DB1 I/O 数据1 3 VDD - Supply Voltage For Logic (+5v) 13 DB2 I/O 数据2 4 NC - 空脚14 DB3 I/O 数据3 5 R/W H/L H: Read L: Write 15 DB4 I/O 数据4 6 E1 H,H/L Enable Signal1 16 DB5 I/O 数据5 7 E2 H,H/L Enable Signal217 DB6 I/O 数据6 8 RS H/L H: Data L: Instruction Code 18 DB7 I/O 数据7 9 NC - 空脚19 NC - 空脚 10 /RST H/L Reset Signal 低电平有效 20 NC - 空脚注 K背光源负极(LED-OV)A背光源正极(LED+5V)三、12864液晶硬件接口1、逻辑工作电压(VDD):4.5~5.5V2、电源地(GND):0V3、LCD 驱动电压(V0):0~-10V4、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温) 保存温度(Tstg):-10~65℃(常温)5、电气特性见附图1 外部连接图(参考附图2)模块有并行和串行两种连接方法(时序如下): 1、8位并行连接时序图MPU 写资料到模块RSR/WEMPU从模块读出资料RSR/WE2、串行连接时序图CS C LS T3、AC电气特性(TA=25℃ VCC=5V)condition Min. Typ. Max. UnitSYMBOL Characteristics Testfrequency Rf=39KΩ480 540 600 KHz Fosc OSCTIME UNIT PARAMETER SYMBOL MESUREFOR WRITE MODE(WRITING DATA FROM MPU TO ST7920)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDSW 1,000 nsData hold time TH 20 nsEnable pulsewidth TPW 1,500 nsEnable rise/fall time TR,TF 25 nsFOR READ MODE(READING DATA FROM ST7920 TO MPU)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDDR 1,000 nsData hold time TH 20 ns Enable pulsewidth TPW 1,500 ns Enable rise/fall time TR,TF 25 ns四、用户指令集指令表—2:(RE=1:扩充指令集)指令码指令RS RW DB7 DB6 DB5DB4 DB3 DB2DB1DB0说明执行时间(540KHZ )待命模式 0 0 0 0 0 0 0 0 0 1将DDRAM 填满“20H ”,并且设定DDRAM 的地址计数器(AC )到“00H ” 72us卷动地址或IRAM 地址选择 0 0 0 0 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM 地址72us反白选择 0 0 0 0 0 0 0 1 R1 R0选择4行中的任一行作反白显示,并可决定反白与否 72us 睡眠模式0 0 0 0 0 0 1 SL X XSL=1:脱离睡眠模式 SL=0:进入睡眠模式72us扩充功能设定0 0 0 0 1 1 X1REG 0RE=1:扩充指令集动作RE=0:基本指令集动作G=1 :绘图显示ONG=0 :绘图显示OFF72us设定IRAM地址或卷动地址0 0 0 1 AC5AC4 AC3 AC2AC1AC0SR=1:AC5—AC0为垂直卷动地址SR=0:AC3—AC0为ICON IRAM地址72us设定绘图RAM地址0 0 1 AC6 AC5AC4 AC3 AC2AC1AC0设定CGRAM地址到地址计数器(AC)72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
《单片机原理及应用》课程设计题目128*64点阵LCD的显示院系信息学院专业通信工程姓名XXX学号XXXXX指导老师XXX报告日期2009.09.101.题目:128*64点阵LCD的显示2.原理简述12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
(少数厂商为了简化用户设计,在模块中增加译码电路,使得128*64液晶屏就是一个整屏,只需一个片选信号。
)显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(需要注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
以下是我写的12864LCD并行口显示程序,矩阵键盘接的是P1口,P0口接LCD上DB0~ DB7。
/***************头文件******************************/#define _12864_h/*****包含头文件**************/#include<reg51.h>/********定义I/0口**********/#define LCD12864_DATA P0#define GPIO_KEY P1sbit LCD12864_E = P2^7;sbit LCD12864_RW = P2^5;sbit LCD12864_RS = P2^6;sbit LCD12864_RET= P2^0;sbit LCD12864_PSB =P2^2;/*声明全局变量*/extern unsigned char keyvalue;/******声明全局函数*********/void Delay1ms(unsigned int); //声明延时函数unsigned char KeyDown(void);void BusyChk_12864(void); //声明忙检测函数void WrCom(unsigned char); //声明写入命令函数//unsigned char ReDat(void); //声明读数据函数void WrDat(unsigned char); //声明写数据函数void LcdInit(void); //12864初始化函数void SetAddress(unsigned char ,unsigned char); //设置地址转换void DisplayString(unsigned char ,unsigned char,unsigned char *p);//行显示字符#endif//***************************12864.c文件*****************************//#include"12864.h"#include<reg51.h>#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/*定义全局变量*/unsigned char keyvalue=0;/****************************************************************************** ** 函数名: Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出 e : 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。
12864串行显示中文,按键选择显示页面,并且可调数值。
单片机P1口接矩阵按键,其它接口按程序中定义去接只需要接12864LCD上GND VCC RS RW E PSB RST A K程序如下/********************************12864.h头文件*******************************/ #ifndef _12864_h#define _12864_h/*****包含头文件**************/#include<reg51.h>/********定义I/0口**********/#define GPIO_KEY P1sbit LCD12864_SCLK = P2^7; //Esbit LCD12864_SID = P2^5; //RWsbit LCD12864_CS = P2^6; //RSsbit 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<reg51.h>#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/*定义全局变量*/unsigned char keyvalue=0;/****************************************************************************** ** 函数名: Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出 e : 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。
#include<stdio.h>#include<reg52.h>#include<math.h>#include<intrins.h>sbit RS=P0^0;sbit RW=P0^1;sbit E=P0^2;sbit PSB=P0^3;sbit RES=P0^4;#define LCD12864_DatePort P2unsigned char lcd_x,lcd_y;unsigned char h[]={"aaaaaaaaaaaaaaaa"};unsigned char code image[1024]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x1F,0xC1,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0xFF,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x01,0xFF,0xFE,0x1F,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x3F,0xFF,0xFF,0x00,0x00,0x07,0xFF,0xFF,0x9E,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x7F,0xFF,0xFF,0x80,0x00,0x0F,0xFF,0xFF,0xEC,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0xFF,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFF,0xE0,0x40,0x00,0x00,0x00,0x00, 0x00,0x01,0xFF,0x3E,0x3F,0xC0,0x00,0x1F,0xE3,0xE7,0xF0,0x80,0x00,0x00,0x00,0x00, 0x00,0x01,0xFE,0x1E,0x1F,0xE0,0x00,0x3F,0xE3,0xC3,0xF9,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0xFC,0x1C,0x1F,0xE0,0x00,0x3F,0xC1,0xC3,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0xFC,0x6D,0x9F,0xF0,0x00,0x7F,0xC1,0x81,0xFE,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0xFC,0x6D,0x8F,0xF0,0x00,0x7F,0xCD,0xB1,0xFE,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0xFC,0x6D,0x9F,0xF0,0x00,0x7F,0xCF,0xB1,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0xFC,0x1C,0x1F,0xF0,0x00,0xFF,0xC5,0xF3,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0xFE,0x1E,0x1F,0xF8,0x00,0xFF,0xE3,0xC3,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0xFF,0x3E,0x3F,0xF8,0x00,0xFF,0xE3,0xE7,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFF,0xF3,0xFF,0xF8,0x00,0xFF,0xFE,0x7F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0xC1,0xCF,0xFC,0x00,0xFF,0x9C,0x38,0xFF,0x80,0x00,0x00,0x00,0x00, 0x00,0x0F,0xE0,0x7F,0x83,0xFC,0x01,0xFE,0x0F,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00, 0x00,0x1F,0xFF,0x00,0x3F,0xFC,0x01,0xFF,0xE0,0x07,0xFF,0x80,0x00,0x00,0x00,0x00, 0x00,0x1F,0xFF,0xFB,0xFF,0xFC,0x01,0xBF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00, 0x00,0x1F,0xFF,0xFF,0xFF,0xFC,0x01,0xDF,0xFF,0xFF,0xFB,0x80,0x00,0x00,0x00,0x00, 0x00,0x3F,0xFF,0xFF,0xFF,0xFC,0x03,0xC7,0xFF,0xFF,0xE7,0x80,0x00,0x00,0x00,0x00, 0x00,0x7F,0xFF,0xFF,0xFF,0xFC,0x07,0xC1,0xFF,0xFF,0x8F,0xC0,0x00,0x00,0x00,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xE0,0x3F,0xFC,0x3F,0xC0,0x00,0x00,0x00,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xF8,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00, 0x01,0xFC,0x7F,0xFF,0xFF,0x3F,0x1F,0x8E,0x00,0x00,0xE3,0xF0,0x00,0x00,0x00,0x00, 0x03,0xF8,0x7F,0xFF,0xFC,0x1F,0xBF,0x87,0xC8,0x1F,0x83,0xF0,0x00,0x00,0x00,0x00, 0x03,0xF8,0x7F,0xFF,0xE0,0x1F,0xFF,0x87,0xFF,0xFC,0x01,0xF8,0x00,0x00,0x00,0x00, 0x03,0xF8,0x7F,0x00,0x00,0x1F,0xFF,0x04,0xE0,0x00,0x01,0xF8,0x00,0x00,0x00,0x00, 0x07,0xF8,0x7F,0x00,0x00,0x0F,0xFF,0x04,0x60,0x00,0x01,0xF8,0x00,0x00,0x00,0x00, 0x07,0xF8,0x7F,0x00,0x00,0x0F,0xFF,0x0C,0x60,0x00,0x01,0xFC,0x00,0x00,0x00,0x00, 0x07,0xF8,0x7F,0x00,0x00,0x0F,0xFF,0x0C,0x60,0x00,0x01,0xFC,0x00,0x00,0x00,0x00, 0x07,0xF8,0x7F,0x00,0x00,0x0F,0xFF,0x06,0x60,0x00,0x01,0xFC,0x00,0x00,0x00,0x00, 0x07,0xB8,0x3E,0x00,0x00,0x19,0xF3,0x87,0xE0,0x00,0x01,0xBC,0x00,0x00,0x00,0x00, 0x07,0x18,0x00,0x00,0x00,0x18,0xE3,0x80,0x00,0x00,0x01,0x18,0x00,0x00,0x00,0x00, 0x00,0x1C,0x00,0x00,0x00,0x10,0x01,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x00,0x00,0x00,0x30,0x01,0xC0,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x60,0x00,0xE0,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x70,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x80,0x00,0x00,0xC0,0x00,0x78,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, 0x00,0x0D,0xE0,0x00,0x03,0xB8,0x01,0x9C,0x00,0x00,0x3B,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x78,0x00,0x0F,0x7C,0x03,0xCF,0x00,0x00,0xE7,0x80,0x00,0x00,0x00,0x00, 0x00,0x10,0x1C,0x00,0x3E,0xFC,0x03,0xF3,0xE0,0x03,0xDF,0x80,0x00,0x00,0x00,0x00, 0x00,0x1A,0x0B,0xC1,0xE3,0xF8,0x01,0xF8,0xFC,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xF1,0x80,0xEF,0xE0,0x00,0x7F,0xF0,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};void delay_ms(unsigned char z) //延时{unsigned i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}void LCD12864_WriteCmd(unsigned int cmd) //写命令{RS=0;RW=0;E=0;LCD12864_DatePort=cmd;delay_ms(5);E=1;delay_ms(5);E=0;}void LCD12864_WriteDate(unsigned char dat) //写数据{RS=1;RW=0;E=0;LCD12864_DatePort=dat;delay_ms(5);E=1;delay_ms(5);E=0;}void LCD12864_Init(){PSB=1; //1并行,0串行LCD12864_WriteCmd(0x30); //基本指令操作//delay_ms(5);LCD12864_WriteCmd(0x0c); //显示开,关光标//delay_ms(5);LCD12864_WriteCmd(0x01); //清除led的显示内容//delay_ms(5);LCD12864_WriteCmd(0x06);}/*====================================================函数功能:清除GCROM的内容,如果不清除会出现花屏现象清除方法:向GCROM中写入0x00来清除内========================================================*/ void LCD12864_ClearGDRAM(){unsigned char i,j,k;lcd_x=0x80;lcd_y=0x80;LCD12864_WriteCmd(0x34);for(i=0;i<2;i++){for(j=0;j<32;j++){LCD12864_WriteCmd(lcd_y+j);LCD12864_WriteCmd(lcd_x);for(k=0;k<16;k++){LCD12864_WriteDate(0x00);}}lcd_x=0x88;}LCD12864_WriteCmd(0x36);LCD12864_WriteCmd(0x30);}/*================================================================ 函数功能:向12864中写入一幅图片函数参数:lcd_x为水平显示位置,lcd_y为垂直显示位置,函数将12864屏分成上下两屏写入,上半屏LCD_x=0x80,下半屏lcd_x=0x88=================================================================*/ void LCD12864_WriteImage(unsigned char *p){unsigned char i,j,k;lcd_x=0x80;lcd_y=0x80;LCD12864_WriteCmd(0x34);for(i=0;i<2;i++) //分为上下两屏{for(j=0;j<32;j++){LCD12864_WriteCmd(lcd_y+j);LCD12864_WriteCmd(lcd_x);for(k=0;k<16;k++) //写入显示数据{LCD12864_WriteDate(*p++);}}lcd_x=0x88;}LCD12864_WriteCmd(0x36);LCD12864_WriteCmd(0x30);}bit LCD12864_CheckBusy() //读忙碌状态{bit i;RS=0;RW=1;E=1;LCD12864_DatePort=0xff;delay_ms(1);i=(bit)(LCD12864_DatePort&0x80);E=0;return(i);}unsigned char LCD12864_ReadByte( void ){unsigned char ReturnValue ;LCD12864_CheckBusy() ;LCD12864_DatePort = 0xff ;RS=1;RW=1;E=0;E=1;ReturnValue =LCD12864_DatePort;E=0;return ReturnValue ;}void LCD12864_DrawPoint( unsigned char X, unsigned char Y, unsigned char Color ) {unsigned char Row , Tier , Tier_bit ;unsigned char ReadOldH, ReadOldL ;LCD12864_WriteCmd( 0x34 ) ;LCD12864_WriteCmd( 0x36 ) ;Tier = X >> 4 ;Tier_bit = X & 0x0f ;if( Y < 32 ){Row = Y ;}else{Row = Y - 32 ;Tier += 8 ;}LCD12864_WriteCmd( Row + 0x80 ) ;LCD12864_WriteCmd( Tier + 0x80 ) ;LCD12864_ReadByte();ReadOldH = LCD12864_ReadByte() ;ReadOldL = LCD12864_ReadByte() ;LCD12864_WriteCmd( Row + 0x80 ) ;LCD12864_WriteCmd( Tier + 0x80 ) ;if( Tier_bit < 8 ){switch( Color){case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ;case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit )) ; break ;default : break ;}LCD12864_WriteDate( ReadOldH ) ;LCD12864_WriteDate( ReadOldL ) ;}else{switch(Color){case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit )) ; break ;case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;default : break ;}LCD12864_WriteDate( ReadOldH ) ;LCD12864_WriteDate( ReadOldL ) ;}LCD12864_WriteCmd( 0x30 ) ;}void LCD12864_DrawLine_X( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color ){ unsigned char Temp ;if( X0 > X1 ){Temp = X1 ;X1 = X0 ;X0 = Temp ;}for( ; X0 <= X1 ; X0++ )LCD12864_DrawPoint( X0, Y, Color ) ;}void LCD12864_DrawLine_Y( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color ){unsigned char Temp ;if( Y0 > Y1 ){Temp = Y1 ;Y1 = Y0 ;Y0 = Temp ;}for(; Y0 <= Y1 ; Y0++)LCD12864_DrawPoint( X, Y0, Color) ;}void LCD12864_DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color ){int t, distance; /*根据屏幕大小改变变量类型(如改为int型)*/int x = 0 , y = 0 , delta_x, delta_y ;char incx, incy ;delta_x = EndX - StartX ;delta_y = EndY - StartY ;if( delta_x > 0 ){incx = 1;}else if( delta_x == 0 ){LCD12864_DrawLine_Y( StartX, StartY, EndY, Color ) ;return ;}else{incx = -1 ;}if( delta_y > 0 ){incy = 1 ;}else if(delta_y == 0 ){LCD12864_DrawLine_X( StartX, EndX, StartY, Color ) ;return ;}else{incy = -1 ;}delta_x = abs( delta_x );//求绝对值delta_y = abs( delta_y );if( delta_x > delta_y ){distance = delta_x ;}else{distance = delta_y ;}LCD12864_DrawPoint( StartX, StartY, Color ) ;/* Draw Line*/for( t = 0 ; t <= distance+1 ; t++ ){LCD12864_DrawPoint( StartX, StartY, Color ) ;x += delta_x ;y += delta_y ;if( x > distance ){x -= distance ;StartX += incx ;}if( y > distance ){y -= distance ;StartY += incy ;}}}void LCD12864_DrawCross(){LCD12864_DrawLine_X( 0, 127 , 0, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 7, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 15, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 23, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 31, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 39, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 47, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 55, 1 ) ;LCD12864_DrawLine_X( 0, 127 , 63, 1 ) ;LCD12864_DrawLine_Y( 0, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 15, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 31, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 47, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 63, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 79, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 95, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 111, 0 , 63, 1 ) ;LCD12864_DrawLine_Y( 127, 0 , 63, 1 ) ;}void LCD12864_Draw_ObliqueLine(){LCD12864_DrawLine( 0, 0, 127, 63, 1 ) ;LCD12864_DrawLine( 0, 63, 127, 0 , 1 ) ;LCD12864_DrawLine( 12, 0, 127, 63, 1 ) ;LCD12864_DrawLine( 52, 63, 127, 0 , 1 ) ;LCD12864_DrawLine( 32, 63, 98, 0, 1 ) ;LCD12864_DrawLine( 67, 0, 127, 63 , 1 ) ;}void LCD12864_DisplayOneChar(unsigned char X, unsigned char Y, unsigned char Data) {switch(Y){case 0:Y=0X80;break; //根据行数来选择相应地址case 1:Y=0X90;break;case 2:Y=0X88;break;case 3:Y=0X98;break;}LCD12864_WriteCmd( Y+X ); //这里不检测忙信号,发送地址码LCD12864_WriteDate(Data);}void LCD12864_DisplayListChar(unsigned char X, unsigned char Y, unsigned char *Data) {switch(Y){case 0:Y=0X80;break; //根据行数来选择相应地址case 1:Y=0X90;break;case 2:Y=0X88;break;case 3:Y=0X98;break;}LCD12864_WriteCmd( Y+X ); //这里不检测忙信号,发送地址码X = X*2;Y = 0;while( Data[Y] != 0 ) //若到达字串尾则退出{if (X <= 0x0F) //X坐标应小于0xF{LCD12864_WriteDate(Data[Y]);X++;Y++;}else break;}}void main(){LCD12864_Init();// write_com(0x1c);LCD12864_ClearGDRAM();//LCD12864_WriteImage(image);//LCD12864_Draw_ObliqueLine();LCD12864_DrawCross();//LCD12864_DisplayListChar(0,0,h);while(1);}。
12864LCD液晶显示课程设计摘要:本次课程设计应用的液晶显示屏。
⑴掌握单片机与液晶显示器之间接口设计与编程。
⑵利用点阵式液晶显示器显示汉字或图形。
编制程序,建立图像代码,在液晶显示器上显示文字与图形。
简介:概述:128X64LCD液晶显示屏是一种带中文字库,具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本特性:(1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置 128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(11)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
目录一.课程设计目的二.设计要求三.课程设计报告内容3.1系统设计思路与框图3.2 整体方案设计3.2.1单片机的选择3.2.2 液晶12864LCD3.2.3电路的硬件设计3.2.4 总成电路介绍四.具体功能程序及硬件实现4.1软件程序部分的编写4.2软件仿真运行五参考文献一.课程设计目的嵌入式课程设计是配合其理论课程而设立的设计性实践课程。
其教学目的和任务是:使学生在学习专业技术基础和主要专业课程的基础上,学习和掌握嵌入式系统技术的基本知识和方法,培养学生综合运用所学的专业基础理论、基本技能和专业知识分析问题和解决工程设计问题的能力,培养学生调查研究,查阅技术文献、资料、手册,进行程序设计、电路图纸绘制及编写技术文件的基本能力。
本次设计本人主要是做液晶汉字显示的设计,其目的要求有以下两点:初步掌握液晶屏的使用及其电路设计方法。
掌握液晶显示汉字及图形的方法与程序设计。
二.设计要求在12864液晶显示屏上第一行第一列开始显示“名字:”,第二行第一列开始显示“班级:”,第三行第一列开始显示“学号:”。
使用proteus仿真软件,处理器任选(51单片机、ARM处理器皆可),绘制电路原理图,通过使用128x64点阵液晶屏进行电路设计,掌握液晶屏作为人机接口界面的设计方法,并编写程序实现。
三.课程设计报告内容本次仿真设计的目的就是让同学们在理论学习的基础上,通过完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。
3.1系统设计思路与框图图-1 设计流程图图-2 系统设计框图3.2 整体方案设计3.2.1单片机的选择单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。
其发展趋势不外乎以下几个方面:1、多功能单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。
比如A/D、PWM、PCA(可编程计数器阵列)、WDT (监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。
有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。
例如,有的芯片以51内核为核心,集成了USB控制器、SMART CARD接口、MP3解码器、CAN或者I*I*C总线控制器等,LED、LCD或VFD 显示驱动器也开始集成在8位单片机中。
2、高效率和高性能为了提高执行速度和执行效率,单片机开始使用RISC、流水线和DSP的设计技术,使单片机的性能有了明显的提高,表现为:单片机的时钟频率得到提高;同样频率的单片机运行效率也有了很大的提升;由于集成度的提高,单片机的寻址能力、片内ROM(FLASH)和RAM的容量都突破了以往的数量和限制。
由于系统资源和系统复杂程度的增加,开始使用高级语言(如C语言)来开发单片机的程序。
使用高级语言可以降低开发难度,缩短开发周期,增强软件的可读性和可移植性,便于改进和扩充功能。
3、低电压和低功耗单片机的嵌入式应用决定了低电压和低功耗的特性十分重要。
由于CMOS 等工艺的大量采用,很多单片机可以在更低的电压下工作(1.2V或0.9V),功耗已经降低到uA级。
这些特性使得单片机系统可以在更小电源的支持下工作更长的时间。
4、低价格单片机应用面广,使用数量大,带来的直接好处就是成本的降低。
目前世界各大公司为了提高竞争力,在提高单片机性能的同时,十分注意降低其产品的价格。
AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大。
AT89C51结构1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)3.2.2 液晶12864LCD12864中文/图形点阵液晶显示模块可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。
提供三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口。
所有的功能,包含显示RAM,字型产生器,都包含在一个芯片里面,只要一个最小的微处理系统,就可以方便操作模块。
内置2M-位中文字型ROM (CGROM) 总共提供8192 个中文字型(16x16 点阵),16K-位半宽字型ROM(HCGROM) 总共提供126 个符号字型(16x8 点阵),64 x 16-位字型产生RAM (CGRAM),另外绘图显示画面提供一个64x256点的绘图区域(GDRAM),可以和文字画面混和显示。
提供多功能指令:画面清除(Displayclear)、光标归位(Return home)、显示打开/关闭(Display on/off)、光标显示/隐藏(Cursor on/off)、显示字符闪烁(Display character blink)、光标移位(Cursor shift)显示移位(Display shift)、垂直画面旋转(Vertical line scroll)、反白显示(By_line reverse display )、待命模式(Standby mode )等。
主要参数:1、工作电压(VDD):4.8~5.2V 。
2、逻辑电平:2.7~5.5V 。
3、LCD 驱动电压(Vo):0~7V 。
4、工作温度(Ta):0~55℃(常温)/-20~70℃(宽温) 保存温度(Tstg):-10~65℃(常温)/-30~80℃(宽温)。
1.引脚功能此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。
这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。
此液晶有8页,一页有8行点阵点,左右各64列,共128列。
如下图所示:2.LCD12864中的几条重要指令引脚符号状态 引脚名称 功能, 输入 芯片片选端,都是低电平有效 CS1=0开左屏幕,CS1=1关左屏幕 CS2=0开右屏幕,CS2=1关右屏幕 RS 输入 数据/命令选择信号 RS=1为数据操作,RS=0为写指令或读状态RW 输入 读写选择信号 R/W=1为读选通,R/W=0为写选通E 输入 读写使能信号 在E 下降沿,数据被锁存(写)入液晶,在E 高电平期间,数据被读出 DB0—DB7 三态 数据总线 数据或指令的传送通道输入复位信号,低电平时复位 复位时,关闭液晶显示,使显示起始行为0, 可以跟单片机的复位引脚RST 相连,也可以直接接VCC ,使之不起作用 V0 液晶显示器驱动电压 -V out-10VLCD 驱动负电压(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。
(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。
(三)列(column)地址设置指令每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。
(四)读状态指令(五)cs1和cs2的屏幕选择说明3.2.3电路的硬件设计(一)复位电路单片机的复位是由外部的复位电路来实现的。
复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。
上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。
为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。
复位电路上电自动复位是通过外部复位电路的电容充电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
(二)时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。
因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。
本文用的是内部时钟方式。
时钟电路AT89—C51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。
3.2.4 总成电路介绍由以上对电路的总成设计,我们选取了AT89C51单片机LGM128641BS1R 液晶作为我们此次设计的电子元器件。
此外,相较于系统设计框图在液晶显示模块控制芯片的调控上,对复位引脚处以简单开关复位电路控制,而电压地VSS 及LCD的操作电压以变阻器控制。
四.具体功能程序及硬件实现4.1软件程序部分的编写汉字液晶显示工作原理:液晶显示器的屏幕是靠无数个小灯泡来显示图象的,就像是普通灯泡,排满几平米然后点亮相应的灯泡就能在高出看出你想要的字或图形.液晶显示器道理和这个一样,就是无数个小的灯炮排满屏幕的,只是这个小灯泡只有零点几毫米甚至微米的面积.根据这一原理,我们可以通过对液晶显示器的点阵的通电的排列使得各个液晶亮与灭来实现液晶的规律性的显示。
对于本次设计,第一行第一列开始显示“名字:”,第二行第一列开始显示“班级:”,第三行第一列开始显示“学号:”。