📄 lcdfile.c
字号:
/**************************************************************************
* dat1: 第一参数单元
* dat2: 第二参数单元
* com: 指令代码单元
* com_addr: 指令通道地址
* data_addr: 数据通道地址
**************************************************************************/
//#include "lcdfile.h"
#ifndef _register
#define _register
ioport unsigned port0019;
#define c_addr port0019
ioport unsigned port0018;
#define d_addr port0018
#endif
#ifndef bool
#define bool unsigned short
#define FALSE 0
#define TRUE 1
#endif
void wr_data(unsigned int dat1);
void wr_data1(unsigned int dat1);
void wr_com(unsigned int com);
void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian);
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian);
void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag);
void getASC(unsigned int apcode, unsigned int *ptr);
void getASC(unsigned int apcode, unsigned int *ptr);
extern void GUILCD_init(void);
extern void GUILCD_clear(void);
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column,unsigned char *cString,bool fanxian);
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian);
extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column);
extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column);
extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag);
extern void GUILCD_onLed(void);
extern void GUILCD_offLed(void);
/***************************************************************************
* 函数: void wr_data(unsigned int data)
* 目的: 写LCD数据参数,判断0和1位
* 输入: data 参数单元
* 输出: 无
***************************************************************************/
void wr_data(unsigned int dat1)
{
unsigned int status;
do
{
status = c_addr;
status = status & 0x03;
}while(status != 0x03);
d_addr = dat1;
dat1 = 0;
}
/***************************************************************************
* 函数: void wr_data1(unsigned int data)
* 目的: 写LCD数据参数,判断3位
* 输入: data 参数单元
* 输出: 无
***************************************************************************/
void wr_data1(unsigned int dat1)
{
unsigned int status;
do
{
status = c_addr;
status = status & 0x08;
}while(status != 0x08);
d_addr = dat1;
}
/***************************************************************************
* 函数: void wr_com0(WORD com)
* 目的: 写LCD指令参数
* 输入: com 指令单元
* 输出: 无
***************************************************************************/
void wr_com(unsigned int com)
{
unsigned int status;
do
{
status = c_addr;
status = status & 0x03;
}while(status != 0x03);
c_addr = com;
}
/***************************************************************************
* 函数: extern void GUILCD_init(void)
* 目的: 初始化LCD显示,设置显示方式为图形方式,开显示
* 输入: 无
* 输出: 无
****************************************************************************/
extern void GUILCD_init(void)
{
wr_data(0x00); /*设置图形显示区域首地址*/
wr_data(0x00); /*或为文本属性区域首地址*/
wr_com(0x42);
wr_data(0x20); /*设置图形显示区域宽度*/
wr_data(0x00); /*或为文本属性区域宽度*/
wr_com(0x43);
wr_com(0xa0); /*光标形状设置*/
wr_com(0x81); /*显示方式设置,逻辑或合成*/
wr_com(0x9b); /*显示开关设置,仅文本开显示*/
}
/***************************************************************************
* 函数: extern void GUILCD_clear(void)
* 目的: 清LCD屏,用自动方式,将LCD屏清为白屏
* 输入: 无
* 输出: 无
***************************************************************************/
extern void GUILCD_clear(void)
{
int page0;
wr_data(0x00); /*设置显示RAM首地址*/
wr_data(0x00);
wr_com(0x24);
wr_com(0xb0); /*设置自动写方式*/
for(page0 = 0x2000; page0 >= 0; page0--)
{
wr_data1(0x00);
}
wr_com(0xb2);
}
/***************************************************************************
* 函数: void wr_letter(WORD code,WORD attr,WORD o_y,WORD o_x)
* 目的: 写字母
* 输入: code 代码
attr 属性
o_y y坐标
o_x x坐标
* 输出: 无
***************************************************************************/
void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
{
unsigned int i1,dat1_temp,dat2_temp;
unsigned int asc_code[32];
int i2;
i1 = o_y * 0x20;
i1 = i1 + o_x;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
getasc(code,&asc_code[0]);
if(fanxian == TRUE)
{
for(i2 = 0; i2 < 32; i2++)
{
asc_code[i2] = (~asc_code[i2]) & 0xff;
}
}
for(i2 = 0; i2 < 16; i2++)
{
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(asc_code[2*i2]);
wr_com(0xc0);
wr_data(asc_code[2*i2+1]);
wr_com(0xc0);
i1 = i1 + 0x20;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
}
}
/***************************************************************************
* 函数: void wr_hex(WORD code,WORD o_y,WORD o_x,unsigned int fanxian)
* 目的: 写字母
* 输入: code 代码
o_y y坐标
o_x x坐标
fanxian 反显 0:无 1:反显
* 输出: 无
***************************************************************************/
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
{
unsigned int dat1_temp,dat2_temp;
unsigned int *code_temp;
int i1,i2,code_temp1;
unsigned int hanzi_conv[16];
unsigned int hex_code[32];
code_temp1 = (code >> 8) & 0xff;
code_temp1 = code_temp1 - 0xa1;
code_temp1= code_temp1 * 94;
code_temp1 = code_temp1 + (code & 0xff);
code_temp1 = code_temp1 - 0xa1;
// code_temp1 = 0x0;
gethz(code_temp1,&hanzi_conv[0]);
for(i2 = 0; i2 < 16; i2++)
{
if(fanxian == FALSE)
{
hex_code[i2+0] = (hanzi_conv[i2] >> 8) & 0xff;
hex_code[i2+16] = hanzi_conv[i2] & 0xff;
}
else
{
hex_code[i2+0] = ~(hanzi_conv[i2] >> 8);
hex_code[i2+0] = hex_code[i2+0] & 0xff;
hex_code[i2+16] = (~hanzi_conv[i2]) & 0xff;
}
}
i1 = o_y * 0x20;
i1 = i1 + o_x;
dat1_temp = i1 & 0xff;
dat1_temp = dat1_temp ;
dat2_temp = (i1>>8) & 0xff;
dat2_temp = dat2_temp;
code_temp = &hex_code[0];
for(i2 = 0; i2 < 16 ; i2++)
{
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(*code_temp);
wr_com(0xc0);
wr_data(*(code_temp + 0x10));
wr_com(0xc0);
code_temp++;
i1 = i1 + 0x20;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
}
}
/***************************************************************************
* 函数: extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data);
* 目的: 写字母
* 输入: code 代码
o_y y坐标
o_x x坐标
* 输出: 无
***************************************************************************/
void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag)
{
int i,dat1_temp,dat2_temp,temp,temp1;
// i = o_y & 0x7f;
i = o_y * 0x20;
dat1_temp = i & 0xff;
dat2_temp = (i >> 8) & 0xff;
temp = o_x / 8;
dat1_temp = dat1_temp + temp;
temp1 = o_x - (temp * 8);
temp1 = 7 - temp1;
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
if(flag == 1)
{
wr_com(0xf8 | temp1);
}
else
{
wr_com(0xf0 | temp1);
}
}
/***************************************************************************
* 函数: void hex_convert(char *string,unsigned int o_y,unsigned o_x)
* 目的: 写汉字字符串,将函数传递的字符串放在LCD屏的o_x和o_y坐标处的位置显示
自动写屏,直到字符串尾,判断为0停止。根据变量fanxi是否为0,
决定当前字符串是否反显。显示位置从LCD屏的o_x和o_y坐标处开始,
为行显示,o_y不变,o_x加1变化。
* 输入: string 代码字符串
o_y y坐标,范围(0到7),代表8行16*16点阵
o_x x坐标,范围(0到14),代表14列16*16点阵
fanxian 反显 0:无 非0:反显
* 输出: 无
***************************************************************************/
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian)
{
unsigned int ii1,ii4;
ii4 = 0;
ii1 = *cString;
while(ii1 != 0)
{
/* ii4++;
ii2 = ii1 << 8;
ii2 = ii2 & 0xff00;
ii3 = *(cString + ii4);
ii3 = ii3 & 0xff;
ii2 = ii2 | ii3;*/
wr_hex(ii1,Row*0x10,Column*2,fanxian);
Column++;
ii4++;
ii1 = *(cString + ii4);
}
}
/***************************************************************************
* 函数: void zimu_convert(char *string,unsigned int o_y,unsigned o_x)
* 目的: 写ASC码字符串,16*16点阵格式,将字符串string中的ASC码在LCD屏的
o_x和o_y坐标处显示,连续显示,直到字符串string串尾为0,o_y保持
不变,o_x加1。
* 输入: string 代码字符串
o_y y坐标,范围(0到7),代表8行16*16点阵
o_x x坐标,范围(0到14),代表14列16*16点阵
* 输出: 无
***************************************************************************/
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned char *cString,bool fanxian )
{
unsigned int iii1,iii2;
iii2 = 0;
iii1 = *cString;
while(iii1 != 0)
{
iii2++;
wr_letter(iii1,Row*0x10,Column*2,fanxian);
Column++;
iii1 = *(cString + iii2);
}
}
/***************************************************************************
* 函数: void wr_cursor(unsigned int o_y,unsigned o_x)
* 目的: 写光标
* 输入: o_y y坐标
o_x x坐标
* 输出: 无
***************************************************************************/
extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column)
{
unsigned int i1,dat1_temp,dat2_temp;
Row = Row * 0x10;
Column = Column * 2;
i1 = Row * 0x20;
i1 = i1 + Column + 0x1e0;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(0xff);
wr_com(0xc0);
wr_data(0xff);
wr_com(0xc0);
}
/***************************************************************************
* 函数: void cr_cursor(unsigned int o_y,unsigned o_x)
* 目的: 清光标,光标地址为o_y(y轴),o_x(x轴)
* 输入: o_y y坐标(范围:0到7,代表8行汉字)
o_x x坐标(范围:0到14,代表15列汉字)
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column)
{
unsigned int i1,dat1_temp,dat2_temp;
Row = Row * 0x10;
Column = Column * 2;
i1 = Row * 0x20;
i1 = i1 + Column + 0x1e0;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(0x00);
wr_com(0xc0);
wr_data(0x00);
wr_com(0xc0);
}
/***************************************************************************
* 函数: extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data)
* 目的: 描点
* 输入: Column y坐标原点(范围:0到127,代表128行点)
Row x坐标(范围:0到239,代表240列点)
*Data 数据,函数表达式为y=f(x),y为y轴,x为x轴
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag)
{
int i,x,y;
for(i = 0; i < 240 - Column; i++)
{
x = Column + i;
y = Row - *(Data + i);
wr_dot(y,x,flag);
}
}
/***************************************************************************
* 函数: extern void GUILCD_onLed(void)
* 目的: 开背光灯
* 输入: 无
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_onLed(void)
{
asm(" ssbx XF");
}
/***************************************************************************
* 函数: extern void GUILCD_offLed(void)
* 目的: 关背光灯
* 输入: 无
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_offLed(void)
{
asm(" rsbx XF");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -