当前位置:编程学习 > C/C++ >>

带字库LCD12864操作源代码

/**************************************
带字库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 ;
}
//*************************************
// 函数名称:写数据
// 函数功能:写数据到12864
// 入口参数:要写的数据
// 出口参数:无
// 返回值 :无
//***************************************
void WriteDataLCD(uint8 Dat)
{
		CheckLcdBusy(); //检测忙 
		LCD_RS_HIGH ;
		LCD_RW_LOW ;
		WriteLcdIo(Dat) ;//写数据到IO
		LCD_EN_HIGH ;
		DelayLcdMs(DLY100US) ;
		LCD_EN_LOW ;
}
//*************************************
// 函数名称:ReadDataLCD
// 函数功能:读12864的数据
// 入口参数:无
// 出口参数:无
// 返回值 :所读的数据
//***************************************
uint8 ReadDataLCD(void)
{
		uint8 Tmp ;
		
		SetLcdIo() ; //把IO置高
		
		LCD_RS_HIGH ; 
		LCD_RW_HIGH ;
		LCD_EN_LOW ;
		DelayLcdMs(DLY100US) ;
		LCD_EN_HIGH ;
		
		Tmp = ReadLcdIo() ;
		
		return(Tmp);
}
//*************************************
// 函数名称:LCDInit
// 函数功能:12864初始化设置
// 入口参数:无
// 出口参数:无
// 返回值 :无
//***************************************
void LCDInit(void) //LCM初始化
{
		WriteCommandLCD(0x30); //显示模式设置,开始要求每次检测忙信号
		WriteCommandLCD(0x01); //显示清屏
		WriteCommandLCD(0x06); // 显示光标移动设置
		WriteCommandLCD(0x0C); // 显示开及光标设置
}
//*************************************
// 函数名称:LCDClear
// 函数功能:12864清屏设置
// 入口参数:无
// 出口参数:无
// 返回值 :无
//***************************************
void LCDClear(void) //清屏
{
		WriteCommandLCD(0x01); //显示清屏
		WriteCommandLCD(0x34); // 显示光标移动设置
		WriteCommandLCD(0x30); // 显示开及光标设置
}
//*************************************
// 函数名称:DisplayOneChar
// 函数功能:按指定位置显示一个字符
// 入口参数:显示位置 数据
// 出口参数:无
// 返回值 :无
//***************************************
void DisplayOneChar(uint8 X, uint8 Y, uint8 Dat)
{
		if(Y<1)Y=1;	
		else 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); //这里不检测忙信号,发送地址码
		WriteDataLCD(Dat);
}
//*************************************
// 函数名称:DisplayOneChar
// 函数功能:按指定位置显示一串字符
// 入口参数:显示位置 数据
// 出口参数:无
// 返回值 :无
//***************************************
void DisplayListChar(uint8 X, uint8 Y, uint8 *DData)
{
		uint8 ListLength=0;
		
		if(Y<1)Y=1;
		else if(Y>4)Y=4;
		
		X &= 0x0F; //限制X不能大于16,Y在1-4之内//+++++ x --> x2
		switch(Y)
		{
				case 1:X |= 0X80; break;	//根据行数来选择相应地址
				case 2:X |= 0X90; break;
				case 3:X |= 0X88; break;
				case 4:X |= 0X98; break;
		}
		WriteCommandLCD(X); //发送地址码
		while (DData[ListLength] > 0)// '\0'=0若到达字串尾则退出
		{
				WriteDataLCD(DData[ListLength]); //
				ListLength++;
		}
}
//*************************************
// 函数名称:DisplayImage
// 函数功能:图形显示122*32
// 入口参数:显示位置 数据
// 出口参数:无
// 返回值 :无
//***************************************
void DisplayImage(uint8 *DData)
{
		uint8 x,y,i;
		uint16 tmp=0;
		
		for(i=0;i<9;i+=8)
		{		//分两屏,上半屏和下半屏,因为起始地址不同,需要分开
				for(x=0;x<32;x++)//32行
				{				
						WriteCommandLCD(0x34);
						WriteCommandLCD((0x80+x));//列地址
						WriteCommandLCD((0x80+i));//行地址 下半屏 即第三行地址0X88
						WriteCommandLCD(0x30);		
						for(y=0;y<16;y++)
						{						
								WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
						}
						tmp+=16;		
				}	
		}
		WriteCommandLCD(0x36);	//扩充功能设定
		WriteCommandLCD(0x30);
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,