#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 //用于檢測(cè)LCD狀態(tài)字中的Busy標(biāo)識(shí)
#define Key P2
unsigned char curr,currold,key;//全局變量,當(dāng)前箭頭位置
/********函數(shù)聲明*************************************************************/
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();
/********數(shù)據(jù)定義*************************************************************/
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.酸菜魚(yú)"},
{""},
{" 10. 回鍋肉"},
{" 11. 螞蟻上樹(shù)"},
{" 12. 紅燒肉"},
{""},
{" 13. 紅燒豬蹄"},
{" 14: 辣子雞丁"},
{" 15: 雞丁米線"},
{""},
{" 16. 麻辣雞翅"}
};
code unsigned char tmp[]={//128*64點(diǎn)陣圖形數(shù)據(jù)
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};
/***********主函數(shù)開(kāi)始********************************************************/
void main(void)
{
Delay400Ms(); //啟動(dòng)等待,等LCD講入工作狀態(tài)
LCDInit(); //LCD初始化
Delay5Ms();
LCDClear();
DisplayImage(tmp); //顯示圖形
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCDClear();
DisplayListChar(0,1,uctech); //顯示字庫(kù)中的中文數(shù)字
DisplayListChar(0,2,net); //顯示字庫(kù)中的中文數(shù)字
DisplayListChar(0,3,mcu); //顯示字庫(kù)中的中文
DisplayListChar(0,4,qq); //顯示字庫(kù)中的中文數(shù)字
Delay400Ms();
Delay400Ms();
//LCDFlash(); //閃爍效果 //延時(shí)片刻(可不要)
LCDInit(); //初始化
CGRAM(); //寫(xiě)入自定義字符
DisplayUpdata();
//denglu1();
while(1)
{
shianshi();
//displaycaidan();
}
}
/*********************菜單顯示主程序**************************************/
void displaycaidan()
{
if(curr!=currold) //光標(biāo)位置變化,則更新顯示
{
DisplayUpdata();
currold=curr;
}
if(key==54) //如果檢測(cè)到低電平,說(shuō)明按鍵按下
{
//Delay5Ms(); //延時(shí)去抖,一般10-20ms
// keyscan();
// if(key==54) //再次確認(rèn)按鍵是否按下,沒(méi)有按下則退出
// {
//while(key==54);//如果確認(rèn)按下按鍵等待按鍵釋放,沒(méi)有釋放則一直等待
// {
if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)//判斷數(shù)組中數(shù)值個(gè)數(shù)
{
curr++;
}
key=16;
//}
//}
}
if(key==55) //如果檢測(cè)到低電平,說(shuō)明按鍵按下
{
//Delay5Ms(); //延時(shí)去抖,一般10-20ms
//keyscan();
//if(key==55) //再次確認(rèn)按鍵是否按下,沒(méi)有按下則退出
//{
//while(key==55);//如果確認(rèn)按下按鍵等待按鍵釋放,沒(méi)有釋放則一直等待
// {
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;
}
}
}
/*************************點(diǎn)菜*************************************/
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();
}
/**************************鍵盤(pán)掃描***************************************/
/*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);
}
}
}
/***********寫(xiě)數(shù)據(jù)********************************************************/
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //檢測(cè)忙
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;LCD_Data = WDLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/***********寫(xiě)指令********************************************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時(shí)忽略忙檢測(cè)
{
if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測(cè)忙
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1; LCD_Data = WCLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/***********讀數(shù)據(jù)********************************************************/
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);
}
/***********讀狀態(tài)*******************************************************/
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
while (LCD_Data & Busy); //檢測(cè)忙信號(hào)
LCD_E = 0;
return(1);
}
/***********初始化********************************************************/
void LCDInit(void)
{
Delay5Ms(); //大于40MS的延時(shí)程序
PSB=1; //設(shè)置為8BIT并口工作模式
Delay5Ms(); //延時(shí)
RES=0; //復(fù)位
Delay5Ms(); //延時(shí)
RES=1; //復(fù)位置高
Delay5Ms();
WriteCommandLCD(0x30,1); //選擇基本指令集
Delay5Ms(); //延時(shí)大于100us
WriteCommandLCD(0x30,1); //選擇8bit數(shù)據(jù)流
Delay5Ms(); //延時(shí)大于37us
WriteCommandLCD(0x0C,1); //開(kāi)顯示(無(wú)游標(biāo)、不反白)
Delay5Ms(); //延時(shí)大于100us
WriteCommandLCD(0x01,1); //清除顯示,并且設(shè)定地址指針為00H
Delay5Ms(); //延時(shí)大于10ms
WriteCommandLCD(0x06,1); //指定在資料的讀取及寫(xiě)入時(shí),設(shè)定游標(biāo)的移動(dòng)方向及指定顯示的移位,光標(biāo)從右向左加1位移動(dòng)
Delay5Ms(); //延時(shí)大于100us
}
/***********清屏********************************************************/
void LCDClear(void)
{
WriteCommandLCD(0x01,1); //顯示清屏
//WriteCommandLCD(0x34,1); // 顯示光標(biāo)移動(dòng)設(shè)置
//WriteCommandLCD(0x30,1); // 顯示開(kāi)及光標(biāo)設(shè)置
}
/***********閃爍效果********************************************************/
void LCDFlash(void)
{
WriteCommandLCD(0x08,1); //顯示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 顯示開(kāi)及光標(biāo)設(shè)置
Delay400Ms();
WriteCommandLCD(0x08,1); //顯示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 顯示開(kāi)及光標(biāo)設(shè)置
Delay400Ms();
WriteCommandLCD(0x08,1); //顯示清屏
Delay400Ms();
}
/***********按指定位置顯示一個(gè)字符*******************************************/
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); //這里不檢測(cè)忙信號(hào),發(fā)送地址碼
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圖形數(shù)據(jù)************************************************/
void DisplayImage (unsigned char code *DData){
unsigned char x,y,i;
unsigned int tmp=0;
for(i=0;i<9;){ //分兩屏,上半屏和下半屏,因?yàn)槠鹗嫉刂凡煌枰珠_(kāi)
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]);//讀取數(shù)據(jù)寫(xiě)入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //擴(kuò)充功能設(shè)定
WriteCommandLCD(0x30,1);
}
/***********短延時(shí)********************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
/***********長(zhǎng)延時(shí)********************************************************/
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:橫坐標(biāo)值,范圍0~8
y:縱坐標(biāo)值,范圍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);
}
}
/*------------------------------------------------
調(diào)用顯示更新
------------------------------------------------*/
void DisplayUpdata(void)
{
unsigned char num;
LCDClear();
num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判斷數(shù)組中數(shù)值個(gè)數(shù)
if((0+(curr/4)*4)<num)
LCD_PutString(0,1,MainMenu[0+(curr/4)*4]);
else //如果超出數(shù)組最大元素,則寫(xiě)空信息,不判斷此信息可能會(huì)出現(xiàn)亂碼
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);
}
|