?? 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 + -