想不到驱动12864用了我一个星期的时间。
现在把我学到的总结一下:
1、把Vo 和 VDD接在一起+5V刚好驱动屏电路清晰;
2、RST接+5V,接地则12864复位;
3、LEDA接+5V
4、LEDK接地,3和4脚接对则背屏灯亮;
5、再接一个LED小灯,作为程序的运行标志;
6、第一次用P0口接12864的数据口DB0-DB7,后来发现不能正常显示(原因是:由于Port0口内部无上拉电阻,所以执行输出功能时,外部必须接上拉电阻10千欧即可),改用P3口。
7、这个程序很好,我把它抄来了,(不是我写的,我没那个本事)
#include<AT89X52.H> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit LCD_RS=P1^0; //数据/命令选择 sbit LCD_RW=P1^1; //读写控制 sbit LCD_EN=P1^2; //片选信号 sbit LED =P2^3; #define LCD_DATA P3 //8 bit数据线
#define LOW 0 #define HIGH 1
//初始化指令 #define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置 #define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动) #define FUN_MODE 0x38 //工作模式:8位基本指令集 #define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关 #define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH #define SET_DD_AC 0x80
//***************************************************************** //函数名称:delay(uint t)延时函数。对于12M晶振大约延时1ms //入口参数:t //出口参数:无 //***************************************************************** void delay(uint t) { uint i; while(t--) { for(i=0;i<125;i++) ; } }
//***************************************************************** //函数名称:write_cmd(uint lcd_cmd)写指令 //入口参数:lcd_cmd //返回参数:无 //***************************************************************** void WriteCmd12864(uchar lcd_cmd) { LCD_RS=LOW; LCD_RW=LOW; LCD_EN=HIGH; LCD_DATA=lcd_cmd; LCD_EN=LOW; }
//**************************************************************** //函数名称:write_data(uint lcd_data)写数据 //入口参数:current_data //返回参数:无 //**************************************************************** void WriteData12864(uchar lcd_data) { LCD_RS=HIGH; LCD_RW=LOW; LCD_EN=HIGH; LCD_DATA=lcd_data; LCD_EN=LOW; }
/**************************************************************** 函数名称:Write12864(uint)写数据 入口参数:cmd,data 返回参数:无 ****************************************************************/ void Write12864(uchar lcd_cmd,uchar lcd_data) { WriteCmd12864(lcd_cmd); WriteData12864(lcd_data); }
//**************************************************************** //函数名称:ReadBusy()判忙 //入口参数:无 //返回参数:"1"忙;"0"不忙 //**************************************************************** void ReadBusy(void) { uchar i=5; while(i--);
}
/**************************************************************** 函数名称:LcdInit()初始化 入口参数:无 返回参数:无 ****************************************************************/ void LcdInit() { delay(50); WriteCmd12864(FUN_MODE); delay(1); WriteCmd12864(FUN_MODE); delay(1); WriteCmd12864(DISPLAY_ON); delay(1); WriteCmd12864(CLEAR_SCREEN); delay(20); // WriteCmd12864(CURSE_ADD); }
/**************************************************************** 函数名称:LcdClear()清屏 入口参数:无 返回参数:无 ****************************************************************/ void LcdClear(void) { ReadBusy(); WriteCmd12864(CLEAR_SCREEN); delay(3); }
/**************************************************************** 函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字 入口参数:无 返回参数:无 ****************************************************************/ void DisplayCgrom(uchar addr,uchar *hz) { ReadBusy(); WriteCmd12864(addr); ReadBusy(); while(*hz != '\0') { ReadBusy(); WriteData12864(*hz); hz++; }
}
/**************************************************************** 函数名称:Display()显示测试结果 入口参数:无 返回参数:无 ****************************************************************/ void Display(void) { DisplayCgrom(0x80,"123"); //第一行 第一行第1段 DisplayCgrom(0x88,"789"); //第三行 第二行第1段 DisplayCgrom(0x90,"456"); //第二行 第一行第2段 DisplayCgrom(0x98,"000"); //第四行 第二行第2段 } /**************************************************************** 主程序 ****************************************************************/ void main(void) {
LcdInit(); LcdClear(); while(1) { LED=HIGH; delay(400); Display(); LED=LOW; delay(400); } }
|