液晶160128A C语言.docx
《液晶160128A C语言.docx》由会员分享,可在线阅读,更多相关《液晶160128A C语言.docx(34页珍藏版)》请在冰豆网上搜索。
![液晶160128A C语言.docx](https://file1.bdocx.com/fileroot1/2023-6/20/7f918330-464a-43d9-8e78-e4cf7108a7d6/7f918330-464a-43d9-8e78-e4cf7108a7d61.gif)
液晶160128AC语言
//***************************************************************
//连线表:
CPU=W78E54BCPUClock=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
#include
#include//自己些的一个头文件,主要是Uchar和二进制
#defineGraphic1
#defineTXT0
#defineLcmXPixel240//横向宽度
#defineLcmYPixel128//纵向高度
#defineUcharunsignedchar
#defineUintunsignedint
//#defineBUS_MODE//总线模式驱动液晶
#defineIO_MODE//IO口模式驱动液晶
#ifdefBUS_MODE
charxdataLcmCmdPort_at_0x0100;//CS低有效RS高--命令
charxdataLcmDatPort_at_0x0000;//CS低有效RS低--数据
#endif
#ifdefIO_MODE
sbitCSP=P2^7;
sbitRSP=P2^0;
sbitWRP=P3^6;
sbitRDP=P3^7;
#defineLcmDataBusP0
#endif
sbitRES=P1^0;//
sbitKey=P3^2;//
sbitp0_dr=P3^4;//坚鸿测试架增加指令,控制P0口输入输出
sbitFS=P3^5;//字体选择,一般在硬件接口直接接电源或地
sbitP33=P3^3;
Ucharcodestr0[];
Ucharcodebmp1[];
voidint_zhongduan();
voiddelay(unsignedintt);
//***************************************************************
//液晶驱动底层程序开始
//***************************************************************
//指令&数据读写状态
voidCheckRWCD(void)
{
#ifdefBUS_MODE
while((LcmCmdPort&0x03)!
=0x03);//低电平忙
#endif
#ifdefIO_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
}
//数据自动写状态
voidCheckAutoWrite(void)
{
#ifdefBUS_MODE
while((LcmCmdPort&0x08)==0);//低电平忙
#endif
#ifdefIO_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
}
//屏读/屏考贝出错状态
voidCheckScreen(void)
{
#ifdefBUS_MODE
while(LcmCmdPort&0x40);//1出错,0正确
#endif
#ifdefIO_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
}
//一个数据子写入函数
voidLcmWriteData(UcharuData)
{
#ifdefBUS_MODE
LcmDatPort=uData;
#endif
#ifdefIO_MODE
CSP=0;
RDP=1;
RSP=0;
LcmDataBus=uData;
WRP=0;
WRP=1;
CSP=1;
LcmDataBus=0xff;
#endif
}
//一个数据读出函数
UcharLcmReadData(void)
{
UcharuData;
#ifdefBUS_MODE
uData=LcmDatPort;
#endif
#ifdefIO_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
returnuData;
}
//无参数指令写入函数
voidLcmWriteCommand(UcharCommand)
{
CheckRWCD();//检测指令读写状态
#ifdefBUS_MODE
LcmCmdPort=Command;
#endif
#ifdefIO_MODE
CSP=0;
RDP=1;
RSP=1;
LcmDataBus=Command;
WRP=0;
WRP=1;
CSP=1;
LcmDataBus=0xff;
#endif
}
//单参数指令写入函数
voidLcmWriteCommandWith1Par(UcharParameter,UcharCommand)
{
LcmWriteData(Parameter);
LcmWriteCommand(Command);
}
//双参数指令写入函数
voidLcmWriteCommandWith2Par(UcharParameter1,UcharParameter2,UcharCommand)
{
LcmWriteData(Parameter1);
LcmWriteData(Parameter2);
LcmWriteCommand(Command);
}
//LCM初始化函数
voidLcmInit(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)
//出口参数:
无
voidDelayMS(unsignedintMS)
{
unsignedcharus,usn;
while(MS!
=0)
{
usn=2;//for12M
while(usn!
=0)
{
us=0xf6;
while(us!
=0){us--;};
usn--;
}
MS--;
}
}
//函数功能:
特殊延时函数
//入口参数:
需要延时的?
.?
秒(Second.MS100)
//出口参数:
无
voidDelayKey(unsignedintSecond,unsignedintMS100)
{//输入精确到0.1S,是用,
unsignedinti;
for(i=0;i{
if(Key==0)
{
DelayMS(20);
while(Key==0){DelayMS(20);}
break;
}
elseDelayMS(10);
}
}
//清显示存储器函数
voidLcmClear(UcharFillByte)
{
Uinti=8192;//此处仅清8KRAM,如果您32KRAM都使用,请修改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);//退出自动写
}
//设定显示地址函数
voidLocateXY(Ucharx,Uchary,Ucharmode)
{
Uinttemp;
temp=LcmXPixel/8*y+x;
if(mode)//mode=1为Graphic
{//如果图形模式要加上图形区首地址0x0800
temp+=0x0800;
}
LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//显示一个ASCII码函数
voidPutChar(Ucharx,Uchary,UcharCharByte)
{
LocateXY(x,y,TXT);
LcmWriteCommandWith1Par(CharByte-0x20,0xC4);//内部带的英文字库是从0x00开始,也就是说空格0x20的字库值是0x00,所以-0x20
}
//显示一个字符串函数
voidPutString(Ucharx,Uchary,Uchar*str)
{
while(*str!
=0)
{
if(x>(LcmXPixel/8-1))//自动换行
{
x=0;
y++;
}
PutChar(x,y,*str);
++x;
++str;
}
}
//显示一副图片函数
voidPutBmp(Uchar*puts)
{
Uchari,j;
UintX=0;
LocateXY(0,0,Graphic);
LcmWriteCommand(0xB0);//进入自动写
for(i=0;i{
for(j=0;j{
CheckAutoWrite();
LcmWriteData(puts[X]);
X++;
}
}
LcmWriteCommand(0xB2);//退出自动写
}
//反显一副图片函数
voidReverseOneBmp(void)
{//利用数据一次读写操作
Uchari,j,X;//只能对一段RAM取反
LocateXY(0,0,Graphic);
for(i=0;i{
for(j=0;j{
LcmWriteCommand(0xC5);//读数据,地址不变
CheckRWCD();
X=LcmReadData();
X=~X;
LcmWriteCommandWith1Par(X,0xC0);
}
}
}
//屏读功能演示
voidScreenReadDemo(void)
{//利用屏读
//能对当前屏幕反显,包括合成内容(本函数仅读文本到图形)
//但是写入后的内容都在图形区
//可以将文本区内容读出以图形方式写到图形区
Uchari,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{
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);//清屏
}
//显示点阵子函数
voidPutDots(UcharDotByte,Ucharn)
{
Uchari,j;
LocateXY(0,0,Graphic);
LcmWriteCommand(0xB0);//进入自动写
for(i=0;i{
for(j=0;j{
CheckAutoWrite();
LcmWriteData(DotByte);
}
DotByte=~DotByte;
}
LcmWriteCommand(0xB2);//退出自动写
}
//主函数
voidmain(void)
{
Uchari;
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);
}
}
//代码区
Ucharcodestr0[]="ShenZhenSunSonElectronicINC";//减去0x20即可
Ucharcodebmp1[]={
//********************************************************//
//*****转换的文件:
D:
\!
Program\!
Bmp_Sample\240128.bmp
//*****源图形宽度*高度:
240*128
//*****调整后宽度*高度:
240*128
//*****字模格式:
横向取模,冗余模式,字节正序,正色取模,
//*****点阵转换时间:
2009/07/2510:
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,0x0