📄 lcd.c
字号:
/*******************************************************************************
程序名称:LCD驱动程序
显示功能:显示ASCII码
硬件接法:D/I---------A0
R/W---------A1
E-----------读写0xA000~0xA003时,选中
CSA---------(前半屏选通,低电平有效)
CSB---------(后半屏选通,低电平有效)
DB0~DB7----D0~D7
*******************************************************************************/
#include "Lcd.h"
#include "ASCII.h"
#include "HanZi.h"
#include "uniondef.h"
//定义I/O接口
unsigned char bdata XIO = 0;
#define LCD_SET_CSA() {XIO|=0x10;XBYTE[0x8000]=XIO;}
#define LCD_CLR_CSA() {XIO&=0xEF;XBYTE[0x8000]=XIO;}
#define LCD_SET_CSB() {XIO|=0x20;XBYTE[0x8000]=XIO;}
#define LCD_CLR_CSB() {XIO&=0xDF;XBYTE[0x8000]=XIO;}
/*******************************************************************************
函数:LcdWaitBusy()
功能:读取LCD的Busy标志,如果LCD忙则等待,如果空闲则返回
说明:每次操作之前都应当确认LCD处于空闲状态
*******************************************************************************/
void LcdWaitBusy()
{
while ( (XBYTE[0xA002] & 0x80) != 0 );
}
/*******************************************************************************
函数:LcdOn()
功能:打开LCD显示
*******************************************************************************/
void LcdOn()
{
LcdWaitBusy();
XBYTE[0xA000] = 0x3F;
}
/*******************************************************************************
函数:LcdOff()
功能:关闭LCD显示
*******************************************************************************/
void LcdOff()
{
LcdWaitBusy();
XBYTE[0xA000] = 0x3E;
}
/*******************************************************************************
函数:LcdStartLine()
功能:设置显示起始行
参数:line是行号,取值0~63
*******************************************************************************/
void LcdStartLine(unsigned char line)
{
LcdWaitBusy();
XBYTE[0xA000] = line | 0xC0;
}
/*******************************************************************************
函数:LcdSetP()
功能:设置页地址
参数:page取值0~7
*******************************************************************************/
void LcdSetP(unsigned char page)
{
LcdWaitBusy();
XBYTE[0xA000] = (page & 0x07) | 0xB8;
}
/*******************************************************************************
函数:LcdSetY()
功能:设置Y地址
参数:y取值0~63
*******************************************************************************/
void LcdSetY(unsigned char y)
{
LcdWaitBusy();
XBYTE[0xA000] = (y & 0x3F) | 0x40;
}
/*******************************************************************************
函数:LcdWriteDat()
功能:写显示数据
参数:dat为显示数据
说明:写完后,Y地址自动加1
*******************************************************************************/
void LcdWriteDat(unsigned char dat)
{
LcdWaitBusy();
XBYTE[0xA001] = dat;
}
/*******************************************************************************
函数:LcdReadDat()
功能:读显示数据
返回:读到的数据
*******************************************************************************/
/*
unsigned char LcdReadDat()
{
LcdWaitBusy();
return XBYTE[0xA003];
}
*/
void _LcdClear_()
{
unsigned char p,y;
for ( p=0; p<8; p++ )
{
LcdSetP(p);
LcdSetY(0);
for ( y=0; y<64; y++ )
{
LcdWriteDat(0x00);
}
}
}
//定义光标的横纵坐标
unsigned char LcdCursorX;
unsigned char LcdCursorY;
/*******************************************************************************
函数:LcdGotoXY()
功能:把光标移到(x,y)处
参数:(x,y)为屏幕坐标,x=0~15,y=0~4
*******************************************************************************/
void LcdGotoXY(unsigned char x, unsigned char y)
{
LcdCursorX = x & 0x0F;
LcdCursorY = y & 0x03;
}
/*******************************************************************************
函数:LcdClear()
功能:LCD清屏
*******************************************************************************/
void LcdClear()
{
LCD_CLR_CSA();
_LcdClear_();
LCD_SET_CSA();
LCD_CLR_CSB();
_LcdClear_();
LCD_SET_CSB();
LcdCursorX = 0;
LcdCursorY = 0;
}
/*******************************************************************************
函数:LcdInit()
功能:LCD初始化
*******************************************************************************/
void LcdInit()
{
LCD_SET_CSA();
LCD_SET_CSB();
LcdStartLine(0);
LcdClear();
LcdOn();
}
/*******************************************************************************
函数:LcdPutchar()
功能:在LCD上显示ASCII码
*******************************************************************************/
void LcdPutchar(unsigned char c)
{
unsigned char i;
unsigned char n;
unsigned char code *p;
//检查是否为可显示字符
if ( c < ' ' ) //如果是控制字符
{
if ( c == '\r' ) //如果是回车符
{
LcdCursorX = 0;
}
else if ( c == '\n' ) //如果是换行符
{
LcdCursorY++;
if ( LcdCursorY >= 4 )
{
LcdCursorY = 0;
}
}
return;
}
//计算字符点阵位置
p = ASCII_TAB + (c - ' ') * 16;
//确定显示位置在左半屏还是右半屏
if ( LcdCursorX < 8 )
{
LCD_CLR_CSB();
// x = 0;
}
else
{
LCD_CLR_CSA();
// x = 64;
}
//显示ASCII码
for ( i=0; i<2; i++ )
{
LcdSetP(LcdCursorY*2+i); //设置页地址
LcdSetY(LcdCursorX*8); //设置Y地址
n = 8;
do
{
LcdWriteDat(*p++); //写入显示数据
} while ( --n != 0 );
}
//取消选中
if ( LcdCursorX < 8 )
{
LCD_SET_CSB();
}
else
{
LCD_SET_CSA();
}
//光标移到下个位置
LcdCursorX++;
if ( LcdCursorX >= 16 )
{
LcdCursorX = 0;
LcdCursorY++;
if ( LcdCursorY >= 4 )
{
LcdCursorY = 0;
}
}
}
//显示汉字(小汉字库汉字编码:0x8000~0x80FF)
void LcdPutHZ(unsigned char ch, unsigned char cl)
{
unsigned char i;
unsigned char n;
unsigned char code *p;
UnionInt hz;
hz.CharPart.H = ch;
hz.CharPart.L = cl;
hz.i -= 0x8000;
//计算字符点阵位置
p = HanZi_TAB + hz.i * 32;
//确定显示位置在左半屏还是右半屏
if ( LcdCursorX < 8 )
{
LCD_CLR_CSB();
}
else
{
LCD_CLR_CSA();
}
//显示汉字
for ( i=0; i<2; i++ )
{
LcdSetP(LcdCursorY*2+i); //设置页地址
LcdSetY(LcdCursorX*8); //设置Y地址
n = 16;
do
{
LcdWriteDat(*p++); //写入显示数据
} while ( --n != 0 );
}
//取消选中
if ( LcdCursorX < 8 )
{
LCD_SET_CSB();
}
else
{
LCD_SET_CSA();
}
//光标移到下个位置
LcdCursorX += 2;
if ( LcdCursorX >= 16 )
{
LcdCursorX = 0;
LcdCursorY++;
if ( LcdCursorY >= 4 )
{
LcdCursorY = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -