📄 lcda_driver.c
字号:
/************************************************************************************
* Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* File name: LCDA.C
* Processor: C8051F020
* Compiler : Keil C51 Compiler
*
* Author: 李林利
* Version: 1.20
* Date: 2007.6.1
* Email: GavinLi@126.com
* Description: 本文件是以T6963为控制器的LCD显示驱动程序文件,现支持的液晶为128x64,160x128,
* 240x64,240x128;
*
* Others: LCD(240x128为例)显示屏坐标图:
* |O(0,0)
* --|----------------------------------------------------------> y 列坐标
* | |240
* | |
* | 铭朗科技 |
* | |
* | ML-F020ICB |
* | |
* | |
* | LCD240x128 显示屏 |
* | |
* | |
* | |
* | |
* 128 |-------------------------------------------------|(128,240)
* |
* \|/
* | x 行坐标
*
* Function List:
* 1. void LCDA_WriteData(unsigned char val)
* 2. unsigned char LCDA_ReadData(void)
* 3. unsigned char LCDA_ReadStatus(void)
* 4. void LCDA_WriteCmd1(unsigned char cmd)
* 5. void LCDA_WriteCmd2(unsigned char val, unsigned char cmd)
* 6. void LCDA_WriteCmd3(unsigned char val1, unsigned char val2, unsigned char cmd)
* 7. void LCDA_ClearScreen(void)
* 8. void LCDA_ClearTextScreen(void)
* 9. void LCDA_Init(unsigned char lcd_type)
* 10. unsigned char LCDA_SetTextMaps(unsigned char id)
* 11. unsigned char LCDA_SetGraphMaps(unsigned char id)
* 12. void LCDA_DrawPixel(unsigned char x, y, bit mode)
* 13. void LCDA_DrawLine(unsigned char x1, y1, x2, y2, bit mode)
* 14. void LCDA_DrawRectangle(unsigned char x1, y1, x2, y2, bit mode)
* 15. void LCDA_DrawFillRectangle(unsigned char x1, y1, x2, y2, bit mode)
* 16. void LCDA_DrawCircle(unsigned char x, y, r, bit mode)
* 17. void LCDA_DrawByte(unsigned char x, y, unsigned char val)
* 18. void LCDA_ShowHZxy(unsigned char x, y, unsigned char line, col, unsigned char *p)
* 19. void LCDA_ShowChar(unsigned char x, y, unsigned char *p, unsigned char len)
*
* 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 "LCDA_Driver.h"
/************************************************************************************/
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
#define bool bit
#define TRUE 1
#define FALSE 0
#define LCD_CMD_ADDR 0x8801 // LCD命令端口地址
#define LCD_DATA_ADDR 0x8800 // LCD数据端口地址
#define CMD_ADDR XBYTE[LCD_CMD_ADDR] // LCD命令端口
#define DATA_ADDR XBYTE[LCD_DATA_ADDR] // LCD数据端口
#define VRAM_SIZE 0x8000 // 显存容量
#define CGRAM_ADDR 0x0000 // CGRAM区地址
#define TEXT_ADDR 0x0800 // 字符VRAM区地址
#define TEXT_SIZE 0x0800 // 字符VRAM区大小
#define GRAPH_ADDR 0x1000 // 图形VRAM区地址
unsigned int Text_BaseAddr;
unsigned int Graph_BaseAddr;
unsigned int Text_VRAM;
unsigned int Graph_VRAM;
unsigned char xdata LCDA_LineChar; // LCD 每行字符数变量(8x8字符或8x6字符)
/*************************************************************************************/
//
// T6963为控制器的LCD显示驱动程序函数定义
//
/*************************************************************************************/
/***********************************************************************************
* Function: LCDA_RWCheck;
*
* Description: 指令,数据读写状态检查;
*
* Input: none;
*
* Output: none;
*
* Return: 返回TRUE,允许指令,数据读写;返回FALSE,系统忙;
*
* Note: none;
************************************************************************************/
bool LCDA_RWCheck(void)
{
unsigned char xdata sta;
sta=CMD_ADDR & 0x03;
if (sta!=0x03)
return FALSE;
else
return TRUE;
}
/***********************************************************************************
* Function: LCDA_AutoRCheck;
*
* Description: 数据自动读,状态检查;
*
* Input: none;
*
* Output: none;
*
* Return: 返回TRUE,允许数据自动读;返回FALSE,系统忙;
*
* Note: none;
************************************************************************************/
bool LCDA_AutoRCheck(void)
{
unsigned char xdata sta;
sta = CMD_ADDR & 0x04;
if (sta!=0x04)
return FALSE;
else
return TRUE;
}
/***********************************************************************************
* Function: LCDA_AutoWCheck;
*
* Description: 数据自动写,状态检查;
*
* Input: none;
*
* Output: none;
*
* Return: 返回TRUE,允许数据自动写;返回FALSE,系统忙;
*
* Note: none;
************************************************************************************/
bool LCDA_AutoWCheck(void)
{
unsigned char xdata sta;
sta = CMD_ADDR & 0x08;
if (sta!=0x08)
return FALSE;
else
return TRUE;
}
/***********************************************************************************
* Function: LCDA_WritePara;
*
* Description: 向LCD数据口写参数;
*
* Input: val,要写的参数;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDA_WritePara(unsigned char val)
{
while (!LCDA_RWCheck());
DATA_ADDR = val;
}
/***********************************************************************************
* Function: LCDA_WriteData;
*
* Description: 向LCD数据口写数据;
*
* Input: val,要写的数据;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDA_WriteData(unsigned char val)
{
while (!LCDA_AutoWCheck());
DATA_ADDR = val;
}
/***********************************************************************************
* Function: LCDA_ReadData;
*
* Description: 从LCD数据口读数据;
*
* Input: none;
*
* Output: none;
*
* Return: 读到的数据;
*
* Note: none;
************************************************************************************/
unsigned char LCDA_ReadData(void)
{
while (!LCDA_AutoRCheck());
return(DATA_ADDR);
}
/***********************************************************************************
* Function: LCDA_ReadStatus;
*
* Description: 读取LCD状态;
*
* Input: none;
*
* Output: none;
*
* Return: 返回LCD状态数据;
*
* Note: none;
************************************************************************************/
unsigned char LCDA_ReadStatus(void)
{
return (CMD_ADDR);
}
/***********************************************************************************
* Function: LCDA_WriteCmd1;
*
* Description: 向LCD写有1个参数命令;
*
* Input: cmd,LCD操作命令;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDA_WriteCmd1(unsigned char cmd)
{
while (!LCDA_RWCheck());
CMD_ADDR = cmd;
}
/***********************************************************************************
* Function: LCDA_WriteCmd2;
*
* Description: 向LCD写有2个参数命令;
*
* Input: val, cmd, LCD操作参数命令;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDA_WriteCmd2(unsigned char val, unsigned char cmd)
{
LCDA_WritePara(val);
LCDA_WriteCmd1(cmd);
}
/***********************************************************************************
* Function: LCDA_WriteCmd3;
*
* Description: 向LCD写有3个参数命令;
*
* Input: val1,val2,cmd, LCD操作参数命令;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDA_WriteCmd3(unsigned char val1, unsigned char val2, unsigned char cmd)
{
LCDA_WritePara(val1);
LCDA_WritePara(val2);
LCDA_WriteCmd1(cmd);
}
/***********************************************************************************
* Function: LCDA_ClearVRAM;
*
* Description: 显示存储器清零函数;
*
* Input: none;
*
* Output: none;
*
* Return: none;
*
* Note: LCD显示VRAM范围 0000h--7FFFh (32k);
************************************************************************************/
void LCDA_ClearVRAM(void) //显示存储器清零
{
unsigned int xdata i;
LCDA_WriteCmd3(0x00,0x00,CMD_ADDR_POINT); //设置指针地址0000H
LCDA_WriteCmd1(CMD_CGRAM_AUTO_WRITE); //设置自动写状态
for(i=0;i<VRAM_SIZE;i++) // 清显示 RAM 区 0x0000h--0x7fffh (32k)
LCDA_WriteData(0);
LCDA_WriteCmd1(CMD_CGRAM_AUTO_END); // 自动写结束
}
/***********************************************************************************
* Function: LCDA_ClearScreen;
*
* Description: LCD图形显示屏幕函数;
*
* Input: none;
*
* Output: none;
*
* Return: none;
*
* Note: 本函数只清除当前选择的图形显示屏幕;
************************************************************************************/
void LCDA_ClearScreen(void)
{
unsigned int xdata i;
LCDA_WriteCmd3((unsigned char)Graph_BaseAddr,(unsigned char)(Graph_BaseAddr>>8),CMD_ADDR_POINT); //设置指针地址0000H
LCDA_WriteCmd1(CMD_CGRAM_AUTO_WRITE); //设置自动写状态
for(i=0;i<Graph_VRAM;i++) // 清显示 RAM 区 0000h--2000h (8k)
LCDA_WriteData(0);
LCDA_WriteCmd1(CMD_CGRAM_AUTO_END); // 自动写结束
}
/***********************************************************************************
* Function: LCDA_ClearTextScreen;
*
* Description: LCD字符显示屏幕函数;;
*
* Input: none;
*
* Output: none;
*
* Return: none;
*
* Note: 本函数只清除当前选择的字符显示屏幕;
************************************************************************************/
void LCDA_ClearTextScreen(void)
{
unsigned int xdata i;
LCDA_WriteCmd3((unsigned char)Text_BaseAddr,(unsigned char)(Text_BaseAddr>>8),CMD_ADDR_POINT); //设置指针地址0000H
LCDA_WriteCmd1(CMD_CGRAM_AUTO_WRITE); //设置自动写状态
for(i=0;i<Text_VRAM;i++) // 清显示 RAM 区 0000h--2000h (8k)
LCDA_WriteData(0);
LCDA_WriteCmd1(CMD_CGRAM_AUTO_END); // 自动写结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -