LCD12864学习心得:

这段时间一直在学习LCD12864 

并行模式下 程序

/*
日期:2018年6月30号 
产品 LCD12864 带字库
代码思路:并行模式 写入字符串 分屏显示

*/


#include <reg52.h>
#include <intrins.h>
sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;//读写端
sbit LCD_E=P2^5;// EN使能端
sbit PSB =P1^2; //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
#define LCD_Data P0








#define Busy    0x80 //用于检测LCD状态字中的Busy标识
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);


code unsigned char  uctech[] = {"我在这里"};
code unsigned char  net[] = {"祝大家"};
code unsigned char  mcu[] = {"端午节快乐!"};
code unsigned char  qq[] = {"happyDragonBoat"};
code unsigned char tmp[]={/*------------------------------------------------------------------------------
/*------------------------------------------------------------------------------
  源文件 / 文字 : 九江学院电子协会
  宽×高(像素): 128×64
------------------------------------------------------------------------------*/
0x04,0x00,0x00,0x00,0x22,0x08,0x00,0x40,0x01,0x00,0x00,0x00,0x20,0x80,0x01,0x00,
0x04,0x00,0x20,0x00,0x11,0x08,0x78,0x20,0x01,0x00,0x7F,0xF8,0x20,0x80,0x01,0x00,
0x04,0x00,0x17,0xFC,0x11,0x10,0x4B,0xFE,0x01,0x00,0x00,0x10,0x20,0x80,0x02,0x80,
0x04,0x00,0x10,0x40,0x00,0x20,0x52,0x02,0x3F,0xF8,0x00,0x20,0x20,0x80,0x04,0x40,
0x7F,0xE0,0x80,0x40,0x7F,0xFE,0x54,0x04,0x21,0x08,0x00,0x40,0xFB,0xF0,0x08,0x20,
0x04,0x20,0x40,0x40,0x40,0x02,0x61,0xF8,0x21,0x08,0x01,0x80,0x20,0x90,0x30,0x18,
0x04,0x20,0x48,0x40,0x80,0x04,0x50,0x00,0x21,0x08,0x01,0x00,0x20,0x90,0xCF,0xE6,
0x04,0x20,0x08,0x40,0x1F,0xE0,0x48,0x00,0x3F,0xF8,0xFF,0xFE,0x22,0x98,0x00,0x00,
0x08,0x20,0x10,0x40,0x00,0x40,0x4B,0xFE,0x21,0x08,0x01,0x00,0x22,0x94,0x00,0x00,
0x08,0x20,0x10,0x40,0x01,0x80,0x48,0x90,0x21,0x08,0x01,0x00,0x24,0x92,0x7F,0xFC,
0x08,0x20,0xE0,0x40,0xFF,0xFE,0x68,0x90,0x21,0x08,0x01,0x00,0x28,0x92,0x02,0x00,
0x10,0x22,0x20,0x40,0x01,0x00,0x50,0x90,0x3F,0xF8,0x01,0x00,0x20,0x90,0x04,0x00,
0x10,0x22,0x20,0x40,0x01,0x00,0x41,0x12,0x21,0x0A,0x01,0x00,0x21,0x10,0x08,0x20,
0x20,0x22,0x2F,0xFE,0x01,0x00,0x41,0x12,0x01,0x02,0x01,0x00,0x21,0x10,0x10,0x10,
0x40,0x1E,0x20,0x00,0x05,0x00,0x42,0x0E,0x01,0x02,0x05,0x00,0x22,0x50,0x3F,0xF8,
0x80,0x00,0x00,0x00,0x02,0x00,0x44,0x00,0x00,0xFE,0x02,0x00,0x24,0x20,0x10,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00














//0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X5F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X01,0XE1,0XFF,0XE0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X0F,0XF9,0XFF,0XEF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X1F,0XFD,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X00,0X87,0X00,0X18,0X00,0X00,0XC0,
//0X00,0X1F,0XFE,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X01,0X8D,0X80,0X18,0X01,0XF7,0XC0,
//0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X8D,0XA0,0X18,0X00,0X03,0X80,
//0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X27,0XFF,0XF1,0XFF,0XC0,0X06,0X00,
//0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X03,0XFF,0XF1,0X9D,0X01,0X08,0XC0,0X0C,0X00,
//0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X7D,0X61,0X18,0XC0,0X08,0X60,
//0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0XDF,0XE1,0XFF,0XC7,0XFF,0XF0,
//0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X1C,0X03,0XED,0X01,0X18,0XC0,0X08,0X00,
//0X00,0X1F,0XFF,0X01,0XFF,0XF8,0X00,0X00,0X16,0X02,0X8D,0X61,0X18,0XC0,0X08,0X00,
//0X00,0X0F,0XFE,0X00,0XFF,0XF8,0X00,0X00,0X32,0X02,0XAD,0X81,0XFF,0XC0,0X08,0X00,
//0X00,0X07,0XF8,0X00,0X3F,0XD0,0X00,0X00,0X23,0X07,0X3D,0X01,0X18,0X20,0X08,0X00,
//0X00,0XFD,0XF8,0X00,0X3F,0XE0,0X00,0X00,0X61,0X85,0XFD,0X20,0X18,0X20,0X08,0X00,
//0X01,0XFF,0XF0,0X00,0X1F,0X40,0X00,0X00,0X80,0XF0,0X0F,0XE0,0X18,0X20,0X78,0X00,
//0X03,0XFF,0XF0,0X00,0X0F,0X80,0X00,0X03,0X00,0X60,0X0C,0X00,0X0F,0XE0,0X18,0X00,
//0X03,0XFF,0XE0,0X00,0X0F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X07,0XFF,0XE0,0X00,0X0F,0XF4,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X07,0XFF,0XE0,0X00,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X07,0XFF,0XE0,0X00,0X0F,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X03,0XFF,0XE0,0X00,0X0F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X03,0XFF,0XE0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X03,0XFF,0XF0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X01,0XFF,0XF0,0X00,0X3F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X01,0XFF,0XF8,0X00,0X7F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0XFF,0XFC,0X00,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X3F,0XFF,0X87,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X03,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0XFE,0X77,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X70,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X70,0X0F,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X70,0X3F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X78,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X1F,0XFC,0X79,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X7F,0XFF,0X39,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0XFF,0XFF,0XFD,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X7F,0XFF,0XFE,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X3F,0XFF,0XEF,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X0F,0XFF,0XEF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X07,0XFF,0XC7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X01,0XFF,0X83,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X1E,0X01,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X00,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,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(); //LCM初始化
 Delay5Ms(); //延时片刻(可不要)
 while(1){
  LCDClear();
DisplayImage(tmp);//显示图形
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
LCDClear();
DisplayListChar(0,1,uctech); //显示字库中的中文数字
  DisplayListChar(0,2,net); //显示字库中的中文数字
DisplayListChar(0,3,mcu); //显示字库中的中文
DisplayListChar(0,4,qq); //显示字库中的中文数字
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
 
 
LCDFlash(); //闪烁效果
}
}




//写数据
void WriteDataLCD(unsigned char WDLCD)
{
 ReadStatusLCD(); //检测忙 
 LCD_RS = 1; 
 LCD_RW = 0; //RW为写数据
 LCD_Data = WDLCD;
 LCD_E = 1;
 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_Data = WCLCD;
 LCD_E = 1; 
 LCD_E = 1;
 LCD_E = 1;
 LCD_E = 0;  
}


//读数据
unsigned char ReadDataLCD(void)
{
 LCD_RS = 1; 
 LCD_RW = 1;//读数据
 LCD_E = 0;
 LCD_E = 0;
 LCD_E = 1;
 return(LCD_Data);//把PO口的数据读出
}


//读状态
unsigned char ReadStatusLCD(void)
{
 LCD_Data = 0xFF; 
 LCD_RS = 0;//指令表规定
 LCD_RW = 1;// 
 LCD_E = 1;
 while (LCD_Data & Busy); //检测忙信号 Busy 为0x80
 LCD_E = 0;
 return(LCD_Data);
}


void LCDInit(void) //LCM初始化
{
 WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCD(0x01,1); //显示清屏
 WriteCommandLCD(0x06,1); // 显示光标移动设置 光标右移 显示屏不移动 DDRAM地址计数器AC+1
 WriteCommandLCD(0x0C,1); // 显示开及光标设置
}
void LCDClear(void) //清屏
{
 WriteCommandLCD(0x01,1); //显示清屏
 WriteCommandLCD(0x34,1); // 显示光标移动设置 扩充指令动作
 WriteCommandLCD(0x30,1); // 设定 8位控制界面
}
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){ //用Y来选着行 X或上 选择列 
case 1:X|=0X80;break; //X代表行 1行
case 2:X|=0X90;break; // 2行
  case 3:X|=0X88;break; // 3行
case 4:X|=0X98;break; // 4行
}
 WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
 WriteDataLCD(DData);
}


//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
 unsigned char ListLength,X2;
  ListLength = 0;
  X2=X;
 if(Y<1)
  Y=1;
 if(Y>4)
  Y=4;
 X &= 0x0F; //限制X不能大于16,Y在1-4之内
 switch(Y){
case 1:X2|=0X80;break; //根据行数来选择相应地址
case 2:X2|=0X90;break;
case 3:X2|=0X88;break;
case 4:X2|=0X98;break;
}
 WriteCommandLCD(X2, 1); //发送地址码
  while (DData[ListLength]>=0x20) //若到达字串尾则退出
  {
   if (X <= 0x0F) //X坐标应小于0xF
    {
     WriteDataLCD(DData[ListLength]); //
     ListLength++;
X++;
Delay5Ms();
    }
  }
}


//图形显示128*64
void DisplayImage (unsigned char code *DData){
unsigned char x,y,i;
unsigned int tmp=0;
// WriteCommandLCD(0x80,1);
for(i=0;i<9;)
{ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1); //基本扩充指令 绘图指令关

WriteCommandLCD((0x80+x),1);//列地址 Y 垂直地址
WriteCommandLCD((0x80+i),1); // X 行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1); //设定8位控制界面
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //扩充功能设定
WriteCommandLCD(0x30,1);
}


//5ms延时
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}


//400ms延时
void Delay400Ms(void)
{
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
  TempCycB=7269;
  while(TempCycB--);
 };

}

并行模式的程序较简单,唯一一点难点就是 在写入自定义图案的规定

下面 回到LCD12864的操作说明书

1、图形显示坐标

 水平方向X—以字节为单位

垂直方向Y—以位为单位

个人理解:unsigned char 的字节长度为8 一个16进制数写8个小格

PS水平方向上有128个小格 每16个大格分成一个大格 所以水平方向上共有0-7大区 ,在Y方向上共有64个小格



//图形显示128*64

下为代码复制

void DisplayImage (unsigned char code *DData){
unsigned char x,y,i;
unsigned int tmp=0;
// WriteCommandLCD(0x80,1);
for(i=0;i<9;)
{ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1); //基本扩充指令 绘图指令关

WriteCommandLCD((0x80+x),1);//列地址 Y
WriteCommandLCD((0x80+i),1); // X 行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1); //设定8位控制界面
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //扩充功能设定
WriteCommandLCD(0x30,1);
}


分析程序:


1按照要求写入的时候把绘图指令关 WriteCommandLCD(0x34,1); 


for(i=0;i<9;)
{ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1); //基本扩充指令 绘图指令关

WriteCommandLCD((0x80+x),1);//列地址Y
WriteCommandLCD((0x80+i),1); //  X 行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1); //设定8位控制界面
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;

}

2 进入第二个for循环 for(x=0;x<32;x++)

先写入的是水平地址,这里WriteCommandLCD((0x80+x),1);//列地址

WriteCommandLCD((0x80+i),1); //  再去写Y坐标方向上的地址  

这里的经测试先写入的为列地址(垂直地址),LCD12864分上下两屏幕,上屏幕的地址为0x80,下地址为0x88,

这里先从0X80 第一行的一个坐标,

这时候进入第三个for循环,写数据,一个数据代表8个格子,16个刚好为128格,所以第一行写完。tmp=16

字模数组现在在tmp=16的位置

回到第二个for循环 x=1 Y地址变成0x81,X地址没变。写完第二行

依次类推  x=32时 进行完循环 上半屏幕写完 此时i=8,X坐标变为0x88,开始写下半屏幕。


讲解一下字模取字方式:单色点阵液晶字模,横向取模,字节正序。

1本人的LCD12864是单色的,市场绝大多数LCD12864也是单色的

2横向取模  X方向是以字节为单位 ,写入两个十六进制从数据正好写入了16个小格,为横向写入

3字节正序,由高位到低位为正序





发布了9 篇原创文章 · 获赞 2 · 访问量 2605

猜你喜欢

转载自blog.csdn.net/sqm472527736/article/details/80881464