资源描述
.
//***************************************************************
//连线表: CPU=W78E54B CPUClock=12Mhz *
// LCM ----- CPU *
// WR ----- WR *
// RD ----- RD *
// CS ----- P2.7 *
// A0(RS)----- P2.0 *
// DB0~7 ----- P0.0~7 *
// RESET ----- P1.0 *
// 注:本程序BUS总线模式程序和IO模式程序的硬件连线方式一致 *
// 但IO模式的时候需要在P0口接10K上拉电阻 *
//***************************************************************
#include <reg52.h>
#include <intrins.h>
#include <UserDef.h> //自己些的一个头文件,主要是Uchar和二进制
#define Graphic 1
#define TXT 0
#define LcmXPixel 240 //横向宽度
#define LcmYPixel 128 //纵向高度
#define Uchar unsigned char
#define Uint unsigned int
//#define BUS_MODE //总线模式驱动液晶
#define IO_MODE //IO口模式驱动液晶
#ifdef BUS_MODE
char xdata LcmCmdPort _at_ 0x0100; //CS低有效 RS高--命令
char xdata LcmDatPort _at_ 0x0000; //CS低有效 RS低--数据
#endif
#ifdef IO_MODE
sbit CSP = P2^7;
sbit RSP = P2^0;
sbit WRP = P3^6;
sbit RDP = P3^7;
#define LcmDataBus P0
#endif
sbit RES = P1^0; //
sbit Key = P3^2; //
sbit p0_dr=P3^4; //坚鸿测试架增加指令,控制P0口输入输出
sbit FS = P3^5; //字体选择,一般在硬件接口直接接电源或地
sbit P33=P3^3;
Uchar code str0[];
精选文档
.
Uchar code bmp1[];
void int_zhongduan();
void delay(unsigned int t);
//***************************************************************
//液晶驱动底层程序开始
//***************************************************************
//指令&数据读写状态
void CheckRWCD(void)
{
#ifdef BUS_MODE
while((LcmCmdPort & 0x03) != 0x03); //低电平忙
#endif
#ifdef IO_MODE
p0_dr=1;//坚鸿测试架增加指令,控制P0口输入输出
CSP = 0;
WRP = 1;
RSP = 1;
LcmDataBus = 0xff;
RDP = 0;
while((LcmDataBus & 0x03) != 0x03);
RDP = 1;
CSP = 1;
p0_dr=0;//坚鸿测试架增加指令,控制P0口输入输出
#endif
}
//数据自动写状态
void CheckAutoWrite(void)
{
#ifdef BUS_MODE
while((LcmCmdPort & 0x08) == 0); //低电平忙
#endif
#ifdef IO_MODE
p0_dr=1;//坚鸿测试架增加指令,控制P0口输入输出
CSP = 0;
WRP = 1;
RSP = 1;
LcmDataBus = 0xff;
RDP = 0;
while((LcmDataBus & 0x08) ==0 );
RDP = 1;
精选文档
.
CSP = 1;
p0_dr=0;//坚鸿测试架增加指令,控制P0口输入输出
#endif
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{
#ifdef BUS_MODE
while(LcmCmdPort & 0x40); //1出错,0正确
#endif
#ifdef IO_MODE
p0_dr=1;//坚鸿测试架增加指令,控制P0口输入输出
CSP = 0;
WRP = 1;
RSP = 1;
LcmDataBus = 0xff;
RDP = 0;
while(LcmDataBus & 0x40);
RDP = 1;
CSP = 1;
p0_dr=0;//坚鸿测试架增加指令,控制P0口输入输出
#endif
}
//一个数据子写入函数
void LcmWriteData(Uchar uData)
{
#ifdef BUS_MODE
LcmDatPort = uData;
#endif
#ifdef IO_MODE
CSP = 0;
RDP = 1;
RSP = 0;
LcmDataBus = uData;
WRP = 0;
WRP = 1;
CSP = 1;
LcmDataBus = 0xff;
#endif
}
精选文档
.
//一个数据读出函数
Uchar LcmReadData( void )
{
Uchar uData;
#ifdef BUS_MODE
uData = LcmDatPort;
#endif
#ifdef IO_MODE
p0_dr=1;//坚鸿测试架增加指令,控制P0口输入输出
CSP = 0;
WRP = 1;
RSP = 0;
LcmDataBus = 0xff;
RDP = 0;
uData = LcmDataBus;
RDP = 1;
CSP = 1;
p0_dr=0;//坚鸿测试架增加指令,控制P0口输入输出
#endif
return uData;
}
//无参数指令写入函数
void LcmWriteCommand(Uchar Command)
{
CheckRWCD(); //检测指令读写状态
#ifdef BUS_MODE
LcmCmdPort = Command;
#endif
#ifdef IO_MODE
CSP = 0;
RDP = 1;
RSP = 1;
LcmDataBus = Command;
WRP = 0;
WRP = 1;
CSP = 1;
LcmDataBus = 0xff;
#endif
精选文档
.
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(Uchar Parameter,Uchar Command)
{
LcmWriteData(Parameter);
LcmWriteCommand(Command);
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(Uchar Parameter1,Uchar Parameter2,Uchar Command)
{
LcmWriteData(Parameter1);
LcmWriteData(Parameter2);
LcmWriteCommand(Command);
}
//LCM初始化函数
void LcmInit( void )
{
LcmWriteCommandWith2Par(0x00,0x00,0x40); //设置文本显示区首地址
LcmWriteCommandWith2Par(LcmXPixel/8,0x00,0x41); //设置文本显示区宽度
LcmWriteCommandWith2Par(0x00,0x08,0x42); //设置图形显示区首地址0x0800
LcmWriteCommandWith2Par(LcmXPixel/8,0x00,0x43); //设置图形显示区宽度
LcmWriteCommand(0xA7); //设置光标形状 8x8方块
LcmWriteCommand(0x81); //显示方式设置 文本xor图形(异或)
LcmWriteCommand(0x9C); //显示开关设置 文本开,图形开,光标闪烁关
}
//函数功能: 延时函数
//入口参数: 需要延时的毫秒数(MS)
//出口参数: 无
void DelayMS(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0)
{
usn = 2; //for 12M
while(usn!=0)
{
us=0xf6;
while (us!=0){us--;};
usn--;
}
精选文档
.
MS--;
}
}
//函数功能: 特殊延时函数
//入口参数: 需要延时的?.?秒(Second.MS100)
//出口参数: 无
void DelayKey(unsigned int Second , unsigned int MS100)
{ //输入精确到0.1S,是用,
unsigned int i;
for(i=0;i<Second*100+MS100*10;i++)
{
if(Key==0)
{
DelayMS(20);
while(Key==0) {DelayMS(20);}
break;
}
else DelayMS(10);
}
}
//清显示存储器函数
void LcmClear( Uchar FillByte )
{
Uint i = 8192; //此处仅清8K RAM,如果您32K RAM都使用,请修改i=32768(后面也要改)
if(FillByte) //注意如果填充ff时,如果RAM仅使用了8K,那么8192次会写入到文本区
{ //会形成乱码.(24064出厂时候默认将R7断开,即默认使用8KRAM)
i -= 2*1024;//所以如果填入ff时候要扣除2K的文本区
LcmWriteCommandWith2Par(0x00,0x08,0x24); //填充0xff时候要在图形区
}
else
LcmWriteCommandWith2Par(0x00,0x00,0x24);
LcmWriteCommand(0xB0); //进入自动写
while(i--)
{
CheckAutoWrite();
LcmWriteData( FillByte );
}
LcmWriteCommand(0xB2); //退出自动写
}
精选文档
.
//设定显示地址函数
void LocateXY(Uchar x,Uchar y,Uchar mode)
{
Uint temp;
temp= LcmXPixel/8*y + x;
if(mode) //mode=1为Graphic
{ //如果图形模式要加上图形区首地址0x0800
temp+=0x0800;
}
LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//显示一个ASCII码函数
void PutChar(Uchar x,Uchar y,Uchar CharByte)
{
LocateXY(x,y,TXT);
LcmWriteCommandWith1Par(CharByte-0x20,0xC4); //内部带的英文字库是从0x00开始,也就是说空格0x20的字库值是0x00,所以-0x20
}
//显示一个字符串函数
void PutString(Uchar x,Uchar y,Uchar *str)
{
while(*str != 0)
{
if(x> (LcmXPixel/8-1)) //自动换行
{
x=0;
y++;
}
PutChar(x,y,*str);
++x;
++str;
}
}
//显示一副图片函数
void PutBmp(Uchar *puts)
{
Uchar i,j;
Uint X=0;
LocateXY(0,0,Graphic);
LcmWriteCommand(0xB0); //进入自动写
for(i=0;i<LcmYPixel;i++)
精选文档
.
{
for(j=0;j<LcmXPixel/8;j++)
{
CheckAutoWrite();
LcmWriteData(puts[X]);
X++;
}
}
LcmWriteCommand(0xB2); //退出自动写
}
//反显一副图片函数
void ReverseOneBmp( void )
{ //利用数据一次读写操作
Uchar i,j,X; //只能对一段RAM取反
LocateXY(0,0,Graphic);
for(i=0;i<LcmYPixel;i++)
{
for(j=0;j<LcmXPixel/8;j++)
{
LcmWriteCommand(0xC5); //读数据,地址不变
CheckRWCD();
X = LcmReadData();
X = ~X;
LcmWriteCommandWith1Par(X,0xC0);
}
}
}
//屏读功能演示
void ScreenReadDemo( void )
{ //利用屏读
//能对当前屏幕反显,包括合成内容(本函数仅读文本到图形)
//但是写入后的内容都在图形区
//可以将文本区内容读出以图形方式写到图形区
Uchar i,j,X;
//使用屏读屏考时候必须设置宽度为40(硬件已决定)
//所以如确定要用到屏读屏考的话最后初始化时就设40
LcmWriteCommandWith2Par(0x28,0x00,0x41); //设置文本显示区宽度=40
LcmWriteCommandWith2Par(0x28,0x00,0x43); //设置图形显示区宽度=40
PutString(0,0,str0); //0,0不会受到宽度改变的影响
for(i=0;i<8;i++) //屏读较慢,就以一行文本做演示
{
精选文档
.
LcmWriteCommandWith2Par((0x28*i+0x800)&0xff,(0x28*i+0x800)/256,0x24);
for(j=0;j<LcmXPixel/8;j++)
{
LcmWriteCommand(0xE0);
CheckScreen();
CheckRWCD();
X = LcmReadData();
X = ~X;
LcmWriteCommandWith1Par(X,0xC0);
}
}
//屏读需要一点时间,运行速度比较慢,运行过程中由于文本图形互补的关系,屏幕全黑
LcmWriteCommand(0x98); //关闭文本区看显示效果,会在图形显示区显示一样的字符串
DelayKey(1,0);
LcmWriteCommand(0x9C); //恢复文本区显示
LcmWriteCommandWith2Par(LcmXPixel/8,0x00,0x41); //宽度改回原值
LcmWriteCommandWith2Par(LcmXPixel/8,0x00,0x43);
LcmClear(0); //清屏
}
//显示点阵子函数
void PutDots(Uchar DotByte,Uchar n)
{
Uchar i,j;
LocateXY(0,0,Graphic);
LcmWriteCommand(0xB0); //进入自动写
for(i=0;i<LcmYPixel/n;i++)
{
for(j=0;j<LcmXPixel/8*n;j++)
{
CheckAutoWrite();
LcmWriteData(DotByte);
}
DotByte=~DotByte;
}
LcmWriteCommand(0xB2); //退出自动写
}
//主函数
void main(void)
{
Uchar i;
p0_dr=0;//坚鸿测试架增加指令,控制P0口输入输出
精选文档
.
int_zhongduan();
FS = 0;
RES = 0;
DelayMS(100);
RES = 1;
DelayMS(20);
LcmInit();
LcmClear(0);
while(1)
{
PutBmp(bmp1); //显示一副图片
DelayKey(1,0);
ReverseOneBmp(); //反显当前图片
DelayKey(1,0);
LcmClear(0); //清屏,此处不清屏且同时打开文本和图形可观察文本xor图形的显示效果
LcmWriteCommand(0x94); //仅开文本,关图形,这种情况下有可能英文字库出现错误
for(i=0;i<(LcmYPixel/8);i++) //显示一屏字符串
PutString(0,i,str0);
DelayKey(0,5);
LcmWriteCommand(0x9C); //开文本图形
DelayKey(0,5);
LcmClear(0);
LcmClear(0xff); //全黑检测
DelayKey(1,0);
ScreenReadDemo(); //屏读演示,函数内包含了延时
PutDots(0x55,1);
DelayKey(1,0);
PutDots(0xaa,1);
DelayKey(1,0);
PutDots(0x33,2);
DelayKey(1,0);
PutDots(0xcc,2);
DelayKey(1,0);
PutDots(0xF0,4);
DelayKey(1,0);
PutDots(0x0F,4);
DelayKey(1,0);
}
}
精选文档
.
//代码区
Uchar code str0[]="ShenZhen SunSon Electronic INC"; //减去0x20即可
Uchar code bmp1[]={
//********************************************************//
//***** 转换的文件:D:\!Program\!Bmp_Sample\240128.bmp
//***** 源图形宽度 * 高度:240 * 128
//***** 调整后宽度 * 高度:240 * 128
//***** 字模格式:横向取模,冗余模式,字节正序,正色取模,
//***** 点阵转换时间:2009/07/25 10:40:22
//***** 位图点阵占用3840字节
//********************************************************//
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x07,0xFF,
0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xF0,
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFC,0x01,0xFC,0x00,0x00,
0x03,0xF8,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1F,
0x00,0x01,0x80,0x00,0x00,0x00,0x0F,0x9F,0xFF,0xFE,0x01,0x8F,0x0F,0xFE,0x0F,0x18,
0x00,0x7F,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x19,0x80,0x00,0x00,0x7F,0xE0,0x01,
0x80,0x00,0x00,0x00,0x0F,0x1F,0xFC,0x7F,0x01,0x83,0x7F,0xFF,0xDC,0x18,0x01,0xFF,
0xF0,0x00,0x00,0x00,0x7C,0x00,0x00,0x30,0xC0,0x00,0x00,0xE0,0xF0,0x01,0x80,0x00,
0x00,0x00,0x1F,0x00,0x08,0x3F,0x01,0x81,0xFF,0xFF,0xF8,0x18,0x03,0x07,0x18,0x00,
0x00,0x00,0xCE,0x00,0x00,0x64,0xC0,0x00,0x01,0xC0,0x3C,0x01,0x80,0x00,0x00,0x00,
0x7F,0x00,0x00,0x3F,0x01,0x81,0xFF,0xFF,0xF8,0x18,0x0C,0x00,0x8C,0x00,0x00,0x01,
0x87,0x00,0x00,0xCE,0x60,0x00,0x01,0x80,0x0E,0x01,0x80,0x00,0x00,0x00,0x7F,0x86,
0x30,0x7F,0x01,0x83,0xFF,0xFF,0xFC,0x18,0x1F,0xFE,0x4C,0x00,0x00,0x03,0x33,0x80,
0x01,0x9E,0x60,0x00,0x01,0x80,0x07,0x01,0x80,0x00,0x00,0x00,0xFF,0x86,0x30,0xFF,
0x80,0xC7,0xFF,0xFF,0xFE,0x18,0x1E,0x57,0x26,0x00,0x00,0x06,0x39,0xC0,0x01,0x9F,
0x71,0xC0,0x01,0x80,0x03,0x01,0x80,0x00,0x00,0x00,0xFF,0x80,0x01,0xFF,0xC0,0xCF,
0xFF,0xFF,0xFE,0x30,0x24,0xA4,0xC2,0x00,0x00,0x04,0x78,0xE0,0x03,0x3F,0x37,0xF0,
0x01,0xC0,0x01,0x81,0x80,0x00,0x00,0x07,0xFF,0x80,0x01,0xFF,0xC0,0x6F,0xFF,0xFF,
0xFF,0x30,0x49,0x24,0x62,0x00,0x00,0x04,0xFC,0xFF,0xFF,0x3F,0x3C,0x38,0x00,0xC0,
0x01,0x81,0x80,0x00,0x00,0x18,0xFF,0x80,0x01,0xFF,0xC0,0x7F,0xFF,0xFF,0xFF,0xE0,
0x49,0x24,0x23,0x00,0x00,0x0C,0xFC,0x7F,0xFE,0x3F,0x10,0x1C,0x00,0xE0,0x01,0x81,
精选文档
.
0x80,0x00,0x00,0x60,0x7F,0x80,0x01,0xFF,0xC0,0x3F,0xFF,0xFF,0xFF,0xE0,0x49,0x24,
0x13,0x00,0x00,0x08,0xFC,0x3F,0xFC,0x3F,0x10,0x0C,0x00,0x70,0x01,0x81,0x80,0x00,
0x00,0x80,0x7F,0x00,0x00,0xFF,0x80,0x3F,0xFF,0xFF,0xFF,0xC0,0x49,0xB6,0x93,0x00,
0x00,0x08,0xFC,0x00,0x00,0x00,0x1F,0x84,0x00,0x30,0x07,0x81,0x80,0x00,0x01,0x00,
0xFE,0x01,0xC0,0x7F,0x00,0x7F,0xFF,0xFF,0xFF,0xC0,0x6B,0xFF,0xD9,0x00,0x00,0x10,
0x00,0x20,0x02,0x00,0x1E,0xB6,0x00,0x00,0x07,0x81,0x80,0x00,0x01,0x00,0xFC,0x02,
0x60,0x3F,0x80,0x7F,0xFF,0xFF,0xFF,0xE0,0x1F,0xE7,0xF9,0x00,0x00,0x18,0x00,0x90,
0x04,0x80,0x1A,0xA6,0x00,0x00,0x00,0x01,0x80,0x00,0x01,0x01,0xFC,0x03,0xE0,0x3F,
0xC0,0x7F,0xFF,0xFF,0xFF,0xE0,0x07,0xE7,0xF9,0x00,0x00,0x18,0x1F,0x40,0x01,0x7C,
0x1A,0xA4,0x01,0xC0,0x00,0x01,0x80,0x00,0x01,0x01,0xFC,0x00,0x00,0x1F,0xC0,0x7E,
0x07,0xFE,0x0F,0xE0,0x06,0xE3,0x7B,0x00,0x00,0x30,0x00,0x80,0x00,0x80,0x1A,0x84,
0x01,0xF8,0x00,0x01,0x80,0x00,0x02,0x01,0xFC,0x00,0x00,0x1F,0xC0,0x7C,0x03,0xFC,
0x07,0xE0,0x07,0x45,0x3B,0x00,0x00,0x30,0x0F,0x00,0x00,0x78,0x08,0x0C,0x00,0xFC,
0x00,0x01,0x80,0x00,0x02,0x01,0xFC,0x00,0x00,0x1F,0xC0,0x7C,0x13,0xFC,0x03,0xE0,
0x06,0xC3,0x3B,0x00,0x00,0x30,0x10,0x80,0x00,0x84,0x0C,0x0C,0x00,0x3F,0x80,0x01,
0x80,0x00,0x02,0x00,0xFC,0x00,0x00,0x1F,0xC0,0x7C,0x3B,0xF9,0x83,0xE0,0x06,0x00,
0x7B,0x00,0x00,0x70,0x26,0x40,0x01,0x32,0x0C,0x0C,0x00,0x0F,0xC0,0x01,0x80,0x00,
0x02,0x00,0x7E,0x00,0x00,0x3F,0x81,0xFC,0x3B,0xFB,0xC3,0xE0,0x03,0x28,0xFB,0x00,
0x00,0x60,0x2F,0x40,0x01,0x7A,0x04,0x04,0x00,0x0F,0xF0,0x01,0x80,0x3E,0x04,0x00,
0x7F,0x00,0x00,0x7F,0x80,0x7C,0x13,0xFD,0x83,0xFF,0x01,0x91,0xFF,0x00,0x00,0x60,
0x26,0x40,0x01,0x32,0x06,0x04,0x00,0x06,0xFC,0x01,0x80,0x3F,0x00,0x00,0x7F,0x80,
0x00,0xFF,0x82,0x3E,0x07,0xFC,0x07,0xC0,0x01,0xC7,0xFF,0x00,0x00,0x60,0x10,0x80,
0x00,0x84,0x06,0x06,0x00,0x06,0x3F,0x01,0x80,0x7F,0x0F,0x00,0x3F,0xC0,0x01,0xFF,
0x80,0x3F,0x0F,0x9E,0x0F,0xC0,0x01,0x3E,0x7F,0x00,0x00,0x60,0x0F,0x00,0x00,0x78,
0x06,0x06,0x00,0x06,0x0F,0x81,0x80,0x7F,0x09,0x01,0x1F,0xE0,0x03,0xFF,0x00,0x1F,
0xFF,0x0F,0xFF,0x80,0x02,0x24,0x3F,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x06,0x06,
0x00,0x06,0x7F,0x01,0x80,0x7F,0x19,0x01,0x43,0xFF,0x9F,0xFF,0x00,0x3F,0xFF,0xFF,
0xFF,0x80,0x04,0x18,0x1F,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x26,0x02,0x00,0x07,
0xF0,0x01,0x80,0x7F,0x31,0x02,0x47,0xFF,0xFF,0xFE,0x00,0xE7,0xFF,0xFF,0xFF,0xC0,
0x05,0x00,0x0F,0x00,0x00,0x72,0x00,0x00,0x80,0x3F,0xC6,0x07,0x00,0x7F,0x00,0x01,
0x80,0x3E,0x28,0x02,0x43,0xFF,0xFF,0xF0,0x01,0x83,0xFF,0xFF,0xFE,0x30,0x07,0x00,
0x1D,0x00,0x00,0x71,0xFF,0x81,0xF0,0x40,0x06,0x4F,0x01,0xF8,0x00,0x01,0x80,0x01,
0xF1,0x04,0x41,0xFF,0xFF,0xF0,0x00,0x00,0xFF,0xFF,0x
展开阅读全文