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

2014-11-23 22:19:41 ? 作者: ? 浏览: 7
/**************************************
带字库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 ;
}
//********
            
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: