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

📄 lcdb_driver.c

📁 C8051F020的LCD的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************************
*  Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* File name: LCDB.C
* Processor: C8051F020
* Compiler : Keil C51 Compiler
* 
* Author:  李林利
* Version: 1.20
* Date:    2007.6.1
* Email:   GavinLi@126.com
* History:
*   1. Author:       李林利  
*	   Version: 	 1.10
*	   Date:         2007.3.12
*      Modification: none
*
*   2. Author:       李林利   
*	   Version: 	 1.00
*      Date:         2004.11.24
*      Modification: 建立文件
*
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include <INTRINS.H>
#include <ABSACC.H>
#include <MATH.H>
#include  "delay.h"		// 引用延时驱动模块
#include  "LCDB_Driver.h"

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


/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
#define SEDWRCOM 	XBYTE[0x8801] 		// 写指令代码 
#define SEDRDCSR 	XBYTE[0x8801] 		// 读光标指针(指向的数据) 
#define SEDWRDAT 	XBYTE[0x8800] 		// 写指令参数和显示数据 

#define FALSE		0
#define TRUE		1
#define MAP3		0x40
#define MAP2		0x10
#define MAP1		0x04
#define CURSOR		0x02

#define VRAM_SIZE  	0x8000 			 	// 显存容量

#define CGRAM_ADDR 	0x0000 			 	// CGRAM区地址
#define CGRAM_SIZE 	0x0C00 			 	// CGRAM区大小

#define SAD1_ADDR  	0x0C00       	 	// 第1显示区起始地址
#define SAD2_ADDR  	0x3280			 	// 第2显示区起始地址
#define SAD3_ADDR  	0x5900			 	// 第3显示区起始地址
#define SAD4_ADDR  	0x7F80			 	// 第4显示区起始地址
#define SADx_SIZE  	0x2680       	 	// 显示区大小



unsigned int xdata LCDBGraph_BaseAddr;
unsigned char xdata LCDB_LineChar;	 	// LCD 每行字符数变量(8x8字符)


unsigned char code SYSTAB[8]={0x37,0x87,0x0f,0x28,0x4c,0xF0,0x29,0x00}; 
unsigned char code SYSTAB2[8]={0x37,0x87,0x0f,0x1E,0x4c,0xA0,0x1F,0x00}; 

unsigned char code SCRTAB[10]={00,0x0C,0xF0,0x80,0x32,0xF0,0x00,0x59,0x80,0x7F}; 

/*************************************************************************************/
//
// 						SED1335为控制器的LCD显示驱动程序函数定义
//
/*************************************************************************************/

/***********************************************************************************
* Function: LCDB_WriteData;
*
* Description: 向LCD数据口写数据;
*              
* Input:  val,要写的数据;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_WriteData(unsigned char val) 
{ 
	SEDWRDAT = val; 
	_nop_(); 
}

/***********************************************************************************
* Function: LCDB_WritePara;
*
* Description: 向LCD数据口写参数;
*              
* Input:  *p,参数; len,参数长度;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_WritePara(unsigned char *p, unsigned char len) 
{ 
	unsigned char xdata i;

	for(i=0; i<len; i++)
		LCDB_WriteData(*p++);
}

/***********************************************************************************
* Function: LCDA_ReadData;
*
* Description: 从LCD数据口读数据;
*              
* Input:  none;
*
* Output: none;
*
* Return: 读到的数据;
*
* Note:   none;
************************************************************************************/
unsigned char LCDB_ReadData(void)
{
	 return(SEDRDCSR);
}

/***********************************************************************************
* Function: LCDB_WriteCmd;
*
* Description: 向LCD写命令;
*              
* Input:  cmd,LCD操作命令;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_WriteCmd(unsigned char cmd) 
{ 
	SEDWRCOM = cmd; 
	_nop_();  
}

/***********************************************************************************
* Function: LCDB_WriteCmdPara;
*
* Description: 向LCD命令口写入命令,接下来向LCD数据口写参数;
*              
* Input:  cmd,LCD控制命令, *para,参数指针; len,参数长度;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_WriteCmdPara(unsigned char cmd, unsigned char *para, unsigned char len) 
{ 
	unsigned char xdata i;
    
    SEDWRCOM = cmd; 
	_nop_(); 
	for(i=0; i<len; i++)
	{
		SEDWRDAT = *para++; 
		_nop_(); 
	}	
}

/***********************************************************************************
* Function: LCDB_ClearVRAM;
*
* Description: 显示存储器清零函数;
*
* Input:  none;
*
* Output: none;
*
* Return: none;
*
* Note:   LCD显示VRAM范围 0000h--FFFFh (64k);
************************************************************************************/
void LCDB_ClearVRAM(void) //显示存储器清零 
{ 
	unsigned int xdata i; 
	
	LCDB_WriteCmd(CMD_CSRRGT);
	LCDB_WriteCmd(CMD_CSRW);
	LCDB_WriteData(0x00);
	LCDB_WriteData(0x00); 
	LCDB_WriteCmd(CMD_MWRITE); 
	for(i=0;i<0x8000;i++) 
	{ 
		LCDB_WriteData(0x00); 
		LCDB_WriteData(0x00); 
	}
}

/***********************************************************************************
* Function: LCDB_ClearScreen;
*
* Description: LCD清屏函数;
*              
* Input:  none;
*
* Output: none;
*
* Return: none;
*
* Note:   本函数只清除所设定的当前显示区即当前屏幕显示;
************************************************************************************/
void LCDB_ClearScreen(void)
{
	unsigned int xdata i; 

	LCDB_WriteCmd(CMD_CSRRGT); 
	LCDB_WriteCmd(CMD_CSRW);
	LCDB_WriteData((unsigned char)LCDBGraph_BaseAddr);
	LCDB_WriteData((unsigned char)(LCDBGraph_BaseAddr>>8));
	LCDB_WriteCmd(CMD_MWRITE); 
	for(i=0;i<SADx_SIZE;i++)
		LCDB_WriteData(0); 	
}

/***********************************************************************************
* Function: LCDA_Init;
*
* Description: LCD初始化函数;
*              
* Input:  x, LCD行数; y, LCD列数; 例如:320x240 的LCD, line=240,column=320;
*
* Output: none;
*
* Return: none;
*
* Note:   本函数完成的设置:1.光标形状(0xa7):8x8; 2显示方式: 三屏图形显示,
*         以"或"方式合成;3.设置显示开关: 图形显示/光标显示(闪烁);
*         4.显示存储器清零; 5. 设置图形显示区(编号):0; 
************************************************************************************/
void LCDB_Init(unsigned int x, unsigned int y)
{
	//初始化LCD显示参数以及界面 
	//unsigned char i;
    unsigned char xdata para[2];
	x=!!x;	//无效操作 避免出现警告提示
	LCDB_LineChar = (y>>3)+1;

//	SYSTAB[3] = LCDB_LineChar;
//	SYSTAB[5] = x;
//	SYSTAB[6] = LCDB_LineChar + 1;
	if (y==320)
    	LCDB_WriteCmdPara(CMD_SYSSET, SYSTAB, 8);
	else if (y==240)
		LCDB_WriteCmdPara(CMD_SYSSET, SYSTAB2, 8);
		
//	SCRTAB[2] = x + 1;
//	SCRTAB[5] = x + 1;
	LCDB_WriteCmdPara(CMD_SCROLL, SCRTAB, 10);

	para[0] = 0;
	LCDB_WriteCmdPara(CMD_HDOTSCR, para, 1);
 		    
	para[0] = 0x1c;
	LCDB_WriteCmdPara(CMD_OVLAY, para, 1);

	para[0] = 0x56;
	LCDB_WriteCmdPara(CMD_DISPOFF, para, 1);

	LCDB_ClearVRAM(); 
	
	para[0] = 0x01;
	para[1] = 0x07;
	LCDB_WriteCmdPara(CMD_CSRFORM, para, 2);
						
	para[0] = MAP1|CURSOR;
	LCDB_WriteCmdPara(CMD_DISPON, para, 1);
	LCDBGraph_BaseAddr = SAD1_ADDR;

	para[0] = 0x00;
	para[1] = 0x00;
	LCDB_WriteCmdPara(CMD_CGRAMADR, para, 2);

	LCDB_ClearScreen();	
}

/***********************************************************************************
* Function: LCDB_SetGraphMaps;
*
* Description: 设置图形显示区;此函数可更换不同的图形显示;
*              
* Input:  id, 图形显示区编号, 范围:0~2;
*
* Output: none;
*
* Return: TRUE,设置正确; FALSE,设置失败;
*
* Note:   none;
************************************************************************************/
unsigned char LCDB_SetGraphMaps(unsigned char id)
{
	unsigned char xdata para;

	if(id == 0)
	{
		para = MAP1|CURSOR;
		LCDBGraph_BaseAddr = SAD1_ADDR;
    }
	else if(id == 1)
    {
		para = MAP2|CURSOR;
		LCDBGraph_BaseAddr = SAD2_ADDR;

⌨️ 快捷键说明

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