最新12864LCD菜单程序

合集下载

12864液晶屏幕使用说明及程序

12864液晶屏幕使用说明及程序

12864使用说明一、串/并接口1.1 串口接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

1.2 并行接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

二、模块主要硬件构成说明控制器接口信号说明:2.1、RS,R/W的配合选择决定控制界面的4种模式:2.2、E信号●忙标志BFBF 标志提供内部工作情况.BF=1 表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0 时, 模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF 读到DB7 总线,从而检验模块之工作状态.●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192 个此触发器是用于模块屏幕显示开和关的控制。

DFF=1 为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。

DFF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。

●显示数据RAM(DDRAM)模块内部显示数据 RAM 提供 64×2 个位元组的空间,最多可控制 4 行 16 字(64 个字)的中文字型显示,当写入显示数据 RAM 时,可分别显示 CGROM 与CGRAM 的字型;此模块可显示三种字型,分别是半角英、数字型(16*8)、CGRAM 字型及 CGROM 的中文字型。

三种字型的选择,由在 DDRAM 中写入的编码选择,在0000H—0006H 的编码中(其代码分别是0000、0002、0004、0006 共4 个)将选择 CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于A1 以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

12864液晶程序

12864液晶程序

/*12864并行接口参考程序,控制器st7920*/#include <reg51.h>#include <intrins.h>#define uchar unsigned charsbit RES = P0^7;sbit PSB = P0^6; //串并口选择sbit E = P0^5;sbit RW = P0^4;sbit RS = P0^3;uchar h,l,ii;//延时子程序void delay(unsigned int t) //t=10,约1ms { unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}//测忙void chk_busy(){ RS=0;RW=1;E=1;while((P2&0x80)==0x80);E=0;}//写数据void lcdwd(unsigned char dispdata){ chk_busy();RS=1;RW=0;E=1;P2=dispdata;delay(5);E=0;}//写指令代码void lcdwc(unsigned char cmdcode){ chk_busy();RS=0;RW=0;E=1;P2=cmdcode;delay(5);E=0;}//初始化void lcdreset(){ delay(2000);lcdwc(0x30); //选择基本指令集lcdwc(0x30); //选择8bit数据流delay(5);lcdwc(0x0c); //开显示(有游标、不反白)delay(5);lcdwc(0x01); //清除显示,并且设定地址指针为00Hdelay(5);lcdwc(0x07); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位}void hzkdis(unsigned char code *s){ while(*s>0){ lcdwd(*s);s++;delay(500);}}void hzklib(){lcdwc(0x80);hzkdis("桂林电子科技大学");lcdwc(0x91);hzkdis("0900840115");lcdwc(0x8a);hzkdis("hyg");lcdwc(0x9b);hzkdis("男");}void lcdfill(unsigned char disdata) //纵条纹显示{ unsigned char x,y,ii;for(ii=0;ii<9;ii+=8) //ii作用:地址0x80为前32行的列首地址,0x88为后32行的列首地址for(y=0;y<0x20;y++)for(x=0;x<8;x++){ lcdwc(0x36); //8bit控制界面,扩充指令集,绘图开lcdwc(y+0x80); //第一写的为行地址,y为1bitlcdwc(x+0x80+ii); //后写的为列地址,x为1字节lcdwc(0x30); //8bit 控制界面,基本指令集,绘图关lcdwd(disdata);lcdwd(disdata);}}void lcdfill_upright(unsigned char disdata) //横条{ unsigned char x,y,ii;unsigned char i,f,k;for(ii=0;ii<9;ii+=8)for(y=0;y<4;y++){ f=disdata;for(i=0;i<8;i++){ if((f&0x80)==0x80)k=0xff;elsek=0;for(x=0;x<8;x++){ lcdwc(0x36);lcdwc(y*8+i+0x80);lcdwc(x+0x80+ii);lcdwc(0x30);lcdwd(k);lcdwd(k);}f<<=1;}}}main(){delay(10);RES=1;PSB=1;lcdreset(); //初始化LCD屏while(1){lcdwc(0x01);delay(500);lcdfill(0x80); //纵条纹显示delay(5000);lcdfill_upright(0x20); //横条delay(5000);lcdfill(0x00);hzklib();delay(10000);}}。

128X64液晶屏参数设置及显示程序

128X64液晶屏参数设置及显示程序

128X64液晶屏参数设置及显示程序(未完待续);****************************************************************************** **/RS EQU P2.0RW EQU P2.1E EQU P2.2PSB EQU P2.3RST EQU P2.5;-----------------------------------------------LCD_X EQU 30HLCD_Y EQU 31HCOUNT EQU 32HCOUNT1 EQU 33HCOUNT2 EQU 34HCOUNT3 EQU 35H;-----------------------------------------------LCD_DATA EQU 36HLCD_DATA1 EQU 37HLCD_DATA2 EQU 38HSTORE EQU 39H;-----------------------------------------------ORG 0000HLJMP MAINORG 0100H;-----------------------------------------------MAIN:MOV SP,#5FHCLR RST ;复位LCALL DELAY4 ;延时子程序SETB RST ;复位NOPSETB PSB ;通讯方式为8位数据并口;********************初始化**********************LGS0: MOV A,#34H ;34H--扩充指令操作LCALL SEND_I ;写指令子程序MOV A,#30H ;30H--基本指令操作LCALL SEND_IMOV A,#01H ;清除显示LCALL SEND_IMOV A,#06H ;指定在资料写入或读取时,光标的移动方向LCALL SEND_I ;DDRAM 的地址计数器(AC)加1MOV A,#0CH ;开显示,关光标,不闪烁LCALL SEND_I;================================================= ;;显示汉字和字符;加入80ms的延时,使你能够看清楚显示的过程;根据汉字显示坐标分段写入(顺序写入);================================================= HAN_WR2:LCALL CLEAR_PHAN_WR2A:MOV DPTR,#TAB1A ;显示汉字和字符MOV COUNT,#10H ;地址计数器设为16。

stm32-12864液晶-菜单设计

stm32-12864液晶-菜单设计

/*************menu.h*******************/#ifndef __MENU_H#define __MENU_H#include "stm32f10x.h"#include "SysTick.h"#include <stdlib.h>#include "12864.h"#include "AdcDisplay.h"#include "key.h"#include "spi_tm7705.h"#include "eeprom.h"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;void MainDisplay(void);void DisplayMenu(u8 line);void func(void);void Unitch1(void);void Unitch2(void);void Unitch3(void);void Unitch4(void);void DiaChange(void);void MlChange(void);u16 NumLoop(u16 num,u8 pm);u8 Change(u8 Sval,uint8_t* title);void MenuInit(void);#endif /* __MENU_H *//*************menu.h*******************//************menu.c*******************//******************** ********************* 文件名:menu.c* 描述:液晶菜单函数库* 实验平台:* 硬件连接----------------------------**** ----------------------------* 库版本:ST3.0.0******************************************************************************** ***/#include "menu.h"//菜单与AD结果显示变量,0为AD,1为菜单extern u8 MenuDis=0;//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项{"单位设置\x10","直径设置\x10","模量设置\x10","关于"}};Menu UnitMenu = {//单位设置菜单0,3,4,0,{"应变量ε","锁模力KN ","锁模力Ton","取消"}};u8 UnitCh;//单位选择,0为变形量ε,1为应变量σ,2为锁模力FMenu DiaMenu = {//单位设置菜单0,0,1,0,{"主999 mm"}};Menu MlMenu = {//模量设置菜单0,0,1,0,{"主999 KN/mm2"}};u8 DiaVal;//直径数值u8 MlVal;//模量数值//菜单与AD结果显示变量,0为AD,1为菜单u8 MenuDis;//复位前指数u16 BaseAD[4];//横截面积u16 mianji;//横截直径u16 zhijing;//模量u16 moliang;//按键返回值u8 keyval;uint8_t* title1="单位:MM";uint8_t* title2="单位:KN/MM2";extern u16 ADResult[4];//存储AD结果的数组extern uint16_t VirtAddVarTab[NumbOfVar];//eepromMenu *currentMenu;//当前的菜单void MainDisplay(void){if (MenuDis==0)AdUi();keyval=KeyScan();switch(keyval){case 0://什么都不干{Delay_ms(50);break;}case 1://向上{if(MenuDis==1){if(currentMenu->selected == 0)//到了第一项break;else{currentMenu->selected--;DisplayMenu(currentMenu->selected);}}break;}case 2://向下{if(MenuDis==1){if(currentMenu->selected == currentMenu->itemCount-1)break;else{currentMenu->selected++;DisplayMenu(currentMenu->selected);}}break;}case 3://确认{if(MenuDis==0){MenuDis=1;LCD_Init();DisplayMenu(currentMenu->selected);}else{if(currentMenu->subMenus[currentMenu->selected] !=NULL){LCD_Init();currentMenu = currentMenu->subMenus[currentMenu->selected];DisplayMenu(currentMenu->selected);}else{if(currentMenu->func[currentMenu->selected] != NULL){LCD_Init();currentMenu->func[currentMenu->selected]();//执行相应的函数currentMenu->selected=0;DisplayMenu(currentMenu->selected);//返回后恢复原来的菜单状态}}}break;}case 4://取消{if(MenuDis==1){if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单{LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected);}else{MenuDis=0;//currentMenu = MainMenu;currentMenu->selected=0;LCD_Init();AdUi();Delay_ms(100);}}else{Clr_Scr();Delay_ms(50);Write_Char(0,0x30);//关闭扩展指令//复位归零BaseAD[0]=ADResult[0];BaseAD[1]=ADResult[1];BaseAD[2]=ADResult[2];BaseAD[3]=ADResult[3];AdUi();}break;}default:break;}}//用于显示菜单项void DisplayMenu(u8 line) //显示菜单项并设置选中的项反白{int i;line = 3-(currentMenu->range_to-line);for(i = 0;i<4;i++){LCD_Write_String(i,0,currentMenu->menuItems[i+currentMenu->range_from]); }WhiteLineInit();White_Line(line,0,8);//反白显示指定行}void func(void){uint8_t* s="为人民服务";LCD_Write_String(1,0,s);Delay_ms(3000);}void Unitch1(void){UnitCh=0;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch2(void){UnitCh=1;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch3(void){UnitCh=2;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch4(void){LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void DiaChange(void){uint8_t* s="单位:MM";//测试代码u16 a=0;int i=0;//u16 tmp1;LCD_Init();LCD_Write_String(0,0,s);zhijing=Change(zhijing,title1);mianji=3.14*((zhijing/2)*(zhijing/2));EE_WriteVariable(VirtAddVarTab[0], zhijing);//测试代码//for(i=0;i<99;i++)//{//a=a+1;//LCD_Write_Tri_Value(2,3,a);//Delay_ms(50);//}}void MlChange(void){uint8_t* s="单位:KN/MM2";LCD_Init();LCD_Write_String(0,0,s);moliang=Change(moliang,title2);EE_WriteVariable(VirtAddVarTab[1], moliang);}//数字按键循环,升到9后变0,降到0后变9,参数pm为加减,1为+,0为减u16 NumLoop(u16 num,u8 pm){if (pm==1){if (num>=9)num=0;elsenum=num+1;}else{if (num<=0)num=9;elsenum=num-1;}return num;}//Sval代表直径或模量的默认值,返回修改后直径或模量的值u8 Change(u8 Sval,uint8_t* title){u16 baiwei,shiwei,gewei,Dval;//数字ascii码//char tmpval;//按键返回值u8 keyval=0;//光标位置3为百位、4为十位,5为个位u8 loc=3;//是否选中其中一位u8 clicked=0;//光标闪烁位,是否闪烁u8 flicker=0;baiwei=(u16)(Sval/100);shiwei=(u16)((Sval%100)/10);gewei=(u16)((Sval%100)%10);//tmpval=(char)baiwei + 0x30;//LCD_Write_Char(2,3,tmpval);//tmpval=(char)shiwei + 0x30;//LCD_Write_Char(2,4,tmpval);//tmpval=(char)gewei + 0x30;//LCD_Write_Char(2,5,tmpval);//LCD_Write_Single_Num(2,3,baiwei);//LCD_Write_Single_Num(2,4,shiwei);//LCD_Write_Single_Num(2,5,gewei);LCD_Write_Tri_Value(2,3,Sval);WhiteLineInit();White_Line(2,3,1);//反白显示指定行while(1){keyval=KeyScan();switch(keyval){case 0://什么都不干{if (clicked){if (flicker==0){White_Line(2,loc,1);flicker=1;}else{Shut_White_Line(2,loc,1);flicker=0;}}//else//White_Line(2,loc,1);Delay_ms(300);break;}case 1://向上{if (clicked==0){if (loc>3)loc=loc-1;elseloc=3;WhiteLineInit();White_Line(2,loc,1);}else{switch (loc){case 3:{baiwei=NumLoop(baiwei,1);LCD_Init();break;}case 4:{shiwei=NumLoop(shiwei,1);LCD_Init();break;}case 5:{gewei=NumLoop(gewei,1);LCD_Init();break;}default:break;}}break;}case 2://向下{if (clicked==0){if (loc<5)loc=loc+1;elseloc=5;WhiteLineInit();White_Line(2,loc,1);}else{switch (loc){case 3:{baiwei=NumLoop(baiwei,0);LCD_Init();break;}case 4:{shiwei=NumLoop(shiwei,0);LCD_Init();break;}case 5:{gewei=NumLoop(gewei,0);LCD_Init();break;}default:break;}}break;}case 3://确认{if (clicked)clicked=0;elseclicked=1;break;}case 4://取消{if (clicked)clicked=0;else //返回主菜单{LCD_Init();currentMenu = &MainMenu;currentMenu->selected=0;DisplayMenu(currentMenu->selected);//返回新的数值Dval=baiwei*100+shiwei*10+gewei;return Dval;}break;}default:break;}//LCD_Init();LCD_Write_String(0,0,title);Dval=baiwei*100+shiwei*10+gewei;LCD_Write_Tri_Value(2,3,Dval);Delay_ms(20);}}//初始化菜单:void MenuInit(void){MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);MainMenu.subMenus[0] = &UnitMenu;//第1项没有子菜单置null,选择后程序会调用func中相应项中的函数MainMenu.subMenus[1] = NULL;//&DiaMenu;直接执行设置函数MainMenu.subMenus[2] = NULL;//&MlMenu;直接执行设置函数MainMenu.subMenus[3] = NULL;MainMenu.func = malloc(sizeof(&func)*4);MainMenu.func[0] = &func;MainMenu.func[1] = &DiaChange;MainMenu.func[2] = &MlChange;//当选择了并按了确定,会执行func函数MainMenu.func[3] = NULL;MainMenu.parent = NULL;//表示是顶级菜单UnitMenu.subMenus = malloc(sizeof(&UnitMenu)*4);UnitMenu.subMenus[0] = NULL;UnitMenu.subMenus[1] = NULL;UnitMenu.subMenus[2]= NULL;UnitMenu.subMenus[3]= NULL;UnitMenu.func = malloc(sizeof(&Unitch1)*4);UnitMenu.func[0] = &Unitch1;UnitMenu.func[1] = &Unitch2;UnitMenu.func[2] = &Unitch3;UnitMenu.func[3] = &Unitch4;UnitMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项// DiaMenu.subMenus = malloc(sizeof(&DiaMenu)*1);// DiaMenu.subMenus[0] = NULL;// DiaMenu.func = malloc(sizeof(&func)*1);// DiaMenu.func[0] = &func;// DiaMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项//// MlMenu.subMenus = malloc(sizeof(&MlMenu)*1);// MlMenu.subMenus[0] = NULL;// MlMenu.func = malloc(sizeof(&func)*1);// MlMenu.func[0] = &func;// MlMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项currentMenu = &MainMenu;}/************menu.c*******************/。

12864液晶按键菜单程序

12864液晶按键菜单程序
{
write_dat(dis3[i]);
}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==2) //按下选择按钮2次
uchar code dis1_[] = {"系统初始化. "};
uchar code dis2_[] = {"系统初始化.. "};
uchar code dis3_[] = {"系统初始化.. "};
uchar code dis4_[] = {"按选择键开始! "};
uchar code dis1_6[] = {" 摄像头 "};
uchar code dis2_6[] = {" "};
uchar code dis3_6[] = {" "};
uchar code dis4_6[] = {"保存拍照——返回 "};
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);
}
delay_1ms(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis4_[i]);
}
write_cmd(0x30); //基本指令操作
delay_1ms(2);
write_cmd(0x0C); //显示开,关光标

12864液晶显示程序(串口)

12864液晶显示程序(串口)

/*------------------初始化-----------------*/
void init_lcd (void)
{
// rst=1;
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
void lcd_string(uchar x0,uchar y0,uchar k,uchar *chn)
{
uchar adr,i;
switch(x0)
{
case 0: adr = 0x80 + y0;
break; //在第1行y列显示
case 1: adr = 0x90 + y0;
break; //在第2行y列显示
case 2: adr = 0x88 + y0;
break; //在第3行y列显示
case 3: adr = 0x98 + y0;
break; //在第4行y列显示
default: ;
}
wr_lcd (comm,0x30);
{
case 0: adr = 0x80 + y0;
break; //在第1行y列显示
case 1: adr = 0x90 + y0;
break; //在第2行y列显示
case 2: adr = 0x88 + y0;
break; //在第3行y列显示
case 3: adr = 0x98 + y0;
#define comm 0
#define dat 1

LCD12864菜单程序

LCD12864菜单程序

一起来学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,帮助<。

12864液晶打点程序

12864液晶打点程序

#include "reg52.h"#include "intrins.h"sbit io_LCD12864_RS = P2^5 ;sbit io_LCD12864_RW = P2^6 ;sbit io_LCD12864_EN = P2^7 ;sbit A=P3^7;#define io_LCD12864_DATAPORT P0#define SET_DATA io_LCD12864_RS = 1 ;#define SET_INC io_LCD12864_RS = 0 ;#define SET_READ io_LCD12864_RW = 1 ;#define SET_WRITE io_LCD12864_RW = 0 ;#define SET_EN io_LCD12864_EN = 1 ;#define CLR_EN io_LCD12864_EN = 0 ;void v_Lcd12864CheckBusy_f( void ) //忙检测函数{unsigned int nTimeOut = 0 ;SET_INCSET_READCLR_ENSET_ENwhile( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ;CLR_ENSET_INCSET_READ}void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令{v_Lcd12864CheckBusy_f() ;SET_INCSET_WRITECLR_ENio_LCD12864_DA TAPORT = byCmd ;_nop_();_nop_();SET_EN_nop_();_nop_();CLR_ENSET_READSET_INC}void v_Lcd12864SendData_f( unsigned char byData ) //发送数据{v_Lcd12864CheckBusy_f() ;SET_DATASET_WRITECLR_ENio_LCD12864_DA TAPORT = byData ;_nop_();_nop_();SET_EN_nop_();_nop_();CLR_ENSET_READSET_INC}void v_DelayMs_f( unsigned int nDelay )//延时{unsigned int i ;for( ; nDelay > 0 ; nDelay-- ){for( i = 125 ; i > 0 ; i-- ) ;}}void v_Lcd12864Init_f( void )//初始化{v_Lcd12864SendCmd_f( 0x30 ) ;//基本指令集v_DelayMs_f( 50 ) ;v_Lcd12864SendCmd_f( 0x01 ) ;//清屏v_DelayMs_f( 50 ) ;v_Lcd12864SendCmd_f( 0x06 ) ;//光标右移v_DelayMs_f( 50 ) ;v_Lcd12864SendCmd_f( 0x0c ) ;//开显示}unsigned char u8_Lcd12864ReadByte_f( void ) {unsigned char byReturnValue ;v_Lcd12864CheckBusy_f() ;io_LCD12864_DA TAPORT = 0xff ;SET_DATASET_READCLR_ENSET_ENbyReturnValue = io_LCD12864_DATAPORT ;CLR_ENreturn byReturnValue ;}void v_Lcd12864DrawPoint_f( unsigned char X, unsigned char Y, unsigned char Color ) {unsigned char Row , Tier , Tier_bit ;unsigned char ReadOldH, ReadOldL ;v_Lcd12864SendCmd_f( 0x34 ) ;v_Lcd12864SendCmd_f( 0x36 ) ;Tier = X >> 4 ;Tier_bit = X & 0x0f ;if( Y < 32 ){Row = Y ;}else{Row = Y - 32 ;Tier += 8 ;}v_Lcd12864SendCmd_f( Row + 0x80 ) ;v_Lcd12864SendCmd_f( Tier + 0x80 ) ;u8_Lcd12864ReadByte_f() ;ReadOldH = u8_Lcd12864ReadByte_f() ;ReadOldL = u8_Lcd12864ReadByte_f() ;v_Lcd12864SendCmd_f( Row + 0x80 ) ;v_Lcd12864SendCmd_f( 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 ;}v_Lcd12864SendData_f( ReadOldH ) ;v_Lcd12864SendData_f( 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 ;}v_Lcd12864SendData_f( ReadOldH ) ;v_Lcd12864SendData_f( ReadOldL ) ;}v_Lcd12864SendCmd_f( 0x30 ) ;}void v_Lcd12864DrawLineX_f( 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++ )v_Lcd12864DrawPoint_f( X0, Y, Color ) ;}//画垂直线:void v_Lcd12864DrawLineY_f( 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++)v_Lcd12864DrawPoint_f( X, Y0, Color);}void gui_clear(){unsigned char i , j , k;v_Lcd12864SendCmd_f(0x34);//扩展指令集,8位数据传输v_Lcd12864SendCmd_f(0x34);//绘图显示关闭for(i = 0; i < 2; i ++)//分上下两屏写{for(j = 0; j < 32; j ++){v_Lcd12864SendCmd_f(0x80 + j);//写y坐标v_DelayMs_f( 1 ) ;if(i == 0) //写x坐标{v_Lcd12864SendCmd_f(0x80);v_DelayMs_f( 1 ) ;}else //写下半屏{v_Lcd12864SendCmd_f(0x88);v_DelayMs_f( 1) ;}for(k = 0; k < 16; k ++)//写一整行数据{v_Lcd12864SendData_f(0x00);//写高字节v_Lcd12864SendData_f(0x00);//写低字节v_DelayMs_f( 1 ) ;}}}v_Lcd12864SendCmd_f(0x36);//打开绘图显示v_Lcd12864SendCmd_f(0x30);//打开基本指令集}void main(){v_Lcd12864Init_f();gui_clear();v_DelayMs_f( 2 ) ;v_Lcd12864DrawPoint_f(15,18,1);// v_Lcd12864DrawPoint_f(16,18,1);// v_Lcd12864DrawPoint_f(17,18,1);// v_Lcd12864DrawPoint_f(18,18,1);// v_Lcd12864DrawLineX_f( 0, 127 , 0, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 7, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 15, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 23, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 31, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 39, 1 ) ;// v_Lcd12864DrawLineX_f( 0, 127 , 47, 1 ) ;}。

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