12864液晶菜单设计

合集下载

LCD12864图形液晶并口显示2

LCD12864图形液晶并口显示2

LCD12864图形液晶并口显示【教学引入】液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。

液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。

上次呢,我们让12864显示了汉字,这次我们让它显示图形。

【教学目标】1、掌握LCD12864液晶屏的绘图用法;2、编写LCD12864液晶屏的指令代码;【知识目标】1、掌握LCD12864液晶屏的绘图用法;2、掌握LCD12864液晶屏指令代码;【教学准备】电脑、Proteus、Keil、MCS-51系列单片机综合实验箱【教学方法】教法:讲授法、讨论法学法:练习法、探究法【教学课时】四课时【教学过程】一、12864液晶介绍12864液晶屏不仅能显示汉字,还能显示图形。

今天呢,我们就来看看液晶屏怎么显示图形的。

首先呢,我们看看显示坐标关系1、图形显示坐标水平方向X——以字节为单位垂直方向Y——以位为单位由图可知,水平方向为0~31,以位为单位;垂直方向为0~7、8~16,以2个字节为单位,分为上下两个块。

如下图2、图片取模有了图像显示的坐标,我们该把图片变成代码了,PCtoLCD2002不仅能取模汉字,还能取模图片。

字模软件PCtoLCD2002双击图标打开软件可以看到下图所示的画面,此软件也是绿色软件打开后可以直接使用。

软件有两种工作模式:字符模式和图形模式;上图界面是字符模式。

可以通过菜单栏模式(C)切换工作模式。

我们选择图形模式,最大化,如下图。

单击工具栏中的图标按钮,看到如下图所示的对话框。

我们可以根据自己的实际需要而进行的设置,因其简单易用这里不再详细讲述其使用方法。

设置完成后,单击左下角的确定保存。

设置如下图回到PCtoLCD2002完美版-(图形模式)界面,单击按钮,导入要显示的128X64的bmp图片,单击图标按钮,可以看到软件下方的数据显示区域出现的对应的显示数据。

如下图阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集1、指令表2:(RE=1:扩充指令集),如下图,讲解了12864的扩充指令集。

电子信息工程专业毕业设计--基于51单片机的12864液晶显示器的设计和研究

电子信息工程专业毕业设计--基于51单片机的12864液晶显示器的设计和研究

目录设计总说明 (I)INTRODUCTION (II)1 绪论 (1)1.1课题背景及研究意义 (1)1.2课题研究的主要内容 (1)1.3国内外发展状况与存在问题 (1)2 总体方案设计与论述 (2)2.1 系统需求分析 (2)2.2 系统总体方案设计 (2)2.2.1 设计方案论证 (2)2.2.2总体结构框图 (3)3系统单元模块设计 (3)3.1系统硬件示意图 (3)3.2主控芯片(STC89C52模块)[5] (4)3.3 时钟控制模块[13] (6)3.3.1 DS1302简介 (6)3.3.2引脚及功能表 (7)3.3.3工作原理 (7)3.3.4 DS1302电路设计图[9] (8)3.4 温度控制模块 (8)3.5 12864接口电路模块 (9)3.6 按键电路模块 (9)3.7 电源电路模块 (10)3.8 印制电路板[9] (10)4系统整体调试与结果分析 (11)4.1 系统总体程序流程介绍 (11)4.2 按键程序设计 (13)4.3 12864驱动程序设计[15] (14)4.3.1 ST7920芯片介绍[14] (14)4.3.2 ST7920驱动程序设计 (17)4.4 12864应用程序设计 (20)4.4.1 文字显示程序设计 (20)4.4.2 点、线显示程序设计 (22)4.4.3 图形、图片显示程序设计 (23)4.5 菜单程序设计 (26)5设计调试及进一步研究 (28)5.1 系统测试 (28)5.1.1 软件调试 (28)5.1.2 硬件调试 (29)5.2 进一步研究的工作 (30)6总结 (30)鸣谢................................................................................................................................ 错误!未定义书签。

12864点阵型液晶显示屏的基本原理与使用方法(很详细)

12864点阵型液晶显示屏的基本原理与使用方法(很详细)

0
0
1
1
1
0
0
1
1
X
X
X
0
0
1
0
1
1
1
0
0
0
1
X
X
X
1
0 BUSY 0 ON/OFF RST 0
0
1
写数据
1
1
读数据
DB2 1 X X X 0
DB1 1 X X X 0
DB0 1/0
X X X 0
表 2:12864LCD 指令表
各功能指令分别介绍如下。
显示开/关指令
R/WRS 00
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 00111111/0
设置了页地址和列地址,就唯一确定了显示 RAM 中的一个单元,这样 MPU 就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/WRS 10
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
图 2 “你”字模图
12864 点阵型 LCD 简介
12864 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及 128×64 全点阵液晶显示器组成。 可完成图形显示,也可以显示 8×4 个(16×16 点阵)汉字。
管脚号 1 2 3 4
管脚名称 VSS VDD V0
D/I(RS)
LEVER 0
12864LCD 的指令系统及时序
该类液晶显示模块(即 KS0108B 及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指 令表如表 2 所示:

我的lcd12864菜单大致框架7页word文档

我的lcd12864菜单大致框架7页word文档

我的lcd12864菜单大致框架2019-07-12 00:24:06| 分类:ELECTRONIC | 标签:|字号大中小订阅lcd12864菜单大致框架算是完成了,主要实现了两个功能----反白,翻页。

原本是想做一个多级---起码也得二级----菜单,但有意外的时间安排,故暂且放下。

个人认为比较费脑筋的是反白功能的制作。

首先12864并没有专门为用户准备单行的反白,要么一三行一块反,要么二四一块。

所以得参照前人的方法,即将字符显示与图像显示结合,在需要反白的部分用绘图功能全写上0xff,有自带的异或逻辑能成功反白。

这部分让我摸索了几小时。

其次是这种反白实现之前,得先给原来的图像全清掉,也正是这一步让89c52耗费了不少时间,选项切换间居然要用1s 的时间。

这是不能忍的啊。

所以自己想了一个办法,让图像整体清除换成部分清除。

思路是在选项光标变量Index_P 外再添一记录变量----Index_P_Pre-----以记录上一次选项所在位置,然后在清除图像的时候专门清除Index_P_Pre 对于的图像痕迹,这样就将清屏所需的时间减少了3/4。

好了,这个菜单模块总共用了6KB。

对于64KB的89C52来说还有很多空间,自己也可以放心弄下去。

以后的工作就是整合了。

/*Index_Num 数组元素最大序号Index 数组元素当前序号Index_P 选中项序号Index_P_Pre 上一选中项序号,用于快速清理上次所画下的图案*/#include <reg52.h>#include <intrins.h>#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};#define LCD_data P0 //数据口#define Index_Num 8typedef unsigned char uchar;typedef unsigned int uint;sbit Key1 = P1^0;sbit Key2 = P1^1;sbit LCD_RS = P2^6; //寄存器选择输入cssbit LCD_RW = P2^5; //液晶读/写控制sidsbit LCD_EN = P2^7; //液晶使能控制clksbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口bdata uchar DataBuf;uint Index,Index_P_Pre;uint Index_P=0;uchar code Weibo[][16]={"hello","呀咦晗昱","weibo","/maixianyu","blog.163","maixianyu@126","123","456","789"};////////////////////////////////////////////// 200usvoid delay(int ms){uchar t;while(ms--){for(t=0; t<20; t++) ;}}////////////////////////////////////////////////////////////////// void Lcd_Write_8bit(uchar msg){uint i;uchar DataBuffer;DataBuffer=msg;for(i=0;i<8;i++){LCD_RW=(bit)(DataBuffer&0x80);LCD_EN=1;_nop_();_nop_();LCD_EN=0;_nop_();_nop_();DataBuffer<<=1;}}/////////////////////////////////////////uchar Lcd_Rec(uint RS){uint i;uchar Data_H,Data_L;LCD_RS=1;if(RS)Lcd_Write_8bit(0xfe);elseLcd_Write_8bit(0xfc);delayNOP();for(i=0;i<8;i++){LCD_EN=1;Data_H=(Data_H<<1)|LCD_RW;LCD_EN=0;}delayNOP();for(i=0;i<8;i++){LCD_EN=1;Data_L=(Data_L<<1)|LCD_RW;LCD_EN=0;}LCD_RS=0;DataBuf=(Data_H<<4)|Data_L;return DataBuf;}/////////////////////////////////////////bit Lcd_Busy(){return Lcd_Rec(0)&0x80;}/////////////////////////////////////////void Lcd_Write(uchar msg,uint dc){ //if dc equals 0,msg is a kind of cmd.while(Lcd_Busy());if(dc==0)DataBuf=0xf8;elseDataBuf=0xfa;delayNOP();LCD_RS=1;Lcd_Write_8bit(DataBuf);delayNOP();DataBuf=msg&0xf0;Lcd_Write_8bit(DataBuf);delayNOP();DataBuf=(msg<<4)&0xf0;Lcd_Write_8bit(DataBuf);LCD_RS=0;}////////////////////////////////////////////////////void Disp_black() //清理上一次画下的痕迹{uchar i,j;Lcd_Write(0x34,0); //写数据时,关闭图形显示if(Index_P_Pre<2){for(i=0+16*Index_P_Pre; i<16+16*Index_P_Pre; i++){Lcd_Write(0x80+i,0);Lcd_Write(0x80,0);for(j=0;j<16;j++)Lcd_Write(0x00,1);}}else{for(i=0+16*(Index_P_Pre-2);i<16+16*(Index_P_Pre-2);i++){Lcd_Write(0x80+i,0);Lcd_Write(0x88,0);for(j=0;j<16;j++)Lcd_Write(0x00,1);}}Lcd_Write(0x36,0); //写完数据,开图形显示}void convertChar(uchar CX) // 反白函数{uchar halfLineCnt, basicBlock,lcdPosX,lcdPosY;// if(f==1)Disp_black(); //清绘图区lcdPosY = 0x80;if (CX == 0){CX = 0x80;halfLineCnt = 16;}else if (CX == 1){CX = 0x80;halfLineCnt = 32;}else if (CX == 2){CX = 0x88;halfLineCnt = 16;}else if (CX == 3){CX = 0x88;halfLineCnt = 32;}lcdPosX = CX;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = 16;Lcd_Write(0x34,0);Lcd_Write(lcdPosY,0);Lcd_Write(lcdPosX,0);Lcd_Write(0x30,0);for (;basicBlock != 0; basicBlock--){if (halfLineCnt > 16){Lcd_Write(0x00,1);}else{Lcd_Write(0xff,1);}}lcdPosY++;}Lcd_Write(0x36,0);Lcd_Write(0x30,0);}///////////////////////////////////////////////////void Lcd_Pos(uchar x,uchar y){uchar pos;if(x==1){x=0x80;}else if(x==2){x=0x90;}else if(x==3){x=0x88;}else if(x==4){x=0x98;}pos=x+y;Lcd_Write(pos,0);}///////////////////////////////////////////void Lcd_Menu(uint Head){uint j,i;uint Index_End=Head+3;// if(Index_End<=Index_Num){for(j=0;Head<=Index_End;Head++,j++){Lcd_Pos(j+1,0);i=0;while(i<15){if(Weibo[Head][i]!=0)Lcd_Write(Weibo[Head][i++],1);else{Lcd_Write(0x20,1);i++;}}delayNOP();}// }}///////////////////////////////////////////void Lcd_Init(void){LCD_PSB=0;LCD_RST=0;LCD_RS=0;LCD_RW=1;LCD_EN=0;delay(2);LCD_RST=1;delay(2);Lcd_Write(0x30,0); //ordinary cmddelay(2);Lcd_Write(0x0c,0); //how to showdelay(2);Lcd_Write(0x01,0); //cleardelay(2);}/////////////////////////////////////////void main(void){Lcd_Init();Key1=1;Lcd_Menu(Index);convertChar(Index_P);while(1){if(Key1==0&&Index>=0){delay(5);if(Key1==0&&Index>=0){if(Index_P==0&&Index>0)Lcd_Menu(--Index);if(Index_P>0){Index_P_Pre=Index_P;convertChar(--Index_P);}}}if(Key2==0&&Index_P<=3){delay(5);if(Key2==0&&Index_P<=3){if(Index_P==3&&Index<(Index_Num-3)) Lcd_Menu(++Index);if(Index_P<3){Index_P_Pre=Index_P;convertChar(++Index_P);}}}}}。

12864液晶屏使用手册

12864液晶屏使用手册

12864液晶屏手册一、液晶显示模块概述12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵,16*8=128,16*4=64, 一行只能写8个汉字,4行;)、128个字符(8X16点阵)及64X256点阵显示RAM( GDRAM 主要技术参数和显示特性:电源:VDD ~+5V(内置升压电路,无需负压);显示内容:128列X 64行(128表示点数)显示颜色:黄绿显示角度:6: 00钟直视LCD 类型:STN与MC成口 : 8位或4位并行/3位串行配置LED背光多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等、外形尺寸1.外形尺寸图□U UPN12864A2.主要外形尺寸二、模块引脚说明逻辑工作电压(VDD):〜电源地(GND): 0V工作温度(Ta) : 0〜60C (常温)/ -20 〜75 C (宽温)三、接口时序模块有并行和串行两种连接方法(时序如下):8位并行连接时序图MP如资料到模块MPLM模块读出资料2、串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制一格式11111ABCA为数据传送方向控制: H表示数据从LCD到MCU L表示数据从MCHiJ LCDB C 为数据类型选择:固定为0H表示数据是显示数据,L表示数据是控制指令第二字节:(并行)8位数据的高 4 位一格式DDDD0000第三字节:(并行)8位数据的低 4 位一格式0000DDDD 串行接口时序参数:(测试条件:T=25C VDD=四、用户指令集备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令:如果在送出一个指令前并不检查BF标志,(一般在输入每天指令前加个delay )那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

液晶12864显示图片

液晶12864显示图片

液晶12864显示图片液晶12864简介12864是128*64点阵液晶模块的点阵数简称。

基本参数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。

10、通讯方式:串行、并口可选。

11、内置DC-DC 转换电路,无需外加负压。

12、无需片选信号,简化软件设计。

13、工作温度: 0℃~+55℃ ,存储温度: -20℃~+60℃。

液晶12864接口液晶12864显示图片程序源代码/*******************12864显示图片******************** 处理器:51单片机* 开发环境:keil* 功能:12864显示图片****************************************************/#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*12864端口定义 */#define LCD_data P0 //数据口sbit LCD_RS = P1^0; //寄存器选择输入sbit LCD_RW = P1^1; //液晶读/写控制sbit LCD_EN = P2^5; //液晶使能控制sbit LCD_PSB = P1^2; //串/并方式控制unsigned char code zhu[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0x7D,0x7F,0xFF,0xFF,0xFF,0xFD,0xEF,0xFF,0xF0,0x04,0x3F,0xFF, 0xFF,0xFF,0xFF,0xFD,0xBD,0x7F,0xFF,0xFF,0xFF,0xE6,0xE7,0xFF,0xF4,0x00,0x7F,0xFF, 0xFF,0xFF,0xFF,0xFD,0x3D,0x7F,0xFF,0xFF,0xFF,0xDE,0x00,0xFF,0xF0,0x00,0x7F,0xFF, 0xFF,0xFF,0xFF,0xC4,0x3E,0x7F,0xFF,0xFF,0xFF,0xA8,0x00,0x1F,0xF0,0x00,0x7F,0xFF, 0xFF,0xFF,0xFF,0xBA,0x46,0x7F,0x7F,0xFF,0xFF,0x70,0x00,0x0E,0xF0,0x00,0xFF,0xFF, 0xFF,0xFF,0xFF,0x7D,0xBB,0x5F,0x7F,0xFF,0xFE,0xE1,0x70,0x01,0xF0,0x00,0xFF,0xFF, 0xFF,0xFF,0xFF,0x7D,0xA3,0xEF,0x9F,0xFF,0xFF,0x06,0xF8,0x03,0xF0,0x00,0xFF,0xFF, 0xFF,0xFF,0xF0,0x7C,0x07,0xB6,0x07,0xFF,0xFF,0xCC,0xF9,0x81,0xF0,0x01,0xFF,0xFF, 0xFF,0xFF,0xEF,0x75,0xDF,0xB8,0x01,0xFF,0xFF,0x98,0xF9,0x80,0xF1,0xF1,0xEF,0xFF, 0xFF,0xFF,0xEF,0x6D,0xEF,0x58,0xE0,0xFF,0xFF,0x90,0x70,0x00,0xF3,0xFB,0xFF,0xFF, 0xFF,0xFF,0xEF,0xBB,0xEE,0xD9,0xF0,0xFF,0xFF,0xB0,0x0C,0x00,0x73,0x1B,0xAF,0xFF, 0xFF,0xFF,0xF7,0x87,0xAE,0xC2,0xF0,0x7F,0xFF,0xE0,0x0C,0x62,0x36,0xFD,0xFF,0xFF, 0xFF,0xFF,0xF0,0x33,0xDD,0xD2,0x60,0x7F,0xFF,0xE0,0x31,0x61,0x76,0xFD,0xEF,0xFF, 0xFF,0xFF,0xEF,0xA0,0x3B,0xF4,0x18,0x3F,0xFF,0xE0,0x30,0x09,0x6C,0x3D,0xFF,0xFF, 0xFF,0xFF,0xDF,0x83,0xB6,0xA5,0x98,0x3F,0xFF,0xE0,0x00,0x01,0x7B,0xDD,0xAF,0xFF, 0xFF,0xFF,0xDE,0x83,0xCF,0xED,0x80,0x3F,0xFF,0xE0,0x00,0x01,0xFA,0xDD,0xFF,0xFF, 0xFF,0xFF,0xDD,0x7B,0xDE,0xF4,0x00,0x3F,0xFF,0xE0,0x00,0x09,0xFB,0xDD,0xEF,0xFF, 0xFF,0xFF,0xEE,0x5B,0xDF,0xF4,0x00,0x3F,0xFF,0xF0,0x00,0x29,0xF9,0xBB,0xFF,0xFF, 0xFF,0xFF,0xF1,0x79,0xBE,0xB4,0x00,0x3F,0xFF,0xF0,0x00,0x33,0xFF,0xFA,0xAF,0xFF, 0xFF,0xFF,0xEF,0x68,0x03,0xF8,0x00,0x3F,0xFF,0xF8,0x0F,0xE3,0xFF,0xF7,0xFF,0xFF, 0xFF,0xFF,0xDF,0x70,0x16,0xEA,0x01,0x3F,0xFF,0xF8,0x1F,0xC7,0xEF,0xF6,0xEF,0xFF, 0xFF,0xFF,0x07,0x80,0x0F,0xFA,0x1D,0x7F,0xE0,0x3C,0x7F,0x87,0xEF,0xEF,0xFF,0xFF, 0xFF,0xFF,0x0B,0xA0,0x2A,0xB6,0x1E,0x70,0x1F,0xBF,0x3E,0x0F,0xD3,0x9A,0xAF,0xFF, 0xFF,0xFF,0x85,0xA0,0x5F,0xF7,0x3C,0xF7,0xE0,0x3C,0x00,0x3F,0xDC,0x7F,0xFF,0xFF, 0xFF,0xFF,0x41,0x11,0x2E,0xF6,0x81,0xF8,0x00,0x3F,0x00,0xFF,0xAF,0x8E,0xEF,0xFF, 0xFF,0xFF,0x94,0xA0,0xFF,0xF7,0xFF,0xF8,0x00,0x3F,0xFF,0x1F,0xBF,0x77,0xFF,0xFF, 0xFF,0xFF,0xE2,0x3F,0xAA,0xB7,0x8B,0xFC,0x00,0x3F,0xDF,0xDF,0x6A,0xFA,0xAF,0xFF, 0xFF,0xFF,0x88,0x01,0xFF,0xFB,0x75,0xFC,0x00,0x3F,0xDF,0xBE,0xFE,0xFB,0xFF,0xFF, 0xFF,0xFF,0x40,0x00,0x3E,0xEB,0xB7,0xFE,0x00,0x3F,0xE0,0x7C,0x78,0xFB,0xF7,0xFF, 0xFF,0xFF,0x00,0x00,0x0F,0xFD,0xC7,0xFE,0x01,0xBF,0xFF,0xFA,0xA7,0x70,0x6F,0xFF, 0xFF,0xFF,0x0F,0xBF,0x0A,0xAA,0xFF,0xFE,0x0F,0xBF,0xFF,0xE7,0xCF,0x8F,0xAF,0xFF, 0xFF,0xFF,0x47,0x5E,0x2F,0xFF,0x7F,0xFF,0x1F,0xBF,0xFF,0xDF,0xEF,0x8F,0xAF,0xFF, 0xFF,0xFF,0x38,0x21,0xDE,0xEE,0x9F,0xFF,0xBF,0x7F,0xFF,0x3F,0xEF,0x0F,0xB7,0xFF, 0xFF,0xFF,0x07,0xD6,0x2F,0xFF,0xE7,0xFF,0xC0,0xFF,0xFC,0xFF,0xF0,0xEF,0xBF,0xFF, 0xFF,0xFF,0x41,0x8C,0xCA,0xBA,0xB9,0xFF,0xFF,0xFF,0xE3,0xFF,0xFD,0xF0,0x6F,0xFF, 0xFF,0xFF,0x93,0xCC,0xDF,0xFF,0xFE,0x3F,0xFF,0xFE,0x00,0x7F,0xFD,0xF7,0x7F,0xFF, 0xFF,0xFF,0x40,0x03,0x2E,0xEE,0xEF,0xC2,0x03,0xC0,0xFF,0x9F,0xFD,0xF7,0xAF,0xFF, 0xFF,0xFF,0xC0,0x03,0x3F,0xFF,0xFF,0xF9,0xFC,0x37,0xFF,0xE3,0xFE,0xE7,0xDF,0xFF, 0xFF,0xFF,0xD1,0xCC,0xFB,0xBB,0xBB,0xE7,0xFF,0x8F,0xFF,0xFC,0x3E,0x17,0xDF,0xFF,0xFF,0xFF,0xC0,0x8C,0xFF,0xFF,0xFF,0x9F,0xFF,0xDF,0xFF,0xFF,0xC6,0xF7,0xEF,0xFF,0xFF,0xFF,0xC0,0x90,0x2F,0xEF,0xEE,0x7F,0xFF,0xBF,0xFF,0xFF,0xF9,0xFB,0xF7,0xFF,0xFF,0xFF,0xC0,0xA0,0x3F,0xFF,0xF9,0xDF,0xFF,0xBF,0xFF,0xDF,0xFE,0xFB,0xFF,0xFF,0xFF,0xFF,0x10,0xC0,0x08,0x00,0x00,0x0F,0xFF,0xBF,0xFF,0x80,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xE8,0x80,0x7F,0xFF,0xFF,0xF3,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0xC0,0x7F,0xFF,0xFF,0xFC,0x7E,0x5F,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,0x81,0xE0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};#define delayNOP0(); {_nop_();_nop_();};#define delayNOP1(); {_nop_();_nop_();_nop_();_nop_();};void delay(int In,int Out) {int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/*******************************************************************//*检查LCD忙状态 *//*lcd_busy为1时,忙,等待。

LCD模块的菜单方式人机交互界面

LCD模块的菜单方式人机交互界面

图形LCD模块的菜单方式人机交互界面摘要:在以单片机为核心的嵌入式应用中,友好的人机互界面起着十分重要的作用。

笔者在设计中使用12864图形LCD模块实现一种中文窗口菜单界面,设计中使用的方法具有普遍性意义。

关键词:人机交互界面图形LCD模块数据结构窗口菜单随着液晶显示技术的进步,高质量的液晶显示模块会被日趋广泛地应用于各种嵌入式系统中。

在系统整体设计中,人机交互界面的设计往往占据着很大一部分工作,现以某嵌入式系统的人机交互部分为例,介绍一种使用12864B图形LCD模块实现中文窗口菜单界面的方法。

摘要:在以单片机为核心的嵌入式应用中,友好的人机互界面起着十分重要的作用。

笔者在设计中使用12864图形LCD模块实现一种中文窗口菜单界面,设计中使用的方法具有普遍性意义。

关键词:人机交互界面图形LCD模块数据结构窗口菜单随着液晶显示技术的进步,高质量的液晶显示模块会被日趋广泛地应用于各种嵌入式系统中。

在系统整体设计中,人机交互界面的设计往往占据着很大一部分工作,现以某嵌入式系统的人机交互部分为例,介绍一种使用12864图形LCD模块实现中文窗口菜单界面的方法。

1 图形LCD模块12864简介12864模块是单色图形点阵液晶显示模块,点阵数为64×128,其点阵存储区如图1所示。

模块点阵分为左右两边,左右两边的结构是完全一样的。

对模块的点阵存储区进行读写操作时,由CS1、CS2进行片选,高电平有效。

模块中每8行为1页,页地址由X确定;Y确定点阵的列号,点阵数据的每一个字节所在的位置由(CSi,X,Y)唯一确定。

字节中的每一位对应着相应的像素,为1显示该像素;为0则不显示。

液晶显示模块工作时,逐行扫描点阵存储区。

首先被扫描的行显示在LCD屏幕的第1行上,其余行则依次顺序显示。

“扫描起始行”可以通过Z地址寄存器来设置。

Z可以是0~63的任意一行,如Z=56时,则显示在LCD屏幕上的次序从上到下分别为:56,57,…,62,63,0,1,2,…,54,55该模块的这一功能为窗口的滚屏提供了便利。

LCD12864等液晶接口的设计

LCD12864等液晶接口的设计

本文介绍了图形液晶显示器MGLS12864与单片机W78E58的硬件设计和软件设计技术。

同时给出了ASCII码8×16字库、汉字16×16字库建立的程序及在液晶上显示数字、字符和汉字的程序。

引言液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。

LCD可分为段位式LCD、字符式LCD和点阵式LCD。

其中,段位式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动,动画功能,分区开窗口,反转,闪烁等功能,用途十分广泛。

本文介绍了点阵式液晶显示器MGLS12864与单片机的接口及编程的方法,同时介绍了创建8×16字符和16×16点阵汉字的方法,及常用的字符显示和汉字显示程序。

硬件设计这里着重介绍液晶显示器与单片机的接口技术。

有关MGLS12864图形液晶引脚功能及控制器HD61202的接口时序波形,可查看图形液晶显示器产品有关手册。

单片机可以通过数据总线与控制信号直接采用存储器访问形式、I/O设备访问形式控制该液晶显示模块。

本文以华邦公司的W78E58为例,它是51系列单片机兼容的微控制器,其内部有32KB的FLASH EEPROM,用户编制的程序及需要显示的英文字母、数字、汉字、曲线和图形都可以存储在里面,免去了扩展外部存储器的麻烦,使得以W78E58单片机为核心的控制系统电路更简单。

因此十分适用于液晶显示。

MGLS12864与W78E58单片机接口电路如图1所示。

该图采用直接访问方式,单片机通过低位地址A2控制CSA;A3控制CSB,以选通液晶显示屏上各区的控制器HD61202;同时W78E58用地址A1作为R/W信号控制数据总线的数据流向;用地址A0作为D/I 信号控制寄存器的选择;E信号由W78E58的读信号/RD和写信号/WR合成产生;另外单片机的复位脚(9脚)经反相器后连接到液晶显示器复位脚(17脚 /RST),当单片机上电复位或手动复位时, 液晶显示器同时也复位;从而实现了W78E58对内置HD61202图形液晶显示器模块的电路连接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

12864多级菜单设计
看到网上有个视频,用的是12864做的菜单,很花哨,自己也心痒痒想做一个,收集了 很
多关于这方面的东西,但是都是五花八门,没有一个完整的可以共大家参考的程序,所以决
定写偏文章供大家参考,希望读者下去自己优化,改进。有什么不足之处还请多多包涵。好
了,废话不多说,直接进入正题吧。

1、首先定义一个机构体如下
typedefstruct
{
uchar current;
uchar up;//上键
uchar down;//下键
uchar enter;//确认键
void (*current_operation)();
} key_table;

结构体包含5个变量,分别是函数的索引号即用户想要执行哪个函数的代号,然后有三个键,
用户可以自己定义别的按键,最后一个是函数指针,即索引号对应的函数。然后在定义一个
结构体数组,如下
key_table code table[n]=
{
{0,2,1,3,(*fun1)},
{1,0,2,4,(*fun2)},
{2,1,0,5,(*fun3)},
{3,0,6,3,(*fun4)},
{4,1,6,4,(*fun5)},
{5,2,6,5,(*fun6)},
{6,0,0,0,(*fun7)},
............
};
其中n为函数数组大小。下面详细介绍key_table code table[n]里面的值是怎么确定的。
首先可以先这样定义该数组
key_table code table[n]=
{
{0,x,y,z,(*fun1)},
{1,x,y,z,(*fun2)},
{2,x,y,z,(*fun3)},
{3,x,y,z,(*fun4)},
{4,x,y,z,(*fun5)},
{5,x,y,z,(*fun6)},
{6,x,y,z,(*fun7)},
............
};
其中,x,y,z是未知数,先不确定,他们对应的是三个键按下要指示的索引值,如果四个键,
就有四个未知数,在确定他们之前,必须要了解自己函数执行什么命令。加入开始时时执行
数组里面的第一个即table[0],而想在此按上键执行函数fun6,那么table[0]里面需要这
样设置
{0,5,y,z,(*fun1)},同样,如果希望按下键执行fun7则需要设置为
{0,x,6,z,(*fun1)},如果希望按确认键执行fun3则需要设置为
{0,x,y,2,(*fun1)};如果上面三种情况都想要就设置为
{0,5,6,2,(*fun1)}.其它数组元素一次类推。这一步做完了看主程序里面(主要是while
(1)里面)。
/*******************find index****************************/
switch(key)
{
case 0x44: func_index=table[func_index].up; //向上翻 break;
case 0x24: func_index=table[func_index].enter;//回车
break;
case 0x14: func_index=table[func_index].down;//向下翻
break;
default:break;

} current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数

其中,key是返回的按键值,这个用户视情况而定,
下面是详细的例子,

主要是以结构体为基础设计的,以12864显示函数代替了用户需要的函数功能,只需要修改
相应的函数和索引号,就可以达到任意界面切换了是小弟研究了还久才搞定的,虽然网上也
有这些,但是都不够系统,只有基本的东西,这篇例子希望能够给读者一些有用的东西,仅
供参考哦!


#include

#include "fun.h"
#include "lcd12864.h"
#include "delay.h"
#define uchar unsigned char
sbitkeydown=P0^0;
sbitkeyenter=P0^1;
sbitkeyup=P0^2;
ucharfunc_index=0;
void (*current_operation_index)();
typedefstruct
{
uchar current;
uchar up;//向上翻索引号
uchar down;//向下翻索引号
uchar enter;//确认索引号
void (*current_operation)();
} key_table;
key_table code table[30]=
{
{0,3,1,4,(*fun1)},//第一层,显示【清华大学】、北京大学、重庆三峡学院、返回
{1,0,2,8,(*fun2)},//第一层,显示清华大学、【北京大学】、重庆三峡学院、返回
{2,1,3,12,(*fun3)},//第一层,显示清华大学、北京大学、【重庆三峡学院】、返回
{3,2,0,25,(*fun4)},//第一层,显示清华大学、北京大学、重庆三峡学院、【返回】
{4,7,5,16,(*fun5)},//第二层,清华大学层下显示【地点】、创建时间、简介、返回
{5,4,6,17,(*fun6)},//第二层,清华大学层下显示地点、【创建时间】、简介、返回
{6,5,7,18,(*fun7)}, //第二层,清华大学层下显示地点、创建时间、【简介】、返回
{7,6,4,0,(*fun8)},//第二层,清华大学层下显示地点、创建时间、简介、【返回】
{8,11,9,19,(*fun9)},//第二层,北京大学层下显示【历史】、政治、简介、返回
{9,8,10,20,(*fun10)},//第二层,北京大学层下显示历史、【政治】、简介、返回
{10,9,11,21,(*fun11)}, //第二层,北京大学层下显示历史、政治、【简介】、返回
{11,10,8,1,(*fun12)},//第二层,北京大学层下显示历史、政治、简介、【返回】
{12,15,13,22,(*fun13)},//第二层,重庆三峡学院层下显示【简介】、最佳院系、最佳实
验室、返回

{13,12,14,23,(*fun14)}, //第二层,重庆三峡学院层下显示简介、【最佳院系】、最佳实
验室、返回

{14,13,15,24,(*fun15)}, //第二层,重庆三峡学院层下显示简介、最佳院系、【最佳实验
室】、返回

{15,14,12,2,(*fun16)}, //第二层,重庆三峡学院层下显示简介、最佳院系、最佳实验室、
【返回】

{16,16,16,4,(*fun17)}, //第三层,清华大学地点层
{17,17,17,5,(*fun18)}, //第三层,清华大学创时间层
{18,18,18,6,(*fun19)}, //第三层,清华大学简介层
{19,19,19,8,(*fun20)}, //第三层,北京大学历史层
{20,20,20,9,(*fun21)}, //第三层,北京大学政治层
{21,21,21,10,(*fun22)}, //第三层,北京大学简介层
{22,22,22,12,(*fun23)}, //第三层,重庆三峡学院简介层
{23,23,23,13,(*fun24)}, //第三层,重庆三峡学院最佳院系层
{24,24,24,14,(*fun25)}, //第三层,重庆三峡学院最佳实验室层
{25,25,25,0,(*fun26)}, //第0层

};
void main()
{
init_lcd(); //初始化LCD模块
while(1)
{
/*******************find index****************************/
if((keyup==0)||(keydown==0)||(keyenter==0))
{
delay(10);//消抖
if(keyup==0)
{
func_index=table[func_index].up; //向上翻
while(!keyup);//松手检测
}
if(keydown==0)
{
func_index=table[func_index].down; //向下翻
while(!keydown);
}
if(keyenter==0)
{
func_index=table[func_index].enter; //确认
while(!keyenter);
}
init_lcd();
}
current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
}
}

相关文档
最新文档