新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > AT89s52-LCD12864多页菜单按键选择操作

AT89s52-LCD12864多页菜单按键选择操作

作者:时间:2012-08-18来源:网络收藏
#include reg52.h>#include intrins.h>sbit RS = P2^4;sbit RW = P2^5;sbit E  = P2^6;sbit PSB= P2^1; //串并口选择端  并高串低#define DataPort P0   sbit KEY_ADD=P3^3; //按键sbit KEY_DEC=P3^4;unsigned char curr,currold;//全局变量,当前箭头位置unsigned char code user16x16[]={ //箭头图片0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,};unsigned char code *MainMenu[]={{"  1.设置1"},{"  2.设置2"},{"  3.设置3"},{"  4.设置4"},{"  5.设置5"},{"  6.设置6"},{"  7.设置7"},{"  8.设置8"},{"  9.设置9"},{"  0.设置0"},};/***********************************************延时函数***********************************************/void DelayUs2x(unsigned char t){   while(--t);}void DelayMs(unsigned char t){while(t--){DelayUs2x(245);DelayUs2x(245);}}/***********************************************判忙函数***********************************************/void Check_Busy(){  RS=0;  //写命令RW=1;  //读状态E=1;DataPort=0xff;while((DataPort0x80)==0x80);//忙则等待E=0;}/***********************************************写入命令***********************************************/void Write_Cmd(unsigned char Cmd){Check_Busy();RS=0;  //写命令RW=0;  //writeE=1;DataPort=Cmd;DelayUs2x(5);E=0;DelayUs2x(5);}/***********************************************写入数据***********************************************/void Write_Data(unsigned char Data){Check_Busy();RS=1; //写数据RW=0; //writeE=1;DataPort=Data;DelayUs2x(5);E=0;DelayUs2x(5);}/***********************************************液晶屏初始化***********************************************/void Init_ST7920(){  DelayMs(40);           //大于40MS的延时程序PSB=1;                 //设置为8BIT并口工作模式DelayMs(1);            //延时Write_Cmd(0x30);       //选择基本指令集DelayUs2x(50);         //延时大于100usWrite_Cmd(0x30);       //选择8bit数据流DelayUs2x(20);         //延时大于37usWrite_Cmd(0x0c);       //开显示(无游标、不反白)DelayUs2x(50);         //延时大于100usWrite_Cmd(0x01);       //清除显示,并且设定地址指针为00HDelayMs(15);           //延时大于10msWrite_Cmd(0x06);       //指定在资料的读取及写入时,
设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50);         //延时大于100us}/***********************************************用户自定义字符***********************************************/void CGRAM(){ int i;Write_Cmd(0x30); Write_Cmd(0x40);for(i=0;i16;i++){Write_Data(user16x16[i*2]);Write_Data(user16x16[i*2+1]);}}   /***********************************************显示用户自定义字符***********************************************/void DisplayCGRAM(unsigned char x,unsigned char y){ switch(y){case 1: Write_Cmd(0x80+x);break;case 2: Write_Cmd(0x90+x);break;case 3: Write_Cmd(0x88+x);break;case 4: Write_Cmd(0x98+x);break;default:break;}Write_Data(00);Write_Data(00);}         /***********************************************显示字符串x:横坐标值,范围0~8y:纵坐标值,范围1~4***********************************************/void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s){ switch(y){case 1: Write_Cmd(0x80+x);break;case 2: Write_Cmd(0x90+x);break;case 3: Write_Cmd(0x88+x);break;case 4: Write_Cmd(0x98+x);break;default:break;}while(*s>0){ Write_Data(*s);s++;DelayUs2x(50);}}/***********************************************清屏***********************************************/void ClrScreen(){ Write_Cmd(0x01);DelayMs(15);}    /***********************************************调用显示更新***********************************************/void DisplayUpdata(void){   unsigned char num;ClrScreen();num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判断数组中数值个数if((0+(curr/4)*4)num)LCD_PutString(0,1,MainMenu[0+(curr/4)*4]);else //如果超出数组最大元素,则写空信息,不判断此信息可能会出现乱码 LCD_PutString(0,1,"");if((1+(curr/4)*4)num)LCD_PutString(0,2,MainMenu[1+(curr/4)*4]);elseLCD_PutString(0,2,"");if((2+(curr/4)*4)num)LCD_PutString(0,3,MainMenu[2+(curr/4)*4]);elseLCD_PutString(0,3,"");if((3+(curr/4)*4)num)LCD_PutString(0,4,MainMenu[3+(curr/4)*4]);elseLCD_PutString(0,4,"");DisplayCGRAM(0,curr%4+1); }/***********************************************MAIN***********************************************/void main(){Init_ST7920(); CGRAM(); //写入自定义字符 DisplayUpdata();while(1){     if(curr!=currold) //光标位置变化,则更新显示{DisplayUpdata();currold=curr;} if(!KEY_ADD)  {DelayMs(10);if(!KEY_ADD)     {while(!KEY_ADD);{if(currsizeof(MainMenu)/sizeof(MainMenu[0])-1)//判断数组中数值个数{ curr++; }}}}if(!KEY_DEC) {DelayMs(10);if(!KEY_DEC)     {while(!KEY_DEC);{if(curr>0){ curr--; }}}}  }}

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭