📄 lcd.c
字号:
/*************************************************/
/**************液晶显示屏*******************/
/***************2003年1月20日*******************/
/************WROTE BY WANGSW********************/
#include <absacc.h> /*XBYTE绝对外部内存空间头文件*/
#include <string.h>
#include <intrins.h>
#include "define.h"
#include "ascii.h"
#include "lcd.h"
#ifdef DP_51
#define WLCD XBYTE[0xF800] /*r定义WLCD为写LCD的内容*/
#define RLCD XBYTE[0xF801] /*r定义RLCD为读LCD的内容*/
#define RS XBYTE[0xF802] /*对于TG19264A1,RS=0为命令,RS=1为数据*/
#endif
#ifdef TG19264
#define MAX_COLUMN 64
#define MAX_PAGE 8
#endif
#define SendCtr(value) RS = 0; RS = 0; WLCD = value;
#define SendData(value) RS = 1; RS = 1; WLCD = value;
/*******************************************************************/
//static void SendCtr(byte value);
//static void SendData(byte value);
static void SetPage(byte value);
static void SetColumn(byte value);
static void InitTg19264(void);
/******************************************************************************************
*函数名: SetPage
*参数: value 设置的页码值,从0~7有效
*返回值: 无
*描述: 对于TG19264液晶屏,设置当前操作的页码值
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
static void SetPage(byte value)
{
#ifdef TG19264
SendCtr(0xB8 + value);
#endif
}
/******************************************************************************************
*函数名: SetColumn
*参数: value 设置的X坐标位置,从0~63有效
*返回值: 无
*描述: 设置当前液晶屏操作的X坐标位置
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
static void SetColumn(byte value)
{
#ifdef TG19264
SendCtr(0x40 + value);
#endif
}
/******************************************************************************************
*函数名: InitTg19264
*参数: 无
*返回值: 无
*描述: 初始化液晶屏Tg19264,对液晶屏从DDRAM中哪一行开始显示数
据以及设置初始的页码值和X坐标位置
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
static void InitTg19264(void)
{
SendCtr(0xC0); /*起始显示DDRAM行(D5-D0)为第0行*/
SendCtr(0xB8); /*起始页位置(D2-D0)为第0页*/
SendCtr(0x40); /*X方向起始位置(D5-D0)为0*/
}
/******************************************************************************************
*函数名: lcd_init
*参数: 无
*返回值: 无
*描述: 液晶屏初始化程序,主要是清屏,开显示
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_init(void)
{
#ifdef TG19264
InitTg19264();
#endif
lcd_clear();
SendCtr(0x3F); /*显示ON/OFF D0*/
}
/******************************************************************************************
*函数名: lcd_clear
*参数: 无
*返回值: 无
*描述: LCD清屏程序
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_clear(void)
{
byte page;
byte column;
for(page = 0; page < MAX_PAGE; page++)
{
RS = 0; /*r发送命令*/
WLCD = 0xB8 + page; /*r设置清空的页码*/
_nop_();
WLCD = 0x40; /*r设置清空的X坐标起始位置为0*/
_nop_();
RS = 1; /*r发送数据*/
_nop_();
for(column = 0; column < MAX_COLUMN; column++)
{
WLCD = 0x00; /*r相应显示寄存器清零*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/******************************************************************************************
*函数名: lcd_display_graphic
*参数: XStart X轴起始位置,为像素点位置
YStart Y轴起始位置,为像素点位置
Width 图像宽度像素值
Height 图像高度像素值
bReverseDisplay 标识是否反显
GraphicIndex 图像显示索引
*返回值: 无
*描述: 显示一幅图像的程序
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_display_graphic( /*为整个PAGE显示,不能任意位置*/
byte XStart,
byte YStart,
byte Width,
byte Height,
bool bReverseDisplay,
byte GraphicIndex)
{
byte PageCounter; /*页计数值*/
byte ColumnCounter; /*X位置计数值*/
byte PageStart; /*起始页码*/
byte PageEnd; /*终止页码*/
byte code *pGraphic; /*指向发送显示数据的指针*/
pGraphic = g_Graphic[GraphicIndex]; /*r取出要显示的图像区头地址给指针pGraphic*/
PageStart = YStart >> 3; /*r由于是整页显示,不能随意位置,所以指定除8*/
PageEnd = (YStart + Height) >> 3;
for(PageCounter = PageStart; PageCounter < PageEnd; PageCounter++)
{
SetColumn(XStart);
SetPage(PageCounter);
RS = 1;
for(ColumnCounter = 0; ColumnCounter < Width; ColumnCounter++)
{
if(!bReverseDisplay)
{
WLCD = *pGraphic++; /*r正常显示,白屏黑字*/
}
else
{
WLCD = ~(*pGraphic++); /*r反转显示,黑屏白字*/
}
}
}
}
/******************************************************************************************
*函数名: lcd_display_char
*参数: XStart 开始显示的X坐标像素值
YStart 开始显示的Y坐标像素值
bReverseDisplay 标识是否反显,1为反显,0为不反显
character 显示字符的ASCII码表值
*返回值: 无
*描述: 字符显示程序
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_display_char( /*为整个PAGE显示,不能任意位置*/
byte XStart,
byte YStart,
bool bReverseDisplay,
byte character)
{
byte PageCounter; /*页标志*/
byte ColumnCounter; /*X位置标志*/
byte PageStart; /*起始页码*/
byte PageEnd; /*终止页码*/
byte code *pChar; /*指向字符存放数据(按page划分存储)区的指针*/
pChar = g_ASCII[character-0x20]; /*r根据ASCI码表,*/
PageStart = YStart >> 3; /*r由于是整页显示,不能随意位置,所以指定除8*/
PageEnd = PageStart + 2; /*r一个字符在纵向占两个page*/
for(PageCounter = PageStart; PageCounter < PageEnd; PageCounter++)
{
SetColumn(XStart);
SetPage(PageCounter);
RS = 1;
for(ColumnCounter = 0; ColumnCounter < 8; ColumnCounter++) /*r一个字符在横向占8列*/
{
if(!bReverseDisplay)
{
WLCD = *pChar++;
}
else
{
WLCD = ~(*pChar++);
}
}
}
}
/******************************************************************************************
*函数名: lcd_display_text
*参数: XStart 字符串开始X坐标像素值
YStart 字符串开始Y坐标像素值,实际得按照page显示
bReverseDisplay 标识是否反显
pText 指向字符串ASCII码存放首址的指针
*返回值: 无
*描述: 显示小于8个字符的字符串文本
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_display_text( byte XStart,
byte YStart,
bool bReverseDisplay,
byte* pText)
{
byte i;
byte len;
len = strlen(pText);
if(len > 8)
{
len = 8;
}
for(i = 0; i < len; i++)
{
lcd_display_char(XStart + i * 8, YStart, bReverseDisplay, *pText++);
}
}
/******************************************************************************************
*函数名: lcd_display_byte
*参数: XStart
YStart
bHex 标识是否为十六进制数据
bReverseDisplay 标识是否反显
value
*返回值: 无
*描述: 在LCD液晶屏上显示一个字节的内容,若此字节中数标识用
十六进制显示,则其中字节的高四位为 一个字符的ASCII码
值,低四位又是另外一个字符的ASCII码字
*编写:王绍伟
*版本信息:V1.0 2003年8月15日
******************************************************************************************/
extern void lcd_display_byte(byte XStart,
byte YStart,
bool bHex,
bool bReverseDisplay,
byte value)
{
byte Shift; /*暂存余数*/
byte Result; /*暂存除得结果值*/
if(bHex)
{
lcd_display_char(XStart + 8, YStart, bReverseDisplay, g_Data2Char[value&0x0F]);
lcd_display_char(XStart, YStart, bReverseDisplay, g_Data2Char[value>>4]);
}
else
{
Shift = value % 100;
Result = value / 100;
if(Result)
{
lcd_display_char(XStart, YStart, bReverseDisplay, g_Data2Char[Result]);
}
Result = Shift / 10;
Shift = Shift % 10;
if(Result)
{
lcd_display_char(XStart + 8, YStart, bReverseDisplay, g_Data2Char[Result]);
}
lcd_display_char(XStart + 16, YStart, bReverseDisplay, g_Data2Char[Shift]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -