#include "reg51.h"
/********IO引脚定义***********************************************************/
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit PSB =P1^6;//PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
sbit RES = P1^3;
//sbit KEY_ADD=P3^3; //定义按键输入端口
//sbit KEY_DEC=P3^2;
/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
#define Key P2
unsigned char curr,currold,key;//全局变量,当前箭头位置
/********函数声明*************************************************************/
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(void);
void LCDClear(void);
void LCDFlash(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void DisplayImage (unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void CGRAM();
void DisplayCGRAM(unsigned char x,unsigned char y);
void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s);
void DisplayUpdata(void);
void DelayUs2x(unsigned char t);
void displaycaidan();
void denglu1();
void keyscan();
void shianshi();
/********数据定义*************************************************************/
code unsigned char uctech[] = {" 呷哺 呷哺"};
code unsigned char net[] = {" 餐 饮 "};
code unsigned char mcu[] = {" 美食的首选"};
code unsigned char qq[] = {" QQ: 1111111 "};
code unsigned char denglu[] = {" 欢迎登陆"};
code unsigned char ID[] = {"ID:"};
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.鸡蛋"},
{" 2.番茄"},
{" 3.番茄炒蛋"},
{" "},
{" 4.蛋饺"},
{" 5.煎包"},
{" 6.狮子头"},
{""},
{" 7.尖椒炒肉"},
{" 8.手撕包菜"},
{" 9.酸菜鱼"},
{""},
{" 10. 回锅肉"},
{" 11. 蚂蚁上树"},
{" 12. 红烧肉"},
{""},
{" 13. 红烧猪蹄"},
{" 14: 辣子鸡丁"},
{" 15: 鸡丁米线"},
{""},
{" 16. 麻辣鸡翅"}
};
code unsigned char tmp[]={//128*64点阵图形数据
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0xF1,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF8,0x01,0xFF,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x00,
0x00,0x04,0x00,0x02,0xFF,0xE0,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x04,0x40,
0x00,0x00,0x00,0x02,0xFF,0xE0,0x00,0x1F,0x80,0x01,0x38,0x00,0x7E,0x00,0x04,0xE0,
0x00,0x00,0x00,0x0C,0xFF,0xF0,0x03,0x3C,0xC0,0x01,0xF8,0x0C,0xF3,0x00,0x07,0xE0,
0x00,0x00,0x00,0x71,0xFF,0xF8,0x07,0xC8,0xC0,0xEF,0x80,0x1F,0x23,0x03,0xBE,0x00,
0x00,0x40,0x00,0x01,0xFF,0xFC,0x19,0x7E,0x84,0xFB,0x00,0x65,0xFA,0x13,0xEC,0x00,
0x03,0x00,0x00,0x1F,0xFF,0xFC,0x1B,0x7D,0x83,0xE7,0xC0,0x6D,0xF6,0x0F,0x9F,0x00,
0x0C,0x00,0x00,0xFF,0xFF,0xFE,0x1F,0xC9,0x03,0x67,0x30,0x7F,0x24,0x0D,0x9C,0xC0,
0x10,0x00,0x01,0xFF,0xFF,0xFE,0x1E,0x7E,0x03,0xCD,0x90,0x79,0xF8,0x0F,0x36,0x40,
0x10,0x40,0x07,0xFF,0xFF,0xCF,0x08,0x38,0x03,0x4F,0xD0,0x20,0xE0,0x0D,0x3F,0x40,
0x10,0x40,0x0F,0xFF,0xFF,0xCF,0x00,0x08,0x01,0x09,0x90,0x00,0x20,0x04,0x26,0x40,
0x0D,0x80,0x0F,0xFF,0xFF,0xC7,0x00,0x08,0x00,0x0B,0xD0,0x00,0x20,0x00,0x2F,0x40,
0x06,0x00,0x0F,0xFF,0xFF,0xE7,0x00,0x08,0x00,0x0B,0x10,0x00,0x20,0x00,0x2C,0x40,
0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x08,0x00,0x09,0x10,0x00,0x20,0x00,0x24,0x40,
0x00,0x00,0x07,0xFF,0xE7,0xFF,0x80,0x08,0x00,0x09,0xF0,0x00,0x20,0x00,0x27,0xC0,
0x00,0x00,0x03,0xFF,0xE3,0xFF,0x00,0x08,0x00,0x00,0x70,0x00,0x20,0x00,0x01,0xC0,
0x00,0x00,0x01,0xFF,0xE3,0xFF,0x00,0x08,0x00,0x00,0x30,0x00,0x20,0x00,0x00,0xC0,
0x00,0x00,0x00,0xFF,0xE1,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xF3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x00,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x00,0x1F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x1F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x24,0x18,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x16,0x18,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x16,0x08,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x12,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x0E,0xE0,0x02,0x14,0x00,0x00,0x00,
0x00,0x10,0x01,0xF7,0xFF,0xFC,0x00,0x00,0x00,0x0E,0x70,0x03,0x14,0x00,0x00,0x00,
0x00,0x08,0x0F,0xEB,0xFF,0xFC,0x00,0x00,0x00,0x09,0xE0,0x07,0x1C,0x00,0x00,0x00,
0x00,0x07,0xFF,0xC0,0xFF,0xFC,0x00,0x00,0x00,0x3E,0xF0,0x06,0x28,0x00,0x00,0x00,
0x00,0x01,0xFF,0x84,0x3F,0xFE,0x00,0x00,0x00,0x2B,0x80,0x0F,0xAF,0x00,0x00,0x00,
0x00,0x01,0xFE,0x00,0x3F,0xFE,0x00,0x00,0x00,0x3F,0x60,0x0F,0xDF,0x80,0x00,0x00,
0x00,0x00,0x88,0x00,0x7F,0xFE,0x00,0x00,0x00,0x3F,0xB0,0x1F,0xDD,0x00,0x00,0x00,
0x00,0x00,0xE8,0x22,0x7F,0xFE,0x00,0x00,0x00,0xCF,0xDC,0x1D,0xBA,0x00,0x00,0x00,
0x00,0x00,0x48,0x22,0x7F,0xFF,0x00,0x00,0x00,0x1E,0xCF,0x35,0xAC,0x00,0x00,0x00,
0x00,0x00,0x40,0x20,0x7F,0xFF,0x00,0x00,0x00,0x27,0xC1,0x66,0x88,0x00,0x00,0x00,
0x00,0x00,0x60,0x20,0xFF,0xFF,0x00,0x00,0x00,0x46,0x80,0x64,0x9C,0x00,0x00,0x00,
0x00,0x01,0x00,0x21,0xFF,0xFF,0x00,0x00,0x01,0x8F,0xC0,0x45,0x17,0x00,0x00,0x00,
0x00,0x01,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0x0D,0xE0,0x05,0x73,0x80,0x00,0x00,
0x00,0x00,0x00,0x42,0xFF,0xFF,0x80,0x00,0x00,0x0B,0xE0,0x07,0x61,0xC0,0x00,0x00,
0x00,0x00,0x00,0x44,0xFF,0xFF,0x80,0x00,0x00,0x09,0xF0,0x06,0x00,0x40,0x00,0x00,
0x00,0x02,0x00,0x84,0xFF,0xFF,0x80,0x00,0x00,0x0F,0x10,0x02,0x00,0x00,0x00,0x00,
0x00,0x02,0x00,0x88,0xFF,0xFF,0xC0,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x00,0xF8,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0xF8,0xFF,0xEF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x08,0xF8,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x00,0xC1,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x20,0xC1,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x80,0xF3,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x40,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x40,0x7F,0x8F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/***********主函数开始********************************************************/
void main(void)
{
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //LCD初始化
Delay5Ms();
LCDClear();
DisplayImage(tmp); //显示图形
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCDClear();
DisplayListChar(0,1,uctech); //显示字库中的中文数字
DisplayListChar(0,2,net); //显示字库中的中文数字
DisplayListChar(0,3,mcu); //显示字库中的中文
DisplayListChar(0,4,qq); //显示字库中的中文数字
Delay400Ms();
Delay400Ms();
//LCDFlash(); //闪烁效果 //延时片刻(可不要)
LCDInit(); //初始化
CGRAM(); //写入自定义字符
DisplayUpdata();
//denglu1();
while(1)
{
shianshi();
//displaycaidan();
}
}
/*********************菜单显示主程序**************************************/
void displaycaidan()
{
if(curr!=currold) //光标位置变化,则更新显示
{
DisplayUpdata();
currold=curr;
}
if(key==54) //如果检测到低电平,说明按键按下
{
//Delay5Ms(); //延时去抖,一般10-20ms
// keyscan();
// if(key==54) //再次确认按键是否按下,没有按下则退出
// {
//while(key==54);//如果确认按下按键等待按键释放,没有释放则一直等待
// {
if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)//判断数组中数值个数
{
curr++;
}
key=16;
//}
//}
}
if(key==55) //如果检测到低电平,说明按键按下
{
//Delay5Ms(); //延时去抖,一般10-20ms
//keyscan();
//if(key==55) //再次确认按键是否按下,没有按下则退出
//{
//while(key==55);//如果确认按下按键等待按键释放,没有释放则一直等待
// {
if(curr>0)
{
curr--;
// }
// }
}
key=16;
}
}
/**********************登陆界面*******************************/
void denglu1()
{
unsigned char num;
LCDClear();
DisplayListChar(0,1,denglu);
DisplayListChar(0,2,ID);
DisplayListChar(0,4,"确定 取消");
num=2;
while(key!=51)
{
if(num<=7)
{
DelayUs2x(10);
keyscan();
switch(key)
{
case 15:DisplayOneChar(num,2,0x31);num++;key=16;break;
case 14:DisplayOneChar(num,2,0x34);num++;key=16;break;
case 11:DisplayOneChar(num,2,0x32);num++;key=16;break;
case 10:DisplayOneChar(num,2,0x35);num++;key=16;break;
case 9:DisplayOneChar(num,2,0x38);num++;key=16;break;
case 13:DisplayOneChar(num,2,0x37);num++;key=16;break;
case 7:DisplayOneChar(num,2,0x33);num++;key=16;break;
case 6:DisplayOneChar(num,2,0x36);num++;key=16;break;
case 5:DisplayOneChar(num,2,0x39);num++;key=16;break;
}
}
if(key==51)
{
LCDClear();
DisplayListChar(0,1,denglu);
DisplayListChar(0,2,ID);
DisplayListChar(0,4,"确定 取消");
num=2;
}
}
}
/*************************点菜*************************************/
void shianshi()
{
unsigned char num;
displaycaidan();
num=2;
keyscan();
while(key!=51)
{
DelayUs2x(10);
keyscan();
switch(key)
{
case 0:DisplayOneChar(num,4,0x30);num++;key=16;break;
case 1:DisplayOneChar(num,4,0x31);num++;key=16;break;
case 4:DisplayOneChar(num,4,0x34);num++;key=16;break;
case 2:DisplayOneChar(num,4,0x32);num++;key=16;break;
case 5:DisplayOneChar(num,4,0x35);num++;key=16;break;
case 8:DisplayOneChar(num,4,0x38);num++;key=16;break;
case 7:DisplayOneChar(num,4,0x37);num++;key=16;break;
case 3:DisplayOneChar(num,4,0x33);num++;key=16;break;
case 6:DisplayOneChar(num,4,0x36);num++;key=16;break;
case 9:DisplayOneChar(num,4,0x39);num++;key=16;break;
case 54:displaycaidan();break;
case 55:displaycaidan();break;
}
if(num==4)
num=2;
}
if(key==51)
{
num=2;
}
displaycaidan();
}
/**************************键盘扫描***************************************/
/*void keyscan()
{
unsigned char temp;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
}*/
/**********************************************************************/
void keyscan()
{
unsigned char temp;
key=16;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:key=1;
break;
case 0xde:key=2;
break;
case 0xbe:key=3;
break;
case 0x7e:key=50; //用A用50表示
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0; //等待按键释放//*
}
//send(key);
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:key=4;
break;
case 0xdd:key=5;
break;
case 0xbd:key=6;
break;
case 0x7d:key=51;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
//send(key);
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xeb:key=7;
break;
case 0xdb:key=8;
break;
case 0xbb:key=9;
break;
case 0x7b:key=52;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
//send(key);
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
Delay5Ms();
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xe7:key=54;//*
break;
case 0xd7:key=0;
break;
case 0xb7:key=55; //'#'
break;
case 0x77:key=53;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
//send(key);
}
}
}
/***********写数据********************************************************/
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;LCD_Data = WDLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/***********写指令********************************************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1; LCD_Data = WCLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/***********读数据********************************************************/
unsigned char ReadDataLCD(void)
{
unsigned char LCDDA;
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
LCDDA=LCD_Data;
LCD_E = 0;
return(LCDDA);
}
/***********读状态*******************************************************/
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
LCD_E = 0;
return(1);
}
/***********初始化********************************************************/
void LCDInit(void)
{
Delay5Ms(); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
Delay5Ms(); //延时
RES=0; //复位
Delay5Ms(); //延时
RES=1; //复位置高
Delay5Ms();
WriteCommandLCD(0x30,1); //选择基本指令集
Delay5Ms(); //延时大于100us
WriteCommandLCD(0x30,1); //选择8bit数据流
Delay5Ms(); //延时大于37us
WriteCommandLCD(0x0C,1); //开显示(无游标、不反白)
Delay5Ms(); //延时大于100us
WriteCommandLCD(0x01,1); //清除显示,并且设定地址指针为00H
Delay5Ms(); //延时大于10ms
WriteCommandLCD(0x06,1); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
Delay5Ms(); //延时大于100us
}
/***********清屏********************************************************/
void LCDClear(void)
{
WriteCommandLCD(0x01,1); //显示清屏
//WriteCommandLCD(0x34,1); // 显示光标移动设置
//WriteCommandLCD(0x30,1); // 显示开及光标设置
}
/***********闪烁效果********************************************************/
void LCDFlash(void)
{
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
}
/***********按指定位置显示一个字符*******************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
if(Y<1)
Y=1;
if(Y>4)
Y=4;
X &= 0x0F; //限制X不能大于16,Y不能大于1
switch(Y){
case 1:X|=0X80;break;
case 2:X|=0X90;break;
case 3:X|=0X88;break;
case 4:X|=0X98;break;
}
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
switch(Y)
{
case 1: WriteCommandLCD((0x80+X),1);break;
case 2: WriteCommandLCD((0x90+X),1);break;
case 3: WriteCommandLCD((0x88+X),1);break;
case 4: WriteCommandLCD((0x98+X),1);break;
default:break;
}
while(*DData>0)
{
WriteDataLCD(*DData);
DData++;
Delay5Ms();
}
}
/********输出128*64图形数据************************************************/
void DisplayImage (unsigned char code *DData){
unsigned char x,y,i;
unsigned int tmp=0;
for(i=0;i<9;){ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1);
WriteCommandLCD((0x80+x),1); //列地址
WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1);
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //扩充功能设定
WriteCommandLCD(0x30,1);
}
/***********短延时********************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
/***********长延时********************************************************/
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--){
TempCycB=7269;
while(TempCycB--);
}
}
/*------------------------------------------------
用户自定义字符
------------------------------------------------*/
void CGRAM()
{
int i;
WriteCommandLCD(0x30,1);
WriteCommandLCD(0x40,1);
for(i=0;i<16;i++)
{
WriteDataLCD(user16x16[i*2]);
WriteDataLCD(user16x16[i*2+1]);
}
}
/*------------------------------------------------
显示用户自定义字符
------------------------------------------------*/
void DisplayCGRAM(unsigned char x,unsigned char y)
{
switch(y)
{
case 1: WriteCommandLCD((0x80+x),1);break;
case 2: WriteCommandLCD((0x90+x),1);break;
case 3: WriteCommandLCD((0x88+x),1);break;
case 4: WriteCommandLCD((0x98+x),1);break;
default:break;
}
WriteDataLCD(00);
WriteDataLCD(00);
}
/*------------------------------------------------
显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
------------------------------------------------*/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
{
switch(y)
{
case 1: WriteCommandLCD((0x80+x),1);break;
case 2: WriteCommandLCD((0x90+x),1);break;
case 3: WriteCommandLCD((0x88+x),1);break;
case 4: WriteCommandLCD((0x98+x),1);break;
default:break;
}
while(*s>0)
{
WriteDataLCD(*s);
s++;
DelayUs2x(10);
}
}
/*------------------------------------------------
调用显示更新
------------------------------------------------*/
void DisplayUpdata(void)
{
unsigned char num;
LCDClear();
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]);
else
LCD_PutString(0,2,"");
if((2+(curr/4)*4)<num)
LCD_PutString(0,3,MainMenu[2+(curr/4)*4]);
else
LCD_PutString(0,3,"");
if((3+(curr/4)*4)<num)
LCD_PutString(0,4,MainMenu[3+(curr/4)*4]);
else
LCD_PutString(0,4,"");
DisplayCGRAM(0,curr%4+1);
}
|