液晶160128A C语言.docx

上传人:b****7 文档编号:26529033 上传时间:2023-06-20 格式:DOCX 页数:34 大小:25.81KB
下载 相关 举报
液晶160128A C语言.docx_第1页
第1页 / 共34页
液晶160128A C语言.docx_第2页
第2页 / 共34页
液晶160128A C语言.docx_第3页
第3页 / 共34页
液晶160128A C语言.docx_第4页
第4页 / 共34页
液晶160128A C语言.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

液晶160128A C语言.docx

《液晶160128A C语言.docx》由会员分享,可在线阅读,更多相关《液晶160128A C语言.docx(34页珍藏版)》请在冰豆网上搜索。

液晶160128A C语言.docx

液晶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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1