液晶160128A C语言.docx
- 文档编号:26529033
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:34
- 大小:25.81KB
液晶160128A C语言.docx
《液晶160128A C语言.docx》由会员分享,可在线阅读,更多相关《液晶160128A C语言.docx(34页珍藏版)》请在冰豆网上搜索。
液晶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
#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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 液晶160128A C语言 液晶 160128 语言