📄 lcdb_driver.c
字号:
/************************************************************************************
* 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 + -