带字库LCD12864操作源代码(一)

2014-11-23 22:19:41 · 作者: · 浏览: 10
/**************************************
带字库LCD12864操作源代码
**************************************/

//文件12864.h

#ifndef _DSP12864_H_
#define _DSP12864_H_
//#include "dsp12864.h"


#define		P_184RS		PC5_OUT
#define		P_184RW		PC4_OUT
#define		P_184EN		PC3_OUT


//-----X 以字为单位 共8个字-----
#define		LX1		0
#define		LX2		1
#define		LX3		2
#define		LX4		3
#define		LX5		4
#define		LX6		5
#define		LX7		6
#define		LX8		7
//-----Y-------------------------
#define		LY1		1
#define		LY2		2
#define		LY3		3
#define		LY4		4


//=========================================
uint8 CheckLcdBusy(void);
void WriteDataLCD(uint8 WDLCD);
void WriteCommandLCD(uint8 WCLCD);
uint8 ReadDataLCD(void);
extern void LCDInit(void);
extern void LCDClear(void);
extern void DisplayOneChar(uint8 X, uint8 Y, uint8 DData);
extern void DisplayListChar(uint8 X, uint8 Y, uint8 *DData);
extern void DisplayImage(uint8 *DData);

#endif


//文件12864.C

#include "global.h"
#include "dsp12864.h"

#define		LCD_RS_HIGH			P_184RS = 1		//RS 数据 命令切换
#define		LCD_RS_LOW			P_184RS = 0

#define		LCD_RW_HIGH			P_184RW = 1 //Read
#define		LCD_RW_LOW	   	P_184RW = 0 //Write

#define		LCD_EN_HIGH			P_184EN = 1 //ENABLE 
#define		LCD_EN_LOW		  P_184EN = 0


#define LcdBusyBit    0x80 //用于检测LCD状态字中的Busy标识

#define	 DLY5MS		125
//#define	 DLY1MS		25
#define	 DLY100US		2

//延时函数5MS ok
void DelayLcdMs(uint8 TDly)
{
	 uint8 i,j ;
	 
	 for(i=100;i>0;i--)
		for(j=TDly;j>0;j--);
}
//*************************************
// 函数名称:LcdDat
// 函数功能:写数据到IO
// 入口参数:12864的数据
/
/ 返回值 :无 //*************************************** void WriteLcdIo(uint8 Dat) { uint8 Tmp ; Tmp = Dat & 0xfc; if(Dat & 0x02) { Tmp |= 0x01 ; } PD_ODR = Tmp ; if(Dat & 0X01) { PC7_OUT = 1 ; } else { PC7_OUT = 0 ; } } //************************************* // 函数名称:ReadLcdIo // 函数功能:读LCD IO 的数据 // 入口参数:无 // 返回值 :LCD的数据 //*************************************** void SetLcdIo(void) { PD_ODR = 0xff ; PC7_OUT = 1 ; _asm("nop");_asm("nop");_asm("nop");_asm("nop"); _asm("nop");_asm("nop");_asm("nop");_asm("nop"); } uint8 ReadLcdIo(void) { uint8 Tmp=0 ; Tmp = PD_IN & 0Xfc ; if(PD_IN & 0x01) { Tmp |= 0X02 ; } if(PC_IN & 0x80) { Tmp |= 0X01 ; } return Tmp ; } //************************************* // 函数名称:CheckLcdBusy // 函数功能:读12864的状态 // 入口参数:无 // 出口参数:无 // 返回值 :所读的数据 //*************************************** uint8 CheckLcdBusy(void) { uint8 Tmp ; SetLcdIo() ; //把IO置高 LCD_RS_LOW ; LCD_RW_HIGH ; LCD_EN_HIGH ; do{ Tmp = ReadLcdIo() ; }while (Tmp & LcdBusyBit); //检测忙信号 LCD_EN_LOW ; return(Tmp); } //************************************** // 函数名称:WriteCommandLCD // 函数功能:写命令到12864 // 入口参数:要写的数据 // 出口参数:无 // 返回值 :无 //*************************************** void WriteCommandLCD(uint8 Dat) //BuysC为0时忽略忙检测 { CheckLcdBusy(); //检测忙 LCD_RS_LOW ; LCD_RW_LOW ; WriteLcdIo(Dat) ;//写数据到IO LCD_EN_HIGH ; DelayLcdMs(DLY100US) ; LCD_EN_LOW ; } //********