📄 show.c
字号:
/*
*********************************************************************************************************
*
* 文 件 名 : LCD240160b.c
*
* 作 者 : Aoker
*
* 创建日期 : 2004年12月7日
* 描 述 : LCD的接口驱动函数
* 备 注: 如果显示图形时有阴影的竖状条幅出现可以给液晶的读写命令加大延时.
*
* 版 本 : 1.0
*********************************************************************************************************
*/
#include <REG935.H>
#include"..\SOURCE\general.h"
#include "..\SOURCE\Lcd.h"
#include <math.h>
extern BYTE code ASCII[][16];
bit CS;
/*********************************************************************************************************
* 函数名称: LcdWriteCmd
*
* 功能描述: 向LCD写入指令
*
* 入口参数: bCmd,命令代码
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
static void LcdWriteCmd(BYTE bCmd)
{
RD = 1;
_nop_ ();
_nop_ ();
_nop_ ();
A0 = 1;
_nop_ ();
_nop_ ();
_nop_ ();
P0 = bCmd;//命令代码
_nop_ ();
_nop_ ();
_nop_ ();
CS = 0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
WR = 0;
_nop_ ();
_nop_ ();
_nop_ ();
WR = 1;
_nop_ ();
_nop_ ();
_nop_ ();
CS = 1;
_nop_ ();
_nop_ ();
_nop_ ();
}
/*********************************************************************************************************
* 函数名称: LcdWriteData
*
* 功能描述: 向LCD写入数据
*
* 入口参数: bData,液晶写入数据
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
static void LcdWriteData(BYTE bData)
{
RD = 1;
_nop_ ();
_nop_ ();
_nop_ ();
A0 = 0;
_nop_ ();
_nop_ ();
_nop_ ();
P0 = bData;
_nop_ ();
_nop_ ();
_nop_ ();
CS = 0;
_nop_ ();
_nop_ ();
_nop_ ();
WR = 0;
_nop_ ();
_nop_ ();
_nop_ ();
WR = 1;
_nop_ ();
_nop_ ();
_nop_ ();
CS = 1;
_nop_ ();
_nop_ ();
_nop_ ();
}
/*********************************************************************************************************
* 函数名称: LcdRead
*
* 功能描述: 读出数据或光标地址
*
* 入口参数: 无
*
* 出口参数: 数据或光标地址
*
* 全局变量: 无
*
* 调用模块: 无
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
*-------------------------------------------------------------------------------------------------------
* 修 改 人: Aoker
*
* 说 明: 2004年12月7日的创建的程序读液晶数据不对,造成在显示图形或汉字时,只能在横坐标整除8的位置处才能
* 正确显示,其他位置处显示时会出现竖状的阴影条幅. 改正之后,如果还出现,则可在液晶的读写函数里加
* 大延时即可解决.
*
* 修改时间: 2004年12月10日
********************************************************************************************************/
static BYTE LcdRead(void){
BYTE bStatus;
P0 = 0xff;
_nop_ ();
_nop_ ();
_nop_ ();
RD = 1;
_nop_ ();
_nop_ ();
_nop_ ();
A0 = 1;
_nop_ ();
_nop_ ();
_nop_ ();
CS = 0;
_nop_ ();
_nop_ ();
_nop_ ();
RD = 0;
_nop_ ();
_nop_ ();
_nop_ ();
bStatus = P0;
_nop_ ();
_nop_ ();
_nop_ ();
CS = 1;
_nop_ ();
_nop_ ();
_nop_ ();
RD = 1;
_nop_ ();
_nop_ ();
_nop_ ();
return(bStatus);
}
/*********************************************************************************************************
* 函数名称: LcdInit
*
* 功能描述: LCD初始化
*
* 入口参数: 无
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: LcdWriteCmd(),
* LcdWriteData(),
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
void LcdInit(void)
{
BYTE i;
const BYTE SYSTAB[8] = {0x30,0x87,0x07,0x1D,0x42,0x9f,0x1e,0x00};
const BYTE SCRTAB[8] = {0x00,0x00,0xA0,0xC0,0x12,0xA0,0x80,0x25};
LcdWriteCmd(0x40);
for(i=0; i<8; i++)
{
LcdWriteData(SYSTAB[i]);
}
LcdWriteCmd(0x44);
for(i=0; i<8; i++)
{
LcdWriteData(SCRTAB[i]);
}
LcdWriteCmd(0x5A);
LcdWriteData(0x00);
LcdWriteCmd(0x5B);
LcdWriteData(0x0C);
LcdWriteCmd(0x59);
LcdWriteData(0x04);
}
/*********************************************************************************************************
* 函数名称: LcdClr
*
* 功能描述: 清除整个LCD屏幕
*
* 入口参数: 无
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: LcdWriteCmd(),
* LcdWriteData(),
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
void LcdClr(void)
{
BYTE i, j;
LcdWriteCmd(0x4C);
LcdWriteCmd(0x46);
LcdWriteData(0x00);
LcdWriteData(0x00);
LcdWriteCmd(0x42);
for(i=0; i<90; i++)
{
for(j=0; j<80; j++)
{
LcdWriteData(0x00);
}
}
}
/*********************************************************************************************************
* 函数名称: LcdDraw
*
* 功能描述: 在位置(bx, by)处显示点阵为(bWidth x bHeight)大小的图形
*
* 入口参数: bx, 行坐标,取值范围为0~239
* by, 列坐标,取值范围为0~159
* bWidth, 图形的宽度
* bHeight, 图形的高度
* Attr, 图形显示的属性,"1"-反白显示; "0"-正常显示
* ptr, 指向图形的字模数据
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: LcdWriteCmd(),
* LcdWriteData(),
* LcdRead()
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
void LcdDraw(BYTE bx, BYTE by, BYTE bWidth, BYTE bHeight, bit Attr, BYTE* ptr)
{
BYTE i, j, k, tt=0;
BYTE uu=0, rr=0, ee=0, ff=0, gg=0;
WORD l;
tt = bx%8;
bx = bx/8;
l = by*ap + bx; //ap = 0x1e
bx = (BYTE)(l&0x00ff);
by = (BYTE)((l&0xff00)>>8);
LcdWriteCmd(0x4C);
for(i=0; i<bHeight; i++)
{
LcdWriteCmd(0x46);
LcdWriteData(bx);
LcdWriteData(by);
if(tt==0)
{
LcdWriteCmd(0x42);
for(j=0; j<bWidth/8; j++)
{
if(Attr)
LcdWriteData(~(*ptr));
else
LcdWriteData(*ptr);
ptr++ ;
}
}
else
{
for(j=0;j<bWidth/8;j++)
{
LcdWriteCmd(0x43);
uu = LcdRead();
rr = LcdRead();
if(Attr)
gg=~(*ptr);
else
gg = *ptr;
ptr++;
k = uu>>(8-tt);
k = k<<(8-tt);
ee = k;
k = gg>>tt;
ee = ee|k;
k = rr<<tt;
k = k>>tt;
ff = k;
k = gg<<(8-tt);
ff = ff|k;
LcdWriteCmd(0x4d);
LcdWriteCmd(0x43);
LcdRead();
LcdRead();
LcdWriteCmd(0x4C);
LcdWriteCmd(0x42);
LcdWriteData(ee);
LcdWriteData(ff);
LcdWriteCmd(0x4d);
LcdWriteCmd(0x43);
LcdRead();
LcdRead();
LcdWriteCmd(0x4c);
LcdWriteCmd(0x43);
LcdRead();
}
}
l=(ap+bx+(by<<8));
bx=(BYTE)(l&0x00ff);
by=(BYTE)((l&0xff00)>>8);
}
}
*/
/*********************************************************************************************************
* 函数名称: LcdDraw16
*
* 功能描述: 在位置(bx, by)处显示固定点阵大小(16 x 16)的图形
*
* 入口参数: bx, 行坐标,取值范围为0~239
* by, 列坐标,取值范围为0~159
* Attr, 图形显示的属性,"1"-反白显示; "0"-正常显示
* ptr, 指向图形的字模数据
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: LcdWriteCmd(),
* LcdWriteData(),
* LcdRead()
*
* 作 者: Aoker
* 创建时间: 2004年12月7日
********************************************************************************************************/
void LcdDraw16(BYTE bx, BYTE by, bit Attr, BYTE* ptr)
{
BYTE i, j, k, tt=0;
BYTE uu=0, rr=0, ee=0, ff=0, gg=0;
WORD l;
tt = bx%8;
bx=bx/8;
l = by*ap + bx;
bx = (BYTE)(l&0x00ff);
by = (BYTE)((l&0xff00)>>8);
LcdWriteCmd(0x4C);
for(i=0; i<16; i++)
{
LcdWriteCmd(0x46);
LcdWriteData(bx);
LcdWriteData(by);
if(tt==0)
{
LcdWriteCmd(0x42);
for(j=0; j<2; j++)
{
if(Attr)
LcdWriteData(~(*ptr));
else
LcdWriteData(*ptr);
ptr++ ;
}
}
else
{
for(j=0;j<2;j++)
{
LcdWriteCmd(0x43);
uu = LcdRead();
rr = LcdRead();
if(Attr)
gg=~(*ptr);
else
gg = *ptr;
ptr++;
k = uu>>(8-tt);
k = k<<(8-tt);
ee = k;
k = gg>>tt;
ee = ee|k;
k = rr<<tt;
k = k>>tt;
ff = k;
k = gg<<(8-tt);
ff = ff|k;
LcdWriteCmd(0x4d);
LcdWriteCmd(0x43);
LcdRead();
LcdRead();
LcdWriteCmd(0x4C);
LcdWriteCmd(0x42);
LcdWriteData(ee);
LcdWriteData(ff);
LcdWriteCmd(0x4d);
LcdWriteCmd(0x43);
LcdRead();
LcdRead();
LcdWriteCmd(0x4c);
LcdWriteCmd(0x43);
LcdRead();
}
}
l=(ap+bx+(by<<8));
bx=(BYTE)(l&0x00ff);
by=(BYTE)((l&0xff00)>>8);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -