⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_driver.c

📁 C8051F020的LCD的驱动程序
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: LCDC_Driver.C
* 文件标识: none
* 适用器件: C8051F020 DMC12864
* 
* 摘 要: 本文件是LCD显示子程序;使用外部22.1184MHz晶振
* 
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年2月1日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/*******************************引用外部头文件***************************************/
#include "c8051f020.h"
#include "Lcd_driver.h"
#include <INTRINS.H>
#include <math.h>

/************************************************************************************/

/*********************************全局变量*******************************************/
unsigned int  xdata  addr;
unsigned char xdata  *tp;

/***********************************************************************************
* 函数名称:LCDC_Init;
*
* 函数功能描述:lcd_init;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    具体Lcd操作请参考DMC12864.PDF;
************************************************************************************/
void LCDC_Init (void)                                           
{
	DISABLE_INTERRUPTS;		//关中断
	addr = Lcd_Cs     | 
		   Lcd_CsChip | 
		   Lcd_WrCmd;		//写命令 (参考Lcd_Driver.h文件宏定义)
	LCDC_WrCmd (Lcd_Dsl);	//Display start line
	LCDC_WrCmd (St_Addr);	//COLOUM ADDRESS
	LCDC_WrCmd (St_Page);	//ROW ADDRESS
	LCDC_WrCmd (Dis_ON );	//Display ON	
	ENABLE_INTERRUPTS;  	//开中断
}

/***********************************************************************************
* 函数名称:LCDC_DisFull;
*
* 函数功能描述: 清屏函数(全部写慢或清空);
*              
* 输入参数:unsigned char类型数据,0x00是清屏;0xff是写满屏;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LCDC_DisFull (unsigned char Flag)
{
	unsigned char x,y; 

	if (!Flag)						//清屏
	{
		for (y=0; y<8;   y++)
		for (x=0; x<128; x++)                 
			LCDC_WrData (x, y, 0X00);
	}
	else 							//写满屏
	{
		for (y=0; y<8;   y++)
		for (x=0; x<128; x++)                
			LCDC_WrData (x, y, 0XFF);
	}
}

/***********************************************************************************
* 函数名称:LCDC_CheckBusy;
*
* 函数功能描述: 判断LCD忙等待;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LCDC_CheckBusy (void)
{
	addr = Lcd_Cs 	  | 
		   Lcd_CsChip | 
		   Lcd_RdSta;  		//读状态(参考Lcd_Driver.h文件宏定义)
	_nop_();_nop_();		//延时等待 
    _nop_();_nop_();
	do						//取Lcd的状态寄存器内的数据 
		tp = addr; 
	while ((*tp&Chip_Busy)==Chip_Busy);//等待BUSY位清零 Lcd空闲
}

/***********************************************************************************
* 函数名称:LCDC_WrCmd;
*
* 函数功能描述: 向LCD写命令;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LCDC_WrCmd (unsigned char dd)
{
	DISABLE_INTERRUPTS;		//关中断
	addr  = Lcd_Cs 	   | 
			Lcd_CsChip | 
			Lcd_WrCmd;   	//写命令地址 (参考Lcd_Driver.h文件宏定义)
    tp    = addr;
	*tp   = dd;				//写命令
	addr &= Unto_Lcd;		//改变地址变量 地址不指向Lcd
	_nop_();_nop_();		//延时等待
    _nop_();_nop_();
	ENABLE_INTERRUPTS;		//开中断
}

/***********************************************************************************
* 函数名称:LCDC_SetXY;
*
* 函数功能描述: LCD读写位置变换;
*              
* 输入参数:unsigned char类型坐标x,y;
*
* 返回数据:none;
*
* 注意:    详细请参考DMC12864.PDF;程序中X,Y方向定义与屏定义不同
************************************************************************************/
void LCDC_SetXY (unsigned char x, unsigned char y)
{
	DISABLE_INTERRUPTS; 	//关中断
    LCDC_CheckBusy ();		//等待Lcd空闲
    y  &= x_addr;			//x赋值 屏蔽掉无用位 加人相关命令
	y  |= St_Page;
	LCDC_WrCmd (y);
	x  &= y_addr;			//Y赋值 屏蔽掉无用位 加人相关命令
	x  |= St_Addr;
	LCDC_WrCmd (x);
	ENABLE_INTERRUPTS;		//开中断
}

/***********************************************************************************
* 函数名称:LCDC_WrData;
*
* 函数功能描述:向LCD写数据;
*              
* 输入参数:unsigned char类型坐标x,y, unsigned char类型写入数据dd;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LCDC_WrData (unsigned char x, unsigned char y, unsigned char dd)
{    
   	DISABLE_INTERRUPTS;		//关中断
	LCDC_SetXY (x,y);		//设置屏上的写入位置
    LCDC_CheckBusy ();		//等待Lcd空闲
    if (x<64)				//块1使用 
		tp = Lcd_Cs  | 
			 Lcd_Cs1 | 
			 Lcd_WrDat;		//写入数据命令
    else					//块2使用 
		tp = Lcd_Cs  | 
			 Lcd_Cs2 | 
			 Lcd_WrDat;		//写入数据命令
	*tp = dd;				//数据写入
	ENABLE_INTERRUPTS;		//关中断
}

/***********************************************************************************
* 函数名称:LCDC_RdData;
*
* 函数功能描述:从LCD中读数据;
*              
* 输入参数:unsigned char类型坐标x,y, 
*
* 返回数据:unsigned char类型读出数据;
*
* 注意:    none;
************************************************************************************/
unsigned char LCDC_RdData (unsigned char x, unsigned char y)
{  
	unsigned char xdata readdata;
	LCDC_SetXY (x, y);			//设置屏上的写入位置
	LCDC_CheckBusy ();			//等待Lcd空闲
	if (x<64)					//块1使用 
	{
		addr = Lcd_Cs  |
			   Lcd_Cs1 |
			   Lcd_RdDat;		//读取数据命令
		tp   = Lcd_Cs  |
			   Lcd_Cs1 |
			   Lcd_RdDat;
	}
	else						//块2使用
	{
		addr = Lcd_Cs  |
			   Lcd_Cs2 |
			   Lcd_RdDat;		//读取数据命令				
		tp   = Lcd_Cs  |
			   Lcd_Cs2 |
			   Lcd_RdDat;	
	}
	readdata = *tp;				//数据读出
	LCDC_CheckBusy ();			//等待Lcd空闲
	if (x<64)					//块1使用 
	{
		addr = Lcd_Cs  |
			   Lcd_Cs1 |
			   Lcd_RdDat;		//读取数据命令
		tp   = Lcd_Cs  |
			   Lcd_Cs1 |
			   Lcd_RdDat;
	}
	else						//块2使用
	{
		addr = Lcd_Cs  |
			   Lcd_Cs2 |
			   Lcd_RdDat;		//读取数据命令				
		tp   = Lcd_Cs  |
			   Lcd_Cs2 |
			   Lcd_RdDat;	
	}
	readdata = *tp;				//数据读出

	return readdata;
}

/***********************************************************************************
* 函数名称:LCDC_DrawByte;
*
* 函数功能描述:向LCD写一个字节数据;
*              
* 输入参数:BYTE类型坐标x,y;BYTE类型字节数据value;
*
* 返回数据:none;
*
* 注意:    数据显示在液晶点(x,y)(x,y+1)(x,y+2)(x,y+3)(x,y+4)(x,y+5)(x,y+6)(x,y+7)上,
*           请参考DMC12864.pdf;
***********************************************************************************/
void  LCDC_DrawByte (unsigned char x, y, value)
{
	unsigned char data temp,bit_x;

	bit_x = y%8;						//计算数据写入目标地址起点所在显示字节内的位置
	y     = y/8;						//计算数据写入目标地址起点所在显示字节
	if (bit_x==0)						//如果起点在显示字节的"0"位则数据直接写入
		LCDC_WrData (x, y, value);
	else								//如果起点不在显示字节的"0"位
	{	
		temp  = LCDC_RdData (x, y);		//读出数据写入目标地址起点所在显示字节内的数据		
		temp &= (0xff>>(8-bit_x));		//保留新数据写如不占用位的数据
		temp |= (value<<bit_x);			//新数据与原数据组合
		LCDC_WrData (x, y, temp);		//更新LCD上此位置的数据显示
		temp  = LCDC_RdData(x, y+1);	//读出数据写入目标地址末点所在显示字节内的数据
		temp &= (0xff<<bit_x);			//保留新数据写如不占用位的数据
		temp |= (value>>(8-bit_x));		//新数据与原数据组合
		LCDC_WrData (x, y+1, temp);		//更新LCD上此位置的数据显示
	}
}

/***********************************************************************************
* 函数名称:LCDC_DispWord;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*              
* 输入参数:unsiggned char类型写入起始坐标x,y,unsigned char类型写入数据code区指针p;
*	    unsigned char类型占用空间line*8行,length列,图形颜色取反标志位;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void LCDC_DispWord (unsigned char x, y, unsigned char code *p, unsigned char line, length, Flag)
{
	unsigned char data i,j; 

	y += (4<<line);	
	if (y>64)
		y = 64;
	y = 64-y;
	if (Flag)
	{
		for (i=0; i<line;   i++)
		for (j=0; j<length; j++)
			LCDC_DrawByte (x+j, y+i*8, *p++);
	}
	else
	{
		for (i=0; i<line;   i++)
		for (j=0; j<length; j++)
			LCDC_DrawByte (x+j, y+i*8, ~*p++);
	}
}

/***********************************************************************************
* 函数名称:LCDC_DispFWord;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据xdata区指针p;
*	    BYTE类型占用空间line*8行,length列;BYTE类型显示数据取反标志位
*		(非零为正常显示,零为取反)
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************
void LCDC_DispFWord (unsigned char x, y, unsigned char xdata *p, unsigned char line, length, Flag)
{
	unsigned char data i,j;

	y += (4<<line);	
	if (y>64)
		y=64;
	y = 64-y;		
	if (Flag)
	{
		for (i=0; i<line;   i++)
		for (j=0; j<length; j++)
			LCDC_DrawByte(x+j, y+i*8, *p++);
	}
	else
	{
		for (i=0; i<line;   i++)
		for (j=0; j<length; j++)
			LCDC_DrawByte (x+j, y+i*8, ~*p++);
	}	
}

/************************************************************************************
* 文件结束
************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -