找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1488|回复: 0
打印 上一主题 下一主题
收起左侧

12864显示程序

[复制链接]
跳转到指定楼层
楼主
ID:108795 发表于 2016-3-18 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
}     

评分

参与人数 2黑币 +54 收起 理由
yangqijun + 4 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表