51单片机实现多级液晶显示中文菜单

合集下载

单片机系统中液晶显示多级菜单的软硬件设计

单片机系统中液晶显示多级菜单的软硬件设计

第17卷第1期2003年02月 华 东 船 舶 工 业 学 院 学 报(自然科学版)Journal of East China Shipbuilding Institute (Natural Science Edition ) Vo1117No 11Feb.2003文章编号:1006-1088(2003)01-0086-04单片机系统中液晶显示多级菜单的软硬件设计唐 炜,卢道华,顾金凤(华东船舶工业学院机械系,江苏镇江,212003)摘 要:以8031单片机控制GXM -12864液晶显示器为例,通过建立小字库,结合具体实例介绍了实现多级菜单显示的方法。

当菜单显示内容改变时,只需修改相应参数,而不修改程序。

文中提及的硬件电路和软件设计通用性较强,具有更一般的实际意义。

关键词:单片机;液晶显示器;接口;多级菜单中图分类号:TP311 文献标识码:A0 引 言在单片机系统中,常用的小型显示器有L ED 和LCD 两种,L ED 显示器只能显示数字和少量字符,用户须根据系统设计时所约定的格式来了解系统的运行状况或进行操作,而点阵图形式LCD 不仅体积小、超薄、功耗低,而且能显示汉字、图形、表格及曲线等,其界面友好,它常被用在仪器设备中作为显示终端或人机接口等,特别适合于我国具有自主知识产权产品的开发,应用前景十分广阔。

因此,要采用菜单驱动的工作方式来控制仪器设备的运行,在LCD 上如何实现多级菜单的显示也就成为必须要解决的问题。

本文在建立中、西文小字库的基础上,介绍了单片机与LCD 间的硬件接口电路以及实现多级菜单的软件设计方法,具有较强的通用性。

1 GXM -12864显示模块简介图1 CXM -12864液晶模块电路框图Fig.1 The structure of GXM -12864LCD GXM -12864显示模块是南京国显电子公司推出的一款集控制、驱动、显示于一体的图形点阵式LCD产品,其点阵数为128(列)×64(行),内部使用一片行驱动器HD61203和两片列驱动器HD61202组成驱动控制系统。

单片机汇编语言下LCD多级菜单的一种实现方法

单片机汇编语言下LCD多级菜单的一种实现方法

单片机汇编语言下LCD多级菜单的一种实现方法万方数据万方数据单片机汇编语言下LCD多级菜单的一种实现方法作者:高璇作者单位:安徽理工大学电气与信息工程学院,安徽,淮南,232001;中煤北京煤矿机械有限责任公司设备动力部,中国,北京,102400 刊名:科技信息英文刊名:SCIENCE & TECHNOLOGY INFORMATION年,卷(期):2010,(31)被引用次数:0次参考文献(3条)1.ST7920控制器系列中文字库液晶模块中文说明书 20052.STC89C51RC/RD+系列单片机器件手册 20033.蔡美琴MCS-51系列单片机系统及其应用 2005相似文献(10条)1.会议论文宋晓辉.叶桦.丁昊基于单片机的多级菜单实现方法改进2007介绍了一种在C语言环境下,基于单片机的多级菜单实现方法.该方法从菜单的功能结构发,在程序设计中做了几点改进.首先对菜单数据项和功能函数各自进行独立设计,通过在数据结构中增加按键有效标志、字符串指针、存储器地址以及与复用相关的元素,实现了两者源代码空间的有效分离,从而大大提高了程序的可维护性;其次引入菜单项复用的思想,简化了程序结构.该设计的多级菜单在自动售货机的服务模式的实际应用表明,此改进方法使菜单设计变得更为简单方便,软件通用性更高,维护更容易.2.期刊论文陆铮.罗嘉单片机C语言下LCD多级菜单的一种实现方法-工矿自动化2006(1)介绍了在C语言环境下,在LCD液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑、实用的程序模型.3.期刊论文宋晓辉.叶桦.丁昊.Song Xiaohui.Ye Hua.Ding Hao基于单片机的多级菜单实现方法改进-东南大学学报(自然科学版)2007,37(z1)介绍了一种在C语言环境下,基于单片机的多级菜单实现方法.该方法从菜单的功能结构发,在程序设计中做了几点改进.首先对菜单数据项和功能函数各自进行独立设计,通过在数据结构中增加按键有效标志、字符串指针、存储器地址以及与复用相关的元素,实现了两者源代码空间的有效分离,从而大大提高了程序的可维护性;其次引入菜单项复用的思想,简化了程序结构.该设计的多级菜单在自动售货机的服务模式的实际应用表明,此改进方法使菜单设计变得更为简单方便,软件通用性更高,维护更容易.4.期刊论文唐炜.卢道华.顾金凤单片机系统中液晶显示多级菜单的软硬件设计-华东船舶工业学院学报(自然科学版)2003,17(1) 以8031单片机控制GXM-12864液晶显示器为例,通过建立小字库,结合具体实例介绍了实现多级菜单显示的方法.当菜单显示内容改变时,只需修改相应参数,而不修改程序.文中提及的硬件电路和软件设计通用性较强,具有更一般的实际意义.5.期刊论文汪高勇.宋毅恒.尚举邦.WANG Gao-yong.SONG Yi-heng.SHANG Ju-bang C51与单片机系统多级菜单的模块化设计-光电技术应用2009,24(2)介绍了一种基于单片机系统的多级菜单模块化编程方法.该方法从模块化的角度将菜单编程简单地划分为共用键盘处理和菜单模块两部分,使得菜单具有通用的模块化结构,方便了菜单的加载与卸载,增强了C51语言在单片机系统人机接口的设计,软件结构清晰,维护方便.6.期刊论文朱青.张兴敢.柏业超.ZHU Qing.ZHANG Xing-gan.BAIYe-chao一种多功能水情自动测报系统设计-现代电子技术2011,34(3) 为满足当前水情数据测报的要求,设计实现了一种多功能水情自动测报系统.该系统基于PIC16F887单片机、GSM模块,可接收多种形式的传感器信号,并存储在大容量的FLASH存储器中,同时通过GSM模块发送水情数据和报警信息.另外,该系统借助LCD液晶显示屏可显示多级中文菜单,方便控制和查询.该系统的功耗低,体积小,功能扩展性强,经过多次测试,操作方便,工作可靠,在水情自动测报领域具有很大的推广价值.7.期刊论文王运良.张建忠.程明.WANG Yun-liang.ZHANG Jian-zhong.CHENG Ming基于ATmega16L单片机的中文菜单显示技术-江苏电器2006(1)针对目前电力测量仪表广泛使用中文液晶显示器的趋势,介绍一种由ATmega16L单片机和液晶MSC-G12864组成的多级中文菜单滚动显示系统,应用结果证明该实现方法简单,系统易于扩展和维护.描述了硬件电路的结构,详细分析了多级菜单软件的实现方法,包括中英文字符的存储,菜单项的构成以及整个菜单的滚动显示,给出了部分程序清单.8.期刊论文李敏通.张战国.LI Mintong.ZHANG Zhanguo一种建立单片机应用系统菜单的新方法-计算机工程2006,32(16) 提出了一种用一维线性数组实现树形拓扑结构多级菜单的方法,并用C51语言编程验证了这种方法的可行性.该方法对存储资源的利用效率高,逻辑关系清晰,且菜单的建立和修改方便,适合在单片机应用系统中使用.9.期刊论文基于单片机实现的实用汉字液晶显示设计方法-硅谷2009(19)介绍一种在多级菜单界面设计上非常简单实用的采用C51语言实现液晶显示的方法;同时介绍自定义字库和硬件汉字库的设计方法和应用.10.期刊论文陈国鹏.Chen Guopeng基于PIC18F6622的人机界面设计-工业控制计算机2009,22(9)介绍了如何使用PIC单片机PIC18F6622和液晶模块MTG-S32240进行显示控制系统的设计,分析了其硬件平台的设计要点,给出了清晰的人机界面软件设计架构,介绍了其中最主要的多级菜单的设计方法.设计的显示控制系统在实际系统中运行稳定可靠,证明了设计方法的正确性.本文链接:/doc/887e05f29e31433239689316.html /Periodical_kjxx201031057.aspx授权使用:南华大学(nhdx),授权号:af1513e4-a30e-4369-9f7f-9f1000acb2e6下载时间:2011年6月28日。

51单片机YM12864汉字图形点阵液晶显示模块

51单片机YM12864汉字图形点阵液晶显示模块

51单片机YM12864汉字图形点阵液晶显示模块­本文以AT89C51单片机控制使用比较普遍的YM12864液晶显示器为基础,介绍了一种采用分页原理实现多级中文菜单操作的方法。

给出了YM12864主要技术参数、显示特性和核心的程序。

设计的中文菜单具有一定的通用性,只需更改其中的菜单项即可将此设计应用到家电、仪器仪表等设备上,为操作者提供友好方便的中文操作界面。

51单片机YM12864汉字图形点阵液晶显示模块-_典型应用电路图。

目前小型的显示器主要有LCD和LED,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。

而LCD则可显示各种汉字和图形,尤其能实现中文菜单显示,为操作者提供方便友好的操作界面,并且功耗低,因此LCD得到广泛应用。

而现在市面上带中文字库的LCD比比皆是,价格适中,且大部分具有与MUC统一的标准接口,为使用LCD实现中文菜单操作提供了很大的方便。

相信更多的电子产品在提升性能的同时,设计更加人性化的中文菜单交互界面,将会使产品具有更广阔的前景。

二、YM12864液晶显示模块简介YM12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压)显示内容:128列×64行与MCU接口:8位或4位并行/3位串行多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。

其引脚功能为通用20脚LCD接口,用户指令集也为通用128*64LCD用户指令集,相关资料很容易获取。

因其内置中文字库,省去了自己造字库的工作量,而只需写入相应的汉字和字符内码即可显示所需要的汉字和字符,这在许多程序开发软件中很容易实现,如:WAVE、KEIL等。

单片机C语言下LCD多级菜单的一种实现方法

单片机C语言下LCD多级菜单的一种实现方法

单片机C语言下LCD多级菜单的一种实现方法(转)2012-1-10 00:45阅读(1)单片机菜单程序#include#include#define SIZE_OF_KEYBD_MENU 20 //菜单长度uchar KeyFuncIndex=0;//uchar KeyFuncIndexNew=0;void (*KeyFuncPtr)(); //按键功能指针typedef struct{uchar KeyStateIndex; //当前状态索引号uchar KeyDnState; //按下"向下"键时转向的状态索引号uchar KeyUpState; //按下"向上"键时转向的状态索引号uchar KeyCrState; //按下"回车"键时转向的状态索引号void (*CurrentOperate)(); //当前状态应该执行的功能操作} KbdTabStruct;KbdTabStruct code KeyTab[SIZE_OF_KEYBD_MENU]={{ 0, 0, 0, 1,(*DummyJob)},//顶层{ 1, 2, 0, 3,(*DspUserInfo)},//第二层{ 2, 1, 1, 9,(*DspServiceInfo)}, //第二层{ 3, 0, 0, 1,(*DspVoltInfo)},//第三层>>DspUserInfo的展开{ 4, 0, 0, 1,(*DspCurrInfo)},//第三层>>DspUserInfo的展开{ 5, 0, 0, 1,(*DspFreqInfo)},//第三层>>DspUserInfo的展开{ 6, 0, 0, 1,(*DspCableInfo)},//第三层>>DspUserInfo的展开...........{ 9, 0, 0, 1,(*DspSetVoltLevel)}//第三层>>DspServiceInfo的展开..........};void GetKeyInput(void){uchar KeyValue;KeyValue=P1&0x07; //去掉高5bitdelay(50000);switch(KeyValue){case 1: //回车键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;break;}case 2: //向上键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState; break;}case 4: //向下键,找出新的菜单状态编号{KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState; break;}default: //按键错误的处理......break;}KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate; (*KeyFuncPtr)();//执行当前按键的操作}//其中KeyTab的设计颇费尽心机。

51单片机控制LED显示汉字

51单片机控制LED显示汉字

用51单片机控制led显示汉字,电路中行方向由p0口和p2口完成扫描,由于p0口没有上拉电阻,因此接一个4.7k*8的排阻上拉。

如没有排阻,也可用8个普通的4.7k 1/8w电阻。

为提供负载能力,接16个2n5551的NPN三极管驱动。

列方向则由4—16译码器74LS154完成扫描,它由89C51的P1.0---P1.3控制。

同样,驱动部分则是16个2N5401的三极管完成的。

电路的供电为一片LM7805三端稳压器,耗电电流为100ma左右。

采用一块12*20cm的万能电路板,应当选用质量好些的发光管,(否则有坏点现象,更换起来较麻烦)首先将256个发光管插入电路板,注意插入方向,同时使高度一致,行方向直接焊接起来,列方向则搭桥架空焊接,完成后用万用表测试一下如有不亮的更换掉。

然后找一个电脑硬盘的数据线,截取所需的长度,分别将行,列线引出至电路的相关管脚即可。

原理图为了简洁,故只画出了示意图,行列方向只画出了2个三极管,屏幕只画出4个发光管,实际上发光管为256只,三极管行列方向各16只,一共32只。

焊接过程认真仔细一天时间即可完成全部制作。

将程序编译后烧写入89c51, 插入40pin Ic座,即可看到屏幕轮流显示:“倚天一出宝刀屠龙”。

当然,你可将程序的汉字代码部分更换为您所需要的代码即可显示你所需要的汉字。

程序清单:ORG 00HLOOP: MOV A,#0FFH ;开机初始化,清除画面MOV P0,A ;清除P0口ANL P2,#00 ;清除P2口MOV R2,#200D100MS: MOV R3,#250 ;延时100毫秒DJNZ R3,$DJNZ R2,D100MSMOV 20H,#00H ;取码指针的初值l100: MOV R1,#100 ;每个字的停留时间L16: MOV R6,#16 ;每个字16个码MOV R4,#00H ;扫描指针清零MOV R0,20H ;取码指针存入R0L3: MOV A,R4 ;扫描指针存入AMOV P1,A ;扫描输出INC R4 ;扫描指针加1,扫描下一个MOV A,R0 ;取码指针存入AMOV DPTR,#TABLE ;取数据表的上半部分的代码MOVC A,@A+DPTRMOV P0,A ;输出到P0INC R0 ;取码指针加1,取下一个码。

lCD5110 多级菜单

lCD5110 多级菜单

void (*KeyFuncPtr)(); //定义按键功能指针
//定义类型
typedef struct
{
unsigned char KeyStateIndex; //当前的状态索引号
unsigned char KeyUp; //按下向上键时的状态索引号
{8,7,6,3,8, (*Menu2_2)}, //第三层菜单 选择第2行,跳到第1行(up),跳到第0行(down),跳到第1层第0行(lift),跳到第2行(Right)
};
//=====================================================================
LCD_DispStringAscii6x8(0, 1, " Menu2-1");
LCD_DispStringAscii6x8(0, 2, " Menu2-2");
}
void Menu2_1(void) //在第2层菜单选中第1个选项
{
LCD_ClrScr(); //清屏
LCD_DispStringAscii6x8(0, 0, " Menu2-0");
} StateTab;
//=====================================================================
//数据结构数组
StateTab code KeyTab[]=
{
{0,2,1,0,3, (*Menu0_0)}, //顶层菜单 索引,上,下,左,右
(*KeyFuncPtr)(); //执行当前的按键操作

基于51单片机的图形液晶显示器汉字显示方法分析

基于51单片机的图形液晶显示器汉字显示方法分析
#include <reg52.h> #include <absacc.h> #define uchar unsigned char #define lcd_cmd XBYTE[0x8100] / / 图形液晶显示器指令通道地址 #define lcd_dat XBYTE[0x8000] / / 图形液晶显示器数据通道地址 void wait01(void); / / 查询读写指令和读写数据状态位 void wait03(void); // 查询数据自动写状态位 void wr_dat(uchar dat); // 写数据子程序 void wr_cmd(uchar cmd); // 写指令子程序 void wr_2para(uchar para1,uchar para2,uchar cmd); / / 双字节参数指令写入函数 void wr_1para(uchar para,uchar cmd); / / 单字节参数指令写入函数 void wr_npara(uchar cmd);// 无参数指令写入函数 void lcd_init(void); // 初始化LCD void lcd_show_haizi(uchar* ch,uchar x,uchar wide); / / 显示汉字程序 Code const unsigned char ch[ ] = {0x08,0x08, 0x08,0x12,0x12,0x32,0x51,0x91,0x10, 0x10,0x10,0x10,0x11,0x12,0x14,0x18,0x00,0x80, 0x64,0x24,0x04,0x08,0x08,0x10,0x90,0xA0,0x40, 0xA0,0x10,0x08,0x0E,0x04 , // 仪 0x01,0x01,0x7F, 0x01,0x3F,0x01,0x01,0xFF,0x02, 0x05,0x0C,0x34,0xC4,0x05,0x06,0x04,0x00,0x08, 0xFC,0x00,0xF8,0x00,0x04,0xFE,0x00,0x10,0xA0, 0x40,0x30,0x0E,0x04,0x00};// 表 主程序中首先调用 l c d _ i n i t ( ) 初始化液晶显示器,具 体 内 容 如 下: void lcd_init(void){ wr_2para(0x00,0x00,0x42); / / 设置图形显示区域首地址 wr_2para(0x10,0x00,0x43); / / 设置图形显示区域宽度,即一行显示占字节数 wr_npara(0xa7); // 光标形状设置 wr_npara(0x98); // 显示开关设置 } 接着调用 lcd_show_haizi(uchar* ch,uchar x,uchar wide) 显示汉字,c h 为指针指向字模常量数组首地址,x 为 显示缓冲区初始地址,w i d e 为一行显示所占字节数,具体 内 容 如 下: void lcd_show_haizi(uchar* ch,uchar x,uchar wide)

(完整版)单片机多级菜单编程实现

(完整版)单片机多级菜单编程实现

单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。

采用这种办法,可以方便的添加或删减菜单。

并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。

具体结构定义我的定义,做个参考:#define MENU_HLP_EN //菜单帮助信息使能typedef struct{void (*pMenuTaskInit)(void); //指向菜单任务初始化函数的指针void (*pMenuTaskEnd)(void); //指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U *MenuName; //菜单名称字符串WORK_MOD WorkMod; //工作状态编号MENU_TASK_TYP *pMenuTask; //指向菜单任务的指针void (**pTaskKeyDeal)(void); //指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U *MenuHlp; //菜单帮助字符串#endifstruct MenuTyp *pParent; //指向上层菜单的指针struct MenuTyp *pChild; //指向子菜单的指针struct MenuTyp *pRight; //指向右菜单的指针struct MenuTyp *pLeft; //指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:/****************菜单数据结构**********************/struct KeyTabStruct{uint8 MenuIndex; //当前状态索引号uint8 MaxItems; //本级菜单最大条目数uint8 ShowLevel; //菜单显示内容uint8 PressOk; //按下"回车"键时转向的状态索引号uint8 PressEsc; //按下"返回"键时转向的状态索引号uint8 PressDown; //按下"向下"键时转向的状态索引号uint8 PressUp; //按下"向上"键时转向的状态索引号void (*CurrentOperate)(); //当前状态应该执行的功能操作};uint8 MenuID; //菜单ID号uint8 MenuNextID; //下级菜单ID号//CurMenuID=本菜单ID//MaxMenuItem=同级菜单最大项数//OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了//EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了//DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子//UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子//CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={//CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DATA_VIEW, MENU_NO, MENU_NO, MENU_NO, *MenuEdit},{MENU_DATA_VIEW, 3, 1, MENU_DATA_VIEW_FIRE, MENU_EDIT, MENU_ SYS_EDIT, MENU_PRINT_DATA,*MenuEdit},{MENU_DATA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_TROUBLE, MENU_STEP_FOLLOW, *MenuDataViewIn}, {MENU_DATA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DATA_VI EW, MENU_DATA_VIEW_REPEAT, MENU_DATA_VIEW_FIRE, *MenuDataVie wIn},{MENU_DATA_VIEW_REPEAT, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_FACE_CHECK,MENU_DATA_VIEW_TROUBLE, *MenuDataViewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_STEP_FOLLOW,MENU_DATA_VIEW_REPEAT, *MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_FIRE, MENU_FACE_CH ECK,*MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DATA, MENU_DATA_VIEW, *MenuEdit},{MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULATE,MENU_TIME_SET, *MenuSumSet},{MENU_EDIT_INSULATE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,*MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULATE, *MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, *MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET,MENU_LD_CONTROL, *MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,*MenuTimeSet},{MENU_PRINT_DATA, 3, 3,MENU_PRINT_DATA_FIRE, MENU_EDIT, MENU_DATA_VIEW,MENU_SYS_EDIT, *MenuEdit},{MENU_PRINT_DATA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DATA,MENU_PRINT_DATA_TROUBLE, MENU_PRINT_SET, *MenuPrintDataIn}, {MENU_PRINT_DATA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINTER_CHECK,MENU_PRINT_DATA_FIRE, *MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_SET,MENU_PRINT_DATA_TROUBLE, *MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_DATA_FIRE,MENU_PRINTER_CHECK, *MenuPrintSet},};/**************************************编程菜单显示数据******************************/const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, "选择: 消音→退出"}, //主菜单{MENU_DATA_VIEW , 1, 6, "⒈数据查看"},{MENU_SYS_EDIT , 2, 6, "⒉系统编程"},{MENU_PRINT_DATA , 3, 6, "⒊数据打印"}},{{MENU_NO , 0, 0, "数据查看: 消音→退出"}, //数据查看{MENU_DATA_VIEW_FIRE , 1, 4, "⒈火警"},{MENU_DATA_VIEW_TROUBLE, 2, 4, "⒉故障"},{MENU_DATA_VIEW_REPEAT , 3, 4, "⒊重码"},{MENU_FACE_CHECK , 1,12, "⒋面板检测"},{MENU_STEP_FOLLOW , 2,12, "⒌单步跟踪"}},{{MENU_NO , 0, 0, "系统编程: 消音→退出"}, //系统编程{MENU_SUM_SET , 1, 0, "⒈容量设置"},{MENU_EDIT_INSULATE , 2, 0, "⒉隔离点"},{MENU_EDIT_HZ , 3, 0, "⒊汉字描述"},{MENU_LD_CONTROL , 1,12, "⒋联动控制"},{MENU_LD_DELAY , 2,12, "⒌模块延时"},{MENU_TIME_SET , 3,12, "⒍时钟调整"}},{{MENU_NO , 0, 0, "数据打印: 消音→退出"}, //数据打印{MENU_PRINT_DATA_FIRE , 1, 0, "⒈火警数据"},{MENU_PRINT_DATA_TROUBLE,2, 0, "⒉故障数据"},{MENU_PRINTER_CHECK , 3, 0, "⒊打印机自检"},{MENU_PRINT_SET , 1,12, "⒋打印设置"}},};/***********************************等待按键******************** **************/void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time >= EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); //按键音return;}}}/*********************************显示多级菜单**********************************/void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC || WhichKey == KEY_OK){ClearScreen();for(i=0;i<KeyTab[MenuNextID].MaxItems+1;i++) ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); //初始化显示oldid =0;//没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;//指示原先的项}for(i=1;i<KeyTab[MenuNextID].MaxItems+1;i++){if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,0); //正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,1); //反显当前选择的项}}WhichKey = KEY_NONE;}/******************************系统编程************************* ******/uint32 Edit(void){struct KeyTabStruct NowKeyTab; //指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); //显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); //等待按键switch(WhichKey){case KEY_ESC : if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(*NowKeyTab.CurrentOperate)(); //显示当前菜单}elseescflag =TRUE; //退出编程状态break;case KEY_OK : if(NowKeyTab.PressOk != MENU_NO) {MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作break;case KEY_UP : if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_DOWN: if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_RESET: ResetFlag = TRUE;break;default : break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag) EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsign ed char。

51单片机实现多级液晶显示中文菜单共5页word资料

51单片机实现多级液晶显示中文菜单共5页word资料

51单片机实现多级液晶显示中文菜单一、引言目前小型的显示器主要有LCD和LED,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。

而LCD则可显示各种汉字和图形,尤其能实现中文菜单显示,为操作者提供方便友好的操作界面,并且功耗低,因此LCD得到广泛应用。

而现在市面上带中文字库的LCD比比皆是,价格适中,且大部分具有与MCU统一的标准接口,为使用LCD实现中文菜单操作提供了很大的方便。

相信更多的电子产品在提升性能的同时,设计更加人性化的中文菜单交互界面,将会使产品具有更广阔的前景。

二、YM12864液晶显示模块简介YM12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压)显示内容:128列×64行与MCU接口:8位或4位并行/3位串行多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。

其引脚功能为通用20脚LCD接口,用户指令集也为通用128*64LCD 用户指令集,相关资料很容易获取。

因其内置中文字库,省去了自己造字库的工作量,而只需写入相应的汉字和字符内码即可显示所需要的汉字和字符,这在许多程序开发软件中很容易实现,如:WAVE、KEIL等。

所以使用带中文字库的LCD来实现中文菜单操会更加简便。

三、原理分析通常的人机交互界面有两种方式,选择菜单和输入参数,为了便于分析,本文使用三级树状菜单结构,如图1所示,来阐述中文菜单的显示原理。

因YM12864满屏能显示四行、每行八个汉字,故将四个选择或参数输入菜单项编为一页,不足一页的补空格。

补空格的目的是为了归一化操作,可大大简化程序。

每一个菜单、参数输入、空格都为固定的八个汉字空间。

图1中顶级菜单1、顶级菜单2、顶级参数输入3、顶级4构成一级菜单,四个菜单项为一页同时显示在液晶屏幕上;一级菜单1-1、一级菜单1-2、一级参数输入1-3、一级空格1-4构成了顶级菜单1下的二级菜单,也组成一页同时显示在液晶屏幕上,三级菜单也是如此。

(完整版)单片机多级菜单编程实现

(完整版)单片机多级菜单编程实现

单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。

采用这种办法,可以方便的添加或删减菜单。

并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。

具体结构定义我的定义,做个参考:#define MENU_HLP_EN //菜单帮助信息使能typedef struct{void (*pMenuTaskInit)(void); //指向菜单任务初始化函数的指针void (*pMenuTaskEnd)(void); //指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U *MenuName; //菜单名称字符串WORK_MOD WorkMod; //工作状态编号MENU_TASK_TYP *pMenuTask; //指向菜单任务的指针void (**pTaskKeyDeal)(void); //指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U *MenuHlp; //菜单帮助字符串#endifstruct MenuTyp *pParent; //指向上层菜单的指针struct MenuTyp *pChild; //指向子菜单的指针struct MenuTyp *pRight; //指向右菜单的指针struct MenuTyp *pLeft; //指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:/****************菜单数据结构**********************/struct KeyTabStruct{uint8 MenuIndex; //当前状态索引号uint8 MaxItems; //本级菜单最大条目数uint8 ShowLevel; //菜单显示内容uint8 PressOk; //按下"回车"键时转向的状态索引号uint8 PressEsc; //按下"返回"键时转向的状态索引号uint8 PressDown; //按下"向下"键时转向的状态索引号uint8 PressUp; //按下"向上"键时转向的状态索引号void (*CurrentOperate)(); //当前状态应该执行的功能操作};uint8 MenuID; //菜单ID号uint8 MenuNextID; //下级菜单ID号//CurMenuID=本菜单ID//MaxMenuItem=同级菜单最大项数//OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了//EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了//DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子//UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子//CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={//CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DATA_VIEW, MENU_NO, MENU_NO, MENU_NO, *MenuEdit},{MENU_DATA_VIEW, 3, 1, MENU_DATA_VIEW_FIRE, MENU_EDIT, MENU_ SYS_EDIT, MENU_PRINT_DATA,*MenuEdit},{MENU_DATA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_TROUBLE, MENU_STEP_FOLLOW, *MenuDataViewIn}, {MENU_DATA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DATA_VI EW, MENU_DATA_VIEW_REPEAT, MENU_DATA_VIEW_FIRE, *MenuDataVie wIn},{MENU_DATA_VIEW_REPEAT, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_FACE_CHECK,MENU_DATA_VIEW_TROUBLE, *MenuDataViewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_STEP_FOLLOW,MENU_DATA_VIEW_REPEAT, *MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_FIRE, MENU_FACE_CH ECK,*MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DATA, MENU_DATA_VIEW, *MenuEdit},{MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULATE,MENU_TIME_SET, *MenuSumSet},{MENU_EDIT_INSULATE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,*MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULATE, *MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, *MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET,MENU_LD_CONTROL, *MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,*MenuTimeSet},{MENU_PRINT_DATA, 3, 3,MENU_PRINT_DATA_FIRE, MENU_EDIT, MENU_DATA_VIEW,MENU_SYS_EDIT, *MenuEdit},{MENU_PRINT_DATA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DATA,MENU_PRINT_DATA_TROUBLE, MENU_PRINT_SET, *MenuPrintDataIn}, {MENU_PRINT_DATA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINTER_CHECK,MENU_PRINT_DATA_FIRE, *MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_SET,MENU_PRINT_DATA_TROUBLE, *MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DATA, MENU_PRINT_DATA_FIRE,MENU_PRINTER_CHECK, *MenuPrintSet},};/**************************************编程菜单显示数据******************************/const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, "选择: 消音→退出"}, //主菜单{MENU_DATA_VIEW , 1, 6, "⒈数据查看"},{MENU_SYS_EDIT , 2, 6, "⒉系统编程"},{MENU_PRINT_DATA , 3, 6, "⒊数据打印"}},{{MENU_NO , 0, 0, "数据查看: 消音→退出"}, //数据查看{MENU_DATA_VIEW_FIRE , 1, 4, "⒈火警"},{MENU_DATA_VIEW_TROUBLE, 2, 4, "⒉故障"},{MENU_DATA_VIEW_REPEAT , 3, 4, "⒊重码"},{MENU_FACE_CHECK , 1,12, "⒋面板检测"},{MENU_STEP_FOLLOW , 2,12, "⒌单步跟踪"}},{{MENU_NO , 0, 0, "系统编程: 消音→退出"}, //系统编程{MENU_SUM_SET , 1, 0, "⒈容量设置"},{MENU_EDIT_INSULATE , 2, 0, "⒉隔离点"},{MENU_EDIT_HZ , 3, 0, "⒊汉字描述"},{MENU_LD_CONTROL , 1,12, "⒋联动控制"},{MENU_LD_DELAY , 2,12, "⒌模块延时"},{MENU_TIME_SET , 3,12, "⒍时钟调整"}},{{MENU_NO , 0, 0, "数据打印: 消音→退出"}, //数据打印{MENU_PRINT_DATA_FIRE , 1, 0, "⒈火警数据"},{MENU_PRINT_DATA_TROUBLE,2, 0, "⒉故障数据"},{MENU_PRINTER_CHECK , 3, 0, "⒊打印机自检"},{MENU_PRINT_SET , 1,12, "⒋打印设置"}},};/***********************************等待按键******************** **************/void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time >= EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); //按键音return;}}}/*********************************显示多级菜单**********************************/void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC || WhichKey == KEY_OK){ClearScreen();for(i=0;i<KeyTab[MenuNextID].MaxItems+1;i++) ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); //初始化显示oldid =0;//没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;//指示原先的项}for(i=1;i<KeyTab[MenuNextID].MaxItems+1;i++){if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,0); //正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,1); //反显当前选择的项}}WhichKey = KEY_NONE;}/******************************系统编程************************* ******/uint32 Edit(void){struct KeyTabStruct NowKeyTab; //指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); //显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); //等待按键switch(WhichKey){case KEY_ESC : if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(*NowKeyTab.CurrentOperate)(); //显示当前菜单}elseescflag =TRUE; //退出编程状态break;case KEY_OK : if(NowKeyTab.PressOk != MENU_NO) {MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作break;case KEY_UP : if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_DOWN: if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(*NowKeyTab.CurrentOperate)(); //执行当前按键的操作}break;case KEY_RESET: ResetFlag = TRUE;break;default : break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag) EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsign ed char。

51单片机驱动16×16LED点阵显示动画汉字汇编程序

51单片机驱动16×16LED点阵显示动画汉字汇编程序

51单片机驱动16×16LED点阵显示动画汉字汇编程序电路图就不贴出来了16×16LED点阵的典型接法。

这里提供一个完整的AT89S51单片机驱动驱动led点阵显示具有动画效果的汉字的汇编程序列子.ORG 0000HST: MOV A,#0FFH ;初始化MOV P1,AMOV P2,AMOV P3,AMOV P0,ACLR AMOV R0,#50H ;显示缓存清0MOV R1,#20H ;控制清0的次数ST0: MOV @R0,AINC R0DJNZ R1,ST0;正文显示CHINESE: MOV DPTR,#TAB1 ;查表指针指向TAB1LCALL HZ;结束动画SCREE:MOV DPTR,#TAB2;查表指针指向TAB2ACALL DDMOV DPTR,#TAB3;查表指针指向TAB3ACALL DDMOV DPTR,#TAB4;查表指针指向TAB4ACALL DDLJMP CHINESE;显示8幅画面子程序,SCREE专用,用字模软件字要倒置(表必须深256字节)DD: MOV B,#00HMOV R0,#08H ;显示8幅画面AJMP CCCC0: MOV A,BADD A,#20H ;指向下一幅画面MOV B,ACC: MOV R7,#08H ;画面停留时间MOV R3,BMOV 37H,R0LCALL ENTERDIS00: LCALL DISPLAYDJNZ R7,DIS00MOV R0,37HDJNZ R0,CC0RET;汉字上移子程序,可显示8个汉字,(表必须深256字节)HZ: MOV R3,#00H ;查表偏移量MOV R5,#81H ;查表128次MOVBACK: MOV R4,#10H ;使显示完一个汉字MOVBACK0: MOV R7,#02H ;一桢画面显示时间MOV R0,#6DH ;低8位R0指向显示缓存倒数第3个字节,以备与最后1个字节交换MOV R1,#6CH ;高8位R1指向显示缓存倒数第4个字节,以备与倒数第2个字节交换MOV R2,#10H ;内存后移的次数DJNZ R5,MOVBACK1RET ;显示完该表,返回MOVBACK1: MOV A,@R0 ;低8位被后移的内存单元数据暂存入AINC R0 ;后移两字节INC R0MOV @R0,A ;放入要移的低8位数据MOV A,R0 ;R0指向下一个要后移的内存单元SUBB A,#04HMOV R0,AMOV A,@R1 ;高8位被后移的内存单元数据暂存入A INC R1 ;后移两字节INC R1MOV @R1,A ;放入要移高8位的数据MOV A,R1 ;R1指向下一个要后移的内存单元SUBB A,#04HMOV R1,A ;R1指向下一个要后移的内存单元DJNZ R2,MOVBACK1 ;显示缓存数据依次后移MOV A,R3 ;从表TAB1读入要移进50H,51H的数据MOVC A,@A+DPTR;先给50H读数据MOV 50H,AMOV A,R3 ;指向下一字节INC AMOV R3,AMOVC A,@A+DPTR;再给51H读数据MOV 51H,AMOV A,R3 ;指向下一字节INC AMOV R3,AMOV 30H,R3 ;保护数据MOV 31H,R4MOV 32H,R5DISMOV: LCALL DISPLAY ;显示当前数据DJNZ R7,DISMOVMOV R3,30HMOV R4,31HMOV R5,32HDJNZ R4,MOVBACK0MOV 30H,R3 ;保护数据MOV 32H,R5MOV R7,#24H ;显示当前数据延时DISMOV0: LCALL DISPLAYDJNZ R7,DISMOV0MOV R3,30HMOV R5,32HLJMP MOVBACK;放进一幅显示数据到显示缓存子程序,要先设好指针DPTR和R 3,影响R1,R2,R3ENTER: MOV R1,#50H ;从50H单元起把表存入MOV R2,#20H ;查表次数MOV A,R3CLLOOP_: MOVC A,@A+DPTR ;查表MOV @R1,A ;将表放进5X,6X单元INC R1 ;R1指向下一个地址空间MOV A,R3 ;查表指针后移INC AMOV R3,A ;将指针修改结果存入R3DJNZ R2,CLLOOP_;没查完转CLLOOP_RET;15MS,显示子程序,一桢32个字节,影响A,R0,R1,R3,R4,R5,R6;;单片机网提供汉字取模工具,可显示任意汉字DISPLAY: MOV A,#0FFHMOV P0,AMOV P1,AMOV P2,AMOV P3,ASETB CMOV R6,#7FH ;赋扫描字初值,左移后初值为0FEH MOV R5,#00H ;列扫描低8位控制MOV R0,#50H ;行的高8(p1)位要显示的数据起始地址MOV R1,#10H ;扫描次数DISLOOP: MOV A,@R0 ;从内存读数据MOV P2,#0FFH ;装入数据时不显示任何东西MOV P3,#0FFHCPL A ;数据取反以适合显示MOV P1,A ;送入行的高8(p1)位要显示的数据INC R0 ;修改R0指向低8位要显示的数据MOV A,@R0 ;读低8位要显示的数据CPL A ;数据取反以适合显示MOV P0,A ;送入行的低8(p0)位要显示的数据INC R0 ;R0指向下一个高8(p0)位要显示的数据LCALL NEXT ;调用列扫描程序LCALL DELAY1MS ;显示延时DJNZ R1,DISLOOP;一桢显示完返回MOV P3,#0FFH ;全灭RET;列扫描子程序DISLOOP专用NEXT: JNC NEXT1 ;C=0转扫描高8(p3)位行MOV A,R6 ;修改扫描字RL AMOV R6,AINC R5CJNE R5,#09H,NEXT0 ;R6=#0FEH时C=0AJMP NEXT1BACK: RETNEXT0: MOV P2,R6 ;扫描低8(p2)位行AJMP BACKNEXT1: MOV P2,#0FFHMOV P3,R6 ;扫描高8(p3)位行MOV A,R6 ;修改扫描字RL AMOV R6,AAJMP BACK;延时1MS子程序DELAY1MS: MOV R3,#10D0: MOV R4,#50D1: DJNZ R4,D1DJNZ R3,D0RETTAB1:DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070 H,001H,000H,01DH,070H,000H,000HDB 01FH,0F0H,011H,010H,01FH,0F0H,011H,010H,01FH,0F2 H,001H,002H,001H,002H,000H,0FEH;電DB 000H,000H,03FH,0F0H,000H,020H,000H,040H,000H,080 H,001H,000H,001H,000H,001H,004HDB 0FFH,0FEH,001H,000H,001H,000H,001H,000H,001H,000 H,001H,000H,005H,000H,002H,000H;子DB 008H,000H,008H,0FCH,07EH,084H,008H,084H,0FFH,094 H,041H,088H,022H,080H,014H,0FEHDB 07EH,0A4H,008H,0A4H,008H,098H,0FFH,098H,008H,0A4 H,008H,0A6H,008H,0C4H,008H,080H;報DB 000H,000H,000H,010H,03FH,0F8H,000H,000H,000H,000 H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,004H,07FH,0FE H,000H,000H,000H,000H,000H,000H;二DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070 H,001H,000H,01DH,070H,002H,080HDB 004H,060H,01AH,01EH,0E1H,008H,01FH,0E0H,000H,040 H,002H,080H,001H,000H,001H,000H;零DB 01FH,0F8H,001H,000H,07FH,0FEH,041H,004H,01DH,070 H,001H,000H,01DH,070H,002H,080HDB 004H,060H,01AH,01EH,0E1H,008H,01FH,0E0H,000H,040 H,002H,080H,001H,000H,001H,000H;零DB 004H,000H,003H,000H,001H,080H,001H,000H,0FFH,0FE H,000H,000H,000H,000H,004H,080HDB 006H,040H,004H,020H,008H,010H,008H,018H,010H,00C H,020H,00CH,040H,008H,000H,000H;六DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000 H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000 H,000H,000H,000H,000H,000H,000H;(空);结束动画;-- 水纹 -- ** 宋体, 12 **; 当前所选字体下一个汉字对应的点阵为: 宽度x高度=128x16, 调整后为: 128x16TAB2:DB 000H,000H,000H,000H,000H,000H,000H,000H,000 H,000H,000H,000H,000H,000H,001H,080HDB 001H,080H,000H,000H,000H,000H,000H,000H,000H,000 H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000 H,000H,000H,001H,080H,003H,0C0HDB 003H,0C0H,001H,080H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,000H,000H,001H,080 H,002H,040H,004H,020H,008H,010HDB 008H,010H,004H,020H,002H,040H,001H,080H,000H,000 H,000H,000H,000H,000H,000H,000HDB 000H,000H,001H,0C0H,006H,030H,008H,008H,008H,008 H,010H,004H,020H,002H,020H,002HDB 020H,002H,010H,004H,008H,008H,008H,008H,006H,030 H,001H,0C0H,000H,000H,000H,000HDB 003H,0C0H,00CH,030H,010H,008H,010H,008H,060H,006 H,040H,002H,080H,001H,080H,001HDB 080H,001H,080H,001H,040H,002H,060H,006H,010H,008 H,010H,008H,00CH,030H,003H,0C0HDB 000H,000H,038H,01CH,046H,062H,081H,081H,080H,001 H,040H,002H,040H,002H,020H,004HDB 020H,004H,040H,002H,040H,002H,080H,001H,081H,081 H,046H,062H,038H,01CH,000H,000HDB 0C0H,003H,0A0H,005H,058H,01EH,024H,024H,024H,024 H,01EH,078H,005H,0A0H,002H,040HDB 002H,040H,005H,0A0H,01AH,078H,024H,024H,024H,024 H,058H,01AH,0A0H,005H,0C0H,003HDB 000H,000H,0C0H,003H,0B0H,00DH,088H,011H,044H,022 H,025H,0A4H,012H,048H,00DH,0B0HDB 00DH,0B0H,012H,048H,025H,0A4H,044H,022H,088H,011 H,0B0H,00DH,0C0H,003H,000H,000H;--福-- ** 宋体, 12 **; 当前所选字体下一个汉字对应的点阵为: 宽度x高度=16x16, 调整后为: 16x16TAB3:DB 0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0A AH,055H,055H,0AAH,0AAH,055H,055H,0AAHDB 055H,0AAH,0AAH,055H,055H,0AAH,0AAH,055H,055H,0 AAH,0AAH,055H,055H,0AAH,0AAH,055HDB 0AAH,055H,055H,0AAH,0AAH,055H,055H,0AAH,0AAH,0 55H,054H,02AH,0A8H,015H,050H,00AHDB 050H,00AH,0A8H,015H,054H,02AH,0AAH,055H,055H,0A AH,0AAH,055H,055H,0AAH,0AAH,055HDB 0AAH,055H,054H,02AH,0A8H,015H,050H,00AH,0A0H,00 5H,040H,002H,080H,001H,000H,000HDB 000H,000H,080H,001H,040H,002H,0A0H,005H,050H,00A H,0A8H,015H,054H,02AH,0AAH,055HDB 0A0H,005H,040H,002H,091H,0F9H,000H,000H,074H,0F0 H,019H,008H,031H,008H,058H,0F0HDB 014H,000H,011H,0F8H,012H,044H,013H,0FCH,012H,044 H,091H,0F9H,040H,002H,0A0H,005HDB 020H,000H,013H,0FEH,010H,000H,0FDH,0FCH,005H,004 H,009H,004H,011H,0FCH,030H,000HDB 05BH,0FEH,096H,022H,012H,022H,013H,0FEH,012H,022 H,012H,022H,013H,0FEH,012H,002HDB 000H,004H,07FH,0C8H,000H,008H,03FH,0BFH,020H,0A0 H,020H,090H,03FH,088H,000H,00CHDB 07FH,0DAH,044H,069H,044H,048H,07FH,0C8H,044H,048 H,044H,048H,07FH,0C8H,040H,048HDB 010H,040H,010H,080H,091H,000H,073H,0FFH,014H,080 H,018H,040H,040H,0FFH,05EH,092HDB 052H,092H,052H,092H,052H,0FEH,052H,092H,052H,092 H,05EH,092H,040H,0FFH,000H,000HDB 012H,002H,013H,0FEH,012H,022H,012H,022H,013H,0FE H,012H,022H,096H,022H,05BH,0FEHDB 030H,000H,011H,0FCH,009H,004H,005H,004H,0FDH,0FC H,010H,000H,013H,0FEH,020H,000HTAB4:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 0F8H,0FFH,0F8H,0FFH,0C0H,0FFH,0C0HDB 0FEH,000H,0FEH,000H,0F0H,000H,0F0H,007H,0B0H,002 H,0C8H,002H,048H,006H,030H,002H;STEP1DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H, 0FFH,0F8H,0FFH,0C0H,0FFH,0C0HDB 0FEH,000H,0FEH,000H,0F6H,000H,0F9H,007H,089H,002 H,086H,001H,000H,005H,000H,002H;STEP2DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H, 0FFH,0F8H,0FFH,0C0H,0FFH,0C0HDB 0FEH,0C0H,0FFH,020H,0F1H,020H,0F0H,0C7H,080H,001 H,080H,007H,000H,001H,000H,007H;STEP3DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0F8H, 0FFH,0F8H,0FFH,0D8H,0FFH,0E4HDB 0FEH,024H,0FEH,018H,0F0H,000H,0F0H,001H,080H,001 H,080H,007H,000H,005H,000H,005H;STEP4DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FBH, 0FFH,0FCH,0FFH,0C4H,0FFH,0C3HDB 0FEH,000H,0FEH,000H,0F0H,000H,0F0H,007H,080H,001 H,080H,007H,000H,004H,000H,007H;STEP5DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 000H,000H,000H,000H,000H,000HDB 000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH,0FFH,0FFH,0FFHDB 000H,000H,0F4H,058H,084H,0D4H,085H,052H,0F5H,052 H,085H,052H,086H,054H,0F4H,058HDB 000H,000H,022H,05EH,022H,050H,022H,050H,023H,0DE H,022H,050H,022H,050H,0FAH,05EHEND。

单片机系统中液晶的中文菜单和图形显示设计

单片机系统中液晶的中文菜单和图形显示设计
As an example of OCMJ4×8C LCD controlled by AT89S52 single chip microcomputer, the paper introduces the function and features of AT89S52 single chip microcomputer, and illustrates a method of displaying multilevel menus and displaying dynamic waveform. The design thoughts of hardware and software mentioned is effective and universal in this system, so the system could circumscribe different sensors, and become meters which could measure different parameters. When the content of menu on different meters is changed, correctly setting the parameter of menu can make it properly displayed. This system also offer a serial communication interface which erect communication between single chip microcomputer and personal computer, so it could realize watching different meters by computer in long distance. In a word, this system supplies a basal platform for designing meters which are used in automatic production. Limited by time and laboratorial condition, I don’t contrive a perfect meter. But I believe that the menu platform of LCD will be widely used in designing all kinds of meters. Keywords: single chip microcomputer; liquid crystal display; multilevel menus; dynamic waveform

单片机C语言下LCD多级菜单的一种实现方法

单片机C语言下LCD多级菜单的一种实现方法

第1期2006年2月工矿自动化IndustryandMineAutomationNO1文章编号:1671—251X(2006)01—0050一02单片机C语言下LCD多级菜单的一种实现方法陆铮1,罗嘉2(1.天地科技股份有限公司常州自动化分公司,江苏常州2130152.宁夏煤矿安全监察局,宁夏银川750001)摘要:介绍了在C语言环境下,在LCD液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑、实用的程序模型。

关键词:液晶显示屏;多级菜单;单片机;C语言;I。

CD中图分类号:TP311.1文献标识码:B0引言由于C语言的结构性和模块化,采用c语占编写的程序容易阅读和维护,还有很好的可移植性。

本文介绍一种用C语言实现的LCD多级菜单的方法,该方法已成功应用在煤矿安全监测设备上。

1硬件环境及LCD菜单实现的功能图形点阵式液晶可显示用户自定义的任意符号和图形,并可卷动显示。

它作为单片机系统人机交互界面的重要组成部分被广泛应用于实时检测和显示的仪器仪表中,例如手机r的显示屏就是图形点收藕日期:2005—11—2阵液晶。

采用图形点阵式液晶显示较之其它显示方式主要有以下优点:(1)工作电压低、功耗极低。

工作电压仅为3~5V.工作电流≤10tuA/cm2,特别适用于低功耗的仪器仪表中。

(2)液晶显示属被动昴示,受外界光线干扰小。

(3)图形点阵式液晶可显示的信息量大、分辨率高。

(4)不产生电磁干扰。

(5)可靠性高,使用寿命长。

本文所介绍的I.CI?采用128×64点阵的液晶屏,因此可显示16×16点阵的汉字4行8列。

菜单为多级嵌套形式,最长的有13层,主要完成对某个,'…●,'l,,l●l…,',,',,●'…,●’’,,,●’’’,,,'',…,’’●’’,,,,’’’…,,’,,■'…,,'…●…,,……,',,'系统要运行可靠,对其有关设备是否能够安全运行地检测也是很重要的一环。

51单片机控制LCD12864液晶屏显示图形菜单

51单片机控制LCD12864液晶屏显示图形菜单

51单片机控制LCD12864液晶屏显示图形菜单想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任何效果,这次就来个彻底的解脱,写一个单函数就能完成所有功能的函数,只需要2个图片就能完成任意菜单内容的菜单,可以有2的8次方=256个选择结果,应该能满足所有的要求了吧?菜单的内容就是图片的内容,因此可以显示任意大小的图形文字混合的菜单条目,比如使用字符模式,一屏只能显示4行菜单(64/16=4),且只能显示汉字和字符等,显示位置等等的都受限,而这个方法可以显示比如12*12(64/12=5行)的字符,8*8(64/8=8行)的字符,甚至不是字符,可以是图标+文字+任意其他的图像,只要是图片能显示的,都可以。

哈哈,比较复杂,现在只写了一少半,预期能够提供多种显示效果,希望我能完成。

void Lcd_Draw_BmpMenu(UINT8 *pMenu,UINT8*pTitleBmp,UINT8 *pMenuBmp){/*使用2张图片作为纯图形菜单来选择和操作,返回被选择的项,pMenu是一个指向菜单的各种参数的结构体的指针,pTitleBmp指向作为菜单标题的一张图片,pMenuBmp指向作为菜单内容的图片(液晶的控制芯片是ST7920)yx-->;>;|\|/*/xdata struct { //除非另有说明x坐标均为大列的坐标,一个大列是16个像素,一行共有8大列数据//========= 以下是入参基本参数,一旦确定,最好不要随意更改 ======UINT8 Title_x;//标题图片在屏幕上的显示起始位置X UINT8 Title_y;//标题图片在屏幕上的显示起始位置Y UINT8 Title_Len_x;//标题图片的宽UINT8 Title_Len_y;//标题图片的高UINT8 Menu_x;//菜单在屏幕上的显示起始位置XUINT8 Menu_y;//菜单在屏幕上的显示起始位置YUINT8 Menu_End_y;//菜单在屏幕上的显示结束位置Y UINT8 Menu_Bmp_x;//菜单图片的宽UINT8 Menu_Bmp_y;//菜单图片的高UINT8 Menu_Item_Height;//每一菜单项的高度(像素为单位)UINT8 Line_x;//最后下划线的起始坐标xUINT8 Line_y;//最后下划线的起始坐标YUINT8 Line_Len;//最后下划线的长度,如果为0,则表示不画出这条线(像素为单位)//====== 以下是菜单的风格设置 ========UINT8 Scroll_Speed;//菜单滚动的速度,0~9个级别,越低越快,越高越慢(液晶屏显示速度有快有慢,调整这个参数用于适用不同的液晶屏UINT8 Continue_Scroll;//指定菜单是否可以形成一个连续滚动选择的效果;0不连续,背景和反白位置都会根据实际情况滚动 1菜单连续滚动,反白位置不动UINT8 RePaint;//=0不重画菜单,=1重画整个菜单的图像,一般都是首次调用本函数的时候置1,用于画出整个菜单,以后调用置0就可以了UINT8 MenuEffect;//菜单运动的效果;0没有任何效果,只是最普通的菜单形态,1平滑滚动,2平滑滚动,具有惯性效果,3具有减速效果,没有惯性效果,4具有减速和惯性效果//====== 以下用于控制菜单的选择参数 =======UINT8 Last_Select_Item;//上次执行本函数后,所选择的菜单项UINT8 Select_Item;//本次执行本函数,要选择的菜单项}M;//============== 以下是变量定义 =============== UINT8 xdata Menu_Item_Count;//总共有几个菜单项UINT8 xdata Menu_Screen_Count;//当前一屏最多可以显示几个菜单项UINT8 xdataMenu_Box_x,Menu_Box_y,Menu_Box_End_x,Menu_Box_End _y;//需要刷新的区域的坐标UINT8 *pMenu_Box_Bmp;//需要显示的菜单项的指针StructCopy(&M.Title_x,pMenu,19);//把参数复制到本函数内,便于操作Menu_Item_Count=M.Menu_Bmp_y/M.Menu_Item_Height;/ /总共有几个菜单项Menu_Screen_Count=(M.Menu_End_y-M.Menu_y)/M.Menu_ Item_Height;//一屏最多可以显示多少项菜单//---------------------------------------------------------------------------if(M.RePaint==1)//如果需要重画整个菜单图像{Lcd_Draw_BMP(M.Title_x,M.Title_y,M.Title_x+M.Title_Len_x,M.Title_y+M.Title_Len_y,pTitleBmp);//画出标题的图片if(M.Line_Len!=0)Lcd_DrawRowLine(M.Line_x,M.Line_y,M.Line_Len,1);/ /画出最下面的线}//---------------------------------------------------------------------------//-----------需要刷新的图像的区域Menu_Box_x=M.Menu_x;Menu_Box_y=M.Menu_y;Menu_Box_End_x=M.Menu_x+M.Menu_Bmp_x;Menu_Box_End_y=M.Menu_End_y;。

液晶显示多级汉字菜单的方法及电路

液晶显示多级汉字菜单的方法及电路

液晶显示多级汉字菜单的方法及电路关键字:液晶显示多级汉字菜单的方法摘要:以8031单片机控制MGLS-240128液晶显示器为例,介绍利用CCDOS 中的汉字库(HZK16)实现多级汉字菜单显示的方法。

当显示内容改变时,不需要更改程序,只要更改菜单参数即可显示。

关键词:液晶显示器;MGLS-240128;汉字库;多级菜单1. 引言目前常用的小型显示器有LCD和LED ,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。

而LCD则可显示各种汉字和图形,能实现中文菜单显示,便于操作,并且功耗低。

因此LCD得到广泛应用。

用LCD显示汉字时,一般采用自制汉字模和汉字编码,当显示内容较多时,字模库容量很大,汉字的编码亦很难记住,给编程造成困难,当显示内容改变时,字模库也要作相应变化,工作量大。

这里介绍一种直接利用CCDOS中的汉字库(HZK16)显示汉字多级菜单的方法。

将HZK16和菜单内容固化在EPROM中,从而方便地实现了多级汉字菜单的显示,充分发挥了LCD的优点。

2. MGLS-240128显示模块简介及接口电路本文使用的显示模块是MGLS-240128,它的点阵数是240×128,如显示16×16点阵的汉字,可显示8行,每行15个字。

MGLS-240128模块内藏HD61830控制器,模块的电原理框图如图1所示。

有时在菜单显示中,显示的页数很多。

为了便于在EPROM中定位,在计算机中编辑菜单时,应在每页菜单前加pxx:其中p表示一页开始,xx为该页序号,冒号表示以下为该页的内容。

回车可换行到下一行并进入中文编辑状态输入,需要显示的内容。

每页分8行,每行15个汉字或字符(包括空格)。

在编辑的文件中,每行结尾有回车、换行符。

这样,每一页菜单中,pxx以ASCII码形式存放,每个汉字以机器内码形式存放,每个机器内码占两字节。

单片机控制的LCD汉字显示电路设计(独家完整版)

单片机控制的LCD汉字显示电路设计(独家完整版)

单片机控制的LCD汉字显示电路设计1概述自20世纪以来,电子行业发生着翻天覆地的变化。

电子行业的发展推动着社会的发展,因此,世界各国也大力发展电子行业。

其中,在电子行业中,显示器产业是其中尤为重要的产业之一。

然而,在显示器产业中,LCD技术是最重要的技术之一。

众所周知,单片机像是电子行业中发挥着巨大作用的精灵。

它的能耗小、价格低廉,在简单的电子实验方面的应用非常广泛,在教育教学中深受广大电子教育工作者的喜爱。

1.1课题背景在电子行业中,LCD已被公认为是媒体时代的关键器件,它的低功耗、体积小、易于实现画面显示及优良的全色显示性能等特点,使其在现代社会中得到了广泛的应用。

可以说,LCD是本世纪初最有活力的电子产品之一。

与此同时,单片机的应用领域也非常广泛,大到导弹的导航装置,飞机上各种仪表的控制,小到广泛使用的智能IC卡,比如学校中使用的校园一卡通等,这些都离不开单片机。

因此,通过使用单片机可以使我们完成很多令我们意想不到的事情。

所以,本着理论与实践相结合的原则,本设计以单片机为核心控制器件控制LCD显示模块,通过硬件和软件的共同配合实现在128×64点阵液晶屏上显示汉字、字符等的功能,本系统由ATMEGA8单片机和点阵式液晶显示屏模块构成。

1.2设计要求系统硬件设计:系统选用ATMEGA8单片机作为主控和处理设备,LCD12864模块作为输出设备。

系统软件设计:微控制器处理和LCD模块显示部分的程序设计。

1.3 LCD简介及发展液晶显示器是一种采用了液晶控制透光度技术来实现色彩的显示器。

众所周知,即使长时间观看LCD显示屏幕也不会对眼睛造成伤害,这主要是因为LCD显示器没有辐射,画面图像很稳定。

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

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

用51单片机实现在88 LED点阵上显示汉字“中”

用51单片机实现在88 LED点阵上显示汉字“中”

用51单片机实现在8*8 LED点阵上显示汉字“中”1.实验任务用汇编语言利用51单片机在8*8 LED点阵上显示单个汉字“中”2.硬件电路连线图把“单片机系统”区域中的P0端口与P2端口分别用8芯排芯连接到“8*8LED点阵模块”的端口上,如下图所示。

3.8*8 LED点阵工作原理8*8 LED点阵结构如下图所示8*8 LED点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,要使某一个二极管发光,只需该二极管对应的列输入‘0’,其他列输入‘1’,该二极管对应的行输入‘1’,其他行输入‘0’。

本次采用逐列扫描的方式,即P2口输出列码决定哪一列能亮,P0口输出行码决定列上哪些LED亮,能亮的列从左向右扫描完8列即显示出一帧完整的图像,因为单片机扫描速度很快,人的视觉有暂停现象,所以看见的就是一个字了。

4.汇编程序ORG 0000HLJMP L0ORG 0050HL0: MOV P0,#00HMOV P2,#7FHMOV P0,#0HMOV P0,#00HMOV P2,#0BFHMOV P0,#10HMOV P0,#00HMOV P2,#0DFHMOV P0,#7CHMOV P0,#00HMOV P2,#0EFHMOV P0,#54HMOV P0,#00HMOV P2,#0F7HMOV P0,#7CHMOV P0,#00HMOV P2,#0FBHMOV P0,#10HMOV P0,#00HMOV P2,#0FDHMOV P0,#10HMOV P0,#00HMOV P2,#0FEHMOV P0,#10HLJMP L0END5 . 执行结果。

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

51单片机实现多级液晶显示中文菜单
【摘要】以AT89C51单片机控制使用比较普遍的YM12864液晶显示器为基础,介绍了一种采用分页原理实现多级中文菜单操作的方法。

给出了YM12864主要技术参数、显示特性和核心的程序。

设计的中文菜单具有一定的通用性,只需更改其中的菜单项即可将此设计应用到家电、仪器仪表等设备上,为操作者提供友好方便的中文操作界面。

【关键词】单片机;分页;YM12864液晶;中文菜单
一、引言
目前小型的显示器主要有LCD和LED,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。

而LCD则可显示各种汉字和图形,尤其能实现中文菜单显示,为操作者提供方便友好的操作界面,并且功耗低,因此LCD得到广泛应用。

而现在市面上带中文字库的LCD比比皆是,价格适中,且大部分具有与MCU统一的标准接口,为使用LCD实现中文菜单操作提供了很大的方便。

相信更多的电子产品在提升性能的同时,设计更加人性化的中文菜单交互界面,将会使产品具有更广阔的前景。

二、YM12864液晶显示模块简介
YM12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM (GDRAM)。

主要技术参数和显示特性:
电源:VDD 3.3V~+5V(内置升压电路,无需负压)
显示内容:128列×64行
与MCU接口:8位或4位并行/3位串行
多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。

其引脚功能为通用20脚LCD接口,用户指令集也为通用128*64LCD用户指令集,相关资料很容易获取。

因其内置中文字库,省去了自己造字库的工作量,而只需写入相应的汉字和字符内码即可显示所需要的汉字和字符,这在许多程序开发软件中很容易实现,如:WA VE、KEIL等。

所以使用带中文字库的LCD来实现中文菜单操会更加简便。

三、原理分析
通常的人机交互界面有两种方式,选择菜单和输入参数,为了便于分析,本文使用三级树状菜单结构,如图1所示,来阐述中文菜单的显示原理。

因YM12864满屏能显示四行、每行八个汉字,故将四个选择或参数输入菜单项编为一页,不足一页的补空格。

补空格的目的是为了归一化操作,可大大简化程序。

每一个菜单、参数输入、空格都为固定的八个汉字空间。

图1中顶级菜单1、顶级菜单2、顶级参数输入3、顶级4构成一级菜单,四个菜单项为一页同时显示在液晶屏幕上;一级菜单1-1、一级菜单1-2、一级参数输入1-3、一级空格1-4构成了顶级菜单1下的二级菜单,也组成一页同时显示在液晶屏幕上,三级菜单也是如此。

使用4*4键盘进行操作,其中“0-9”为数字键,“Esc”为删除/返回键,“Down”为向下选择健,“Enter”为确定健,剩余三个按键预留备用,为了不与其他程序的通用寄存器混淆,而使用89C51的第二组通用寄存器R0和R2来记录菜单的页码和行码(光标所在的菜单行)。

现通过按键的功能来分析多级中文菜单的原理。

当按下“Down”键后,光标移动一行(光标所在的行表示此行显示的菜单处于激活状态)行码加1,即(R2)=(R2)+1;当光标已在本级菜单的最后一项,此时按下“Down”键,光标回到本级菜单的首项,行码为0,即(R2)=0。

例如:光标处于二级菜单1-1-1,按下“Down”键,则光标移动到二级菜单1-1-2。

按下“Enter”,分两种情况处理,如为选择菜单,则根据页码和行码的值:R0*4+R2调用下一级子菜单显示,同时将子菜单的页码赋值给R0,得到子菜单的页码,并且使行码R2=0,表示处于此级菜单的首项。

例如:光标处于顶级菜单1,按下“Enter”键,则液晶显示屏上显示一级菜单1-1、一级菜单1-2、一级参数输入1-3、一级空格1-4。

如为参数输入菜单,则进入相应的参数输入对话框。

例如:光标处于参数输入1-3,按下“Enter”健,则液晶显示屏上显示对应的要求输入参数的对话框(一般为数字,为了简化程序,可采用统一的参数输入对话框),此时输入符合要求的参数,再按下“Enter”键,菜单将返回到上一级菜单,同时将输入到YM12864液晶显示器的数据读出,送到相应的单元存储,以备使用。

“Esc”键起到返回上一级菜单和删除参数输入时的错误输入双重功能,程序中只需使用一标志位来区分选择菜单和参数输入菜单即可,同时修改页码和行码值,即R0和R1的值。

例如:液晶屏上显示二级菜单1-1-1、二级菜单1-1-2、二级菜单1-1-3、二级空格1-1-4,此时按下“Esc”键,则返回到一级,屏幕上显示一级菜单1-1、一级菜单1-2、一级参数输入1-3、一级空格1-4。

四、硬件设计
使用89C51的P1口作为液晶显示器的数据口,使用P0口作为键盘扫描端口,当然这些端口也可以使用扩展口,只需在程序的开头修改端口的值便可。

电路图如图1所示。

五、软件设计
重点在于软件的设计,而程序的关键又在于使用了分页的操作方式。

以下为
菜单数据,按页的方式存放,不足一页的补空格。

TABLE00:
DB’顶级菜单1 ‘;第0页,每页为4行
DB’顶级菜单2 ‘
DB ‘顶级参数输入3 ‘
DB ‘’;此为顶级空格4
TABLE10:
DB ‘一级菜单1-1 ‘;第1页
DB ‘一级菜单1-2 ‘DB ‘一级参数输入1-3 ‘
DB ’‘;此为一级空格1-4
TABLE20:
DB ‘一级菜单2-1 ‘;第2页
DB ‘一级参数输入2-2 ‘DB ‘‘;此为一级空格2-3
DB ‘‘;此为一级空格2-4
…………………………
由于篇幅有限,不能将所有的程序都写出,只是将程序的框架列出,其它程序如:按键扫描子程序、YM12864显示子程序可参照其它资料。

实际应用时需要根据具体情况加以补充。

六、结语
本方法设计的多级中文菜单易于实现、可靠性高,并且具有一定的通用性和使用价值,实际应用时根据产品的操作要求修改上述的菜单名称即可。

当某级菜单的项目数有多页时,为方便操作,可增加翻页按键;所有菜单的页数最大为256页,共1024个菜单项,对于一般的系统完全够用。

采用此方法设计的全中文菜单操作的信号发生器曾获得2007年全国大学生电子设计大赛三等奖(江西赛区)。

参考文献
[1]毕万新.单片机原理与接口技术[M].大连理工大学出版社,2005,8.
[2]夏继强,沈德金,邢春香.单片机实验与实践教程[M].北京航空航天大学出版社,2006,5.
[3]高吉祥.全国大学生电子设计竞赛培训系列教程[M].电子工业出版社,2007,5.。

相关文档
最新文档