stm32_12864液晶_菜单设计
- 格式:docx
- 大小:21.54 KB
- 文档页数:14
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标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
带字库12864液晶详解12864液晶⼀、概述带中⽂字库的128X64是⼀种具有4位/8位并⾏、2线或3线串⾏多种接⼝⽅式,内部含有国标⼀级、⼆级简体中⽂字库的点阵图形液晶显⽰模块;其显⽰分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII 字符集.利⽤该模块灵活的接⼝⽅式和简单、⽅便的操作指令,可构成全中⽂⼈机交互图形界⾯。
可以显⽰8×4⾏16×16点阵的汉字.也可完成图形显⽰.低电压低功耗是其⼜⼀显著特点。
由该模块构成的液晶显⽰⽅案与同类型的图形点阵液晶显⽰模块相⽐,不论硬件电路结构或显⽰程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本特性:l 低电源电压(VDD:+3.0--+5.5V)l 显⽰分辨率:128×64点l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)l 内置 128个16×8点阵字符l 2MHZ时钟频率l 显⽰⽅式:STN、半透、正显l 驱动⽅式:1/32DUTY,1/5BIASl 视⾓⽅向:6点l 背光⽅式:侧部⾼亮⽩⾊LED,功耗仅为普通LED的1/5—1/10l 通讯⽅式:串⾏、并⼝可选l 内置DC-DC转换电路,⽆需外加负压l ⽆需⽚选信号,简化软件设计l ⼯作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接⼝说明*注释1:如在实际应⽤中仅使⽤串⼝通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”⽤焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共⽤⼀个电源,可以将模块上的JA、JK⽤焊锡短接。
2.2并⾏接⼝管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对⽐度(亮度)调整4RS(CS)H/LRS=“H”,表⽰DB7——DB0为显⽰数据RS=“L”,表⽰DB7——DB0为显⽰指令数据5R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线9 DB2 H/L 三态数据线10 DB3 H/L 三态数据线11 DB4 H/L 三态数据线12 DB5 H/L 三态数据线13 DB6 H/L 三态数据线14 DB7 H/L 三态数据线15 PSB H/L H:8位或4位并⼝⽅式,L:串⼝⽅式(见注释1)16 NC - 空脚17 /RESET H/L 复位端,低电平有效(见注释2)18 VOUT - LCD驱动电压输出端19 A VDD 背光源正端(+5V)(见注释3)20 K VSS 背光源负端(见注释3)*注释1:如在实际应⽤中仅使⽤并⼝通讯模式,可将PSB接固定⾼电平,也可以将模块上的J8和“VCC”⽤焊锡短接。
一起来学LCD12864菜单程序(包含完整程序)一起来学LCD12864菜单程序(包含完整程序)/*-------------------------------------------项目名:家电中央控制系统工程程序名:显示MCU总体程序编写人:杜洋初写时间:2005年9月5日晚20时程序功能:实现液晶、语音部分的人机对话和总线的通信实现方法:用中断实现总线接收CPU说明:89S5212MHZ晶振接口说明:(详见初定义)信息说明:修改日志:NO.1--------------------------------------------*/;----------------------------------------初定义LCDDAT EQU P2RS EQU P3.5RW EQU P3.6E EQU P3.7REDLED EQU P3.4BACKLED EQU P3.1PLAY EQU P1.7STOPIN EQU P3.0LIN EQU P3.2SPDAT EQU P1XX2 EQU P0.0LT_RAM EQU 30HLR_RAM EQU 40HSP_RAM EQU 20HDIS1_RAM EQU 50HDIS2_RAM EQU 70HDIS3_RAM EQU 60HDIS4_RAM EQU 80HRR1 EQU 26HRR3 EQU 21HRR4 EQU 22HT0_RAM EQU 23HQR3_RAM EQU 24HQR2_RAM EQU 25HLCDDISPLAY EQU 26H ;菜单显示移位寄存器MENU_RAM EQU 27H;菜单位置寄存器ONOFFLCD EQU 28H;-------------------------------------程序入口ORG 0000HJMP LCD_STARTORG 0003HJMP LIN_INT0ORG 000BHJMP LED_T0ORG 0030H;--------------------------------------主程序开始LCD_START br>SETB PLAYMOV T0_RAM,#250MOV TMOD,#01HSETB ET0MOV TL0,#0B0H ;50MS 定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值CLR IT0SETB EX0SETB TR0SETB EAMOV DPTR,#TAB_0CALL START_LCD;-----自检程序CALL DL1SMOV MENU_RAM,#00HMOV DPTR,#TAB_HCALL START_LCDCLR LCDDISPLAY;--------------------------------------主循环体程序LCD_LOOP br>JB ONOFFLCD,DISPLAY_PROLCD_LOOP_1br>JMP LCD_LOOP;---------------------------- 菜单显示处理DISPLAY_PRO br>MOV A,MENU_RAMMOV DPTR,#MENUTAB_HOSTRLC AJMP @A+DPTRMENUNEXT br>CALL START_LCDCLR LCDDISPLAYCLR ONOFFLCDJMP LCD_LOOP;-------------------------MENUTAB_HOST:JMP HOST_H ;主菜单JMP HOST_1 ; 1,控制JMP HOST_2 ; 2,设置JMP HOST_3 ; 3,智能JMP HOST_4 ; 4,帮助<。
基于STM32系列的12864显示/*-----------------------------------------------LCD初始化------------------------------------------------*/void CS_Set_H( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_13);}void CS_Set_L( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_13);}void SCLK_Set_H( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SCLK_Set_L( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SID_Set_H( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void SID_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void PSB_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_2);}/*--------------------------------按照液晶的串口通信协议,发送数据----------------------------------*/void LCD_SendByte(unsigned byte){unsigned i;for(i=0;i<8;i++){SCLK_Set_L();if(byte&0x80){SID_Set_H();}else{SID_Set_L();}LCD_Delay(1);SCLK_Set_H();byte<<=1;LCD_Delay(1);}}/*--------------------------------写串口命令,分三个字节完成----------------------------------*/void LCD_WriteCom(unsigned com){CS_Set_H(); //打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(com&0xf0);//第二字节LCD_SendByte((com<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------写数据,分三个字节完成----------------------------------*/void LCD_WriteData(unsigned date){CS_Set_H();//打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(date&0xf0);//第二字节LCD_SendByte((date<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------LCD初始化----------------------------------*/void LCD_Init(){LCD_Delay(50);PSB_Set_L(); //选择串口通信模式(该端口未定义)LCD_Delay(50);LCD_WriteCom(0x30);//基本指令集动作, 绘图不显示LCD_Delay(50);LCD_WriteCom(0x0c);//开显示,不显示游标和游标位置LCD_Delay(50);LCD_WriteCom(0x01);//清屏LCD_Delay(50);}/*--------------------------------清屏----------------------------------*/void LCD_Clear(){LCD_WriteCom(0x01);//清屏}/*--------------------------------设定显示位置----------------------------------*/void LCD_SetPos(unsigned x,unsigned y){unsigned pos;if(x == 0)x = 0x80;else if(x == 1)x = 0x90;else if(x == 2)x = 0x88;else if(x == 3)x = 0x98;pos = x + y;LCD_WriteCom(pos);//显示地址}/*-----------------------------------------------显示函数------------------------------------------------*/Display(unsigned x,unsigned y,unsigned date) {unsigned a;unsigned b;unsigned dat;a=x;b=y;dat=date;LCD_SetPos(a,b); LCD_WriteData(dat); }。
首先定义一个菜单结构typedef struct menu//定义一个菜单{u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数u8 selected;//当前选择项u8 *menuItems[17];//菜单项目struct menu **subMenus;//子菜单struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数}Menu;Menu MainMenu = { //定义主菜单0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 {"设置1 \x10","设置2 \x10","输入指令发送","查询\x10"}};Menu searchMenu = {//查询菜单0,3,6,0,{"记帐记录明细","未采集记录数","设备机号","本机IP地址","记录空间大小","软件版本"}};Menu *currentMenu;//当前的菜单用于显示菜单项void display(u8 line) //显示菜单项并设置选中的项反白{int i;line = 3-(currentMenu->range_to-line);Lcd_Fill(0x00);for(i = 0;i<4;i++){Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]);}highlight(0,line,8,255);//反白显示指定行}void func(void){printf("hello\r\n");}初始化菜单:void initMenu(){MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数MainMenu.subMenus[1] = NULL;MainMenu.subMenus[2] = NULL;MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单MainMenu.func = malloc(sizeof(&func)*4);MainMenu.func[0] = NULL;MainMenu.func[1] = NULL;MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数MainMenu.func[3] = NULL;MainMenu.parent = NULL;//表示是顶级菜单searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;searchMenu.func = malloc(sizeof(&printf)*6);searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项currentMenu = &MainMenu;}mainint main(void){delay_init();uart_init(9600);Lcd_Init();KEY_Init();initMenu();display(currentMenu->selected);while(1){key = KEY_Scan();if(key == 0){delay_ms(10);continue;}printf("key %d is press\r\n",key);switch(key){case 12://向上if(currentMenu->selected == 0)//到了第一项break;else{currentMenu->selected--;if(currentMenu->selected < currentMenu->range_from)//更新显示的区域 {currentMenu->range_from = currentMenu->selected;currentMenu->range_to = currentMenu->range_from+3;}display(currentMenu->selected);break;}case 8://向下if(currentMenu->selected == currentMenu->itemCount-1)break;else{currentMenu->selected++;if(currentMenu->selected>currentMenu->range_to){currentMenu->range_to = currentMenu->selected;currentMenu->range_from = currentMenu->range_to-3;}display(currentMenu->selected);break;}case 4://Enter键{if(currentMenu->subMenus[currentMenu->selected] !=NULL){currentMenu = currentMenu->subMenus[currentMenu->selected]; display(0);}else{if(currentMenu->func[currentMenu->selected] != NULL){currentMenu->func[currentMenu->selected]();//执行相应的函数 display(currentMenu->selected);//返回后恢复原来的菜单状态}}break;}case 3://返回键{if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单{currentMenu = currentMenu->parent;display(currentMenu->selected);}break;}default:break;}delay_ms(10);}}void Lcd_Disp(unsigned char x,unsigned char y,unsigned char *s) {Lcd_Write_Cmd(0x30); //进入标准模式LCD_Set_XY(x,y);while (*s){Lcd_Write_Data(*s);s++;}Lcd_Write_Cmd(0x36); //返回图形模式}void highlight(uchar x,uchar y,uchar width,u8 mode) //反白,X值为0-7,Y值为0-3,width为行反白格数{uchar i,j,flag=0x00;if(y>1){flag=0x08;y=y-2;}Lcd_Write_Cmd(0x34); //写数据时,关闭图形显示,且打开扩展指令集for(i=0;i<16;i++){Lcd_Write_Cmd(0x80+(y<<4)+i);Lcd_Write_Cmd(0x80+flag+x);for(j=0;j<width;j++){Lcd_Write_Data(mode);Lcd_Write_Data(mode);}}Lcd_Write_Cmd(0x36); //写完数据,开图形显示}。
单片机技术课程设计说明书128×64LCD 液晶显示目录1.概述 (2)1. 1课题设计背景 (2)1.2课程设计内容 (2)2设计方案 (2)3.系统硬件设计 (3)3.1控制模块 (3)3.2显示模块 (6)3.3电源模块 (9)4.系统软件设计 (10)4.1软件流程图 (10)4.2时序图 (11)5.结束语 (12)参考文献: (13)附录 (14)附录1:程序清单 (15)附录二:设计图纸 (19)附录3:元器件目录表 (20)1128×64LCD液晶显示1.概述1. 1课题设计背景液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。
以往的测控仪器的显示部分大都采用LED式液晶显示屏进行参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。
而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比拟的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。
1.2课程设计内容本实验设计的主要目的是:掌握单片机与液晶显示器之间接口设计与编程;利用点阵式液晶显示器显示汉字或图形设计要求:编制程序,利用标准字库,在液晶上显示汉字。
2设计方案本设计是以单片机为核心控制器件的简单文字符号图像的LCD显示系统,通过硬件和软件的共同配合之下实现了在128×64分辨率的液晶屏上显示字符、汉字和图像的功能,系统由单片机、和液晶显示屏构成。
LCD显示系统结构框图如图2所示,23A T 89S 51P0P1.2P1.2P1.0DO~D7E RW RSL C M 12864Z KGND图2、128×64LCD 液晶显示系统结构框图AT89C51单片机内部有4KB 可反复擦写的Flash 闪速存储器、128字节的RAM ,可以根据系统所需存储容量的大小来扩展R0M 和RAM 。
初学STM32,写一个简单的128*64LCD驱动程序/**************************************************************************** 【功能说明】I/O端口功能、方向设定****************************************************************************/ voidLCD_Port_OutConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|\GPIO_Pin_13|GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}voidLCD_Port_InConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}/**************************************************************************** 【功能说明】LCD 写字节函数入口参数data:" 命令/数据标志(data:写显示数据)****************************************************************************/LCD_WriteData(u16 data){u16 ReadValue;LCD_Port_InConfig();do{LCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));LCD_Port_OutConfig();LCD_D();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);data=0xff00&ReadValue|data;GPIO_Write(GPIO_LCD,data);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/**************************************************************************** 【功能说明】LCD 写指令函数入口参数inst="cmd" 命令(cmd:写控制指令)****************************************************************************/ voidLCD_WriteCmd(u16 cmd){u16 ReadValue;LCD_Port_InConfig();doLCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));//读忙标志LCD_Port_OutConfig();LCD_I();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);cmd=0xff00&ReadValue|cmd;GPIO_Write(GPIO_LCD,cmd);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/************************************************************************** 【功能说明】读Lcd 显示数据**************************************************************************/ u16LCD_ReadData(void){u16 ReadValue;LCD_Port_InConfig();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);LCD_E_1();LCD_D();LCD_R();ReadValue = GPIO_ReadInputData(GPIO_LCD);ReadValue = ReadValue&0x00ff;return ReadValue;}/*****************************************************************************清屏*********************************************************************/voidLCD_Clear(void){u8 i,k;LCD_CS1_H();LCD_CS2_H();for(i=0;i<8;i++){LCD_WriteCmd(0xb8+i);LCD_WriteCmd(0xc0);for(k=0;k<64;k++){LCD_WriteCmd(0x40+k);LCD_WriteData(0x00);LCD_WriteCmd(0x3f);}}}/**************************************************************************** 【功能说明】复位LCD子程序****************************************************************************/ voidLCD_Rest(void){LCD_RET_0();Delay_ms(20);LCD_RET_1();}/*--------------写屏点阵------------------*/voidlat_disp (u8 data1,u8 data2){u8 i,j;LCD_CS1_H();LCD_CS2_H();for(j=0;j<8;j++){LCD_WriteCmd(0xb8+j);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40);for(i=0;i<32;i++){LCD_WriteData(data1);LCD_WriteCmd(0x3f);LCD_WriteData(data2);LCD_WriteCmd(0x3f);//Delay_us(4);}}}/*******************************************************x:显示字体高度(1~8)y:字显示在第y列(点阵16*16,0~3,8*8,0~7)****x1:显示第x1个字y1:字体宽度,宽为y1的点阵row_x显示字体起始行0~7 ****row_y:显示字体高度定义一个字为y1*row_y的点阵***************************************************/voidLCD_disp(u8 x,u8 y,u8 x1,u8 row_x,u8 y1,u8 row_y,u8 *data){u8 i,j;for(j=0;j<x;j++){LCD_WriteCmd(0xb8+j+row_x);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40+y*y1);for(i=0;i<y1;i++){LCD_WriteData(data[i+(x1*row_y+j)*y1]);//Delay_us(4);LCD_WriteCmd(0x3f);}}}。