📄 ca240128c.c
字号:
// CA240128 A & B
//***************************************************************************
//* Create by : 2004/10/22 KeilC V7.0 *
//***************************************************************************
//连线表: CPU=89C52 *
//C/D=P2.0 /CE=P2.7 FS=P3.5 /WR=/WR /RD=/RD *
//FOSC=12MHz D0-D7=P0.0-P0.7 /RSET=/(CPU RSET) *
//***************************************************************************
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define Graphic 1
#define TXT 0
#define LcmLengthDots 240
#define LcmWidthDots 128
char xdata LcmDataPort _at_ 0x0000;
char xdata LcmCmdPort _at_ 0x0100;
sbit FS = P3^5;
sbit Key= P3^4;
uchar code bmp1[];
uchar code str1[];
//指令&数据读写状态
void CheckRWCD(void)
{
while((LcmCmdPort & 0x03) != 0x03); //低电平忙
}
//数据自动写状态
void CheckAutoWrite(void)
{
while((LcmCmdPort & 0x08) == 0); //低电平忙
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{
while(LcmCmdPort & 0x40); //1出错,0正确
}
//一个数据子写入函数
void LcmWriteData(uchar uData)
{
LcmDataPort = uData;
}
//一个数据读出函数
uchar LcmReadData( void )
{
uchar uData;
uData = LcmDataPort;
return uData;
}
//无参数指令写入函数
void LcmWriteCommand(uchar Command)
{
CheckRWCD(); //检测指令读写状态
LcmCmdPort = Command;
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
CheckRWCD(); //检测指令读写状态
LcmDataPort = Parameter;
CheckRWCD();
LcmCmdPort = Command;
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
CheckRWCD(); //检测指令读写状态
LcmDataPort = Parameter1;
CheckRWCD();
LcmDataPort = Parameter2;
CheckRWCD();
LcmCmdPort = Command;
}
//LCM初始化函数
void LcmInit( void )
{
LcmWriteCommandWith2Par(0x00,0x00,0x40); //设置文本显示区首地址
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41); //设置文本显示区宽度
LcmWriteCommandWith2Par(0x00,0x08,0x42); //设置图形显示区首地址0x0800
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43); //设置图形显示区宽度
LcmWriteCommand(0xA7); //设置光标形状 8x8方块
LcmWriteCommand(0x81); //显示方式设置 文本xor图形(异或)
LcmWriteCommand(0x9C); //显示开关设置 文本开,图形开,光标闪烁关
}
//延时函数
void Delay(uint MS)
{
uchar us,usn;
while(MS!=0) //12M Crystal
{
usn = 2;
while(usn!=0)
{
us=0xf2;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
//通过按键设定延时函数
void DelayKey(unsigned char HalfSecond)
{ //Delay_key加入时间参数0.5秒一级
unsigned int i;
for(i=0;i<50*HalfSecond;i++) //12M Crystal
{
if(Key==0)
{
Delay(20);
while(Key==0) {Delay(20);}
break;
}
Delay(10);
}
}
//清显示存储器函数
void LcmClear( uchar FillByte )
{
uint i = 8192; //此处仅清8K RAM,如果您32K RAM都使用,请修改i=32768
if(FillByte)
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= LcmLengthDots/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,0xC4);
}
//显示一个字符串函数
void PutString(uchar x,uchar y,uchar *str)
{
while(*str != 0)
{
if(x> 29) //自动换行
{
x=0;
y++;
}
PutChar(x,y,*str);
++x;
++str;
}
}
//显示一副图片函数
void DisplayOneBmp(uchar *puts)
{
uchar i,j;
uint X=0;
LocateXY(0,0,Graphic);
LcmWriteCommand(0xB0); //进入自动写
for(i=0;i<LcmWidthDots;i++)
{
for(j=0;j<LcmLengthDots/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<LcmWidthDots;i++)
{
for(j=0;j<LcmLengthDots/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,str1); //0,0不会受到宽度改变的影响
for(i=0;i<8;i++) //屏幕较慢,就以一行文本做演示
{
LcmWriteCommandWith2Par((0x28*i+0x800)&0xff,(0x28*i+0x800)/256,0x24);
for(j=0;j<LcmLengthDots/8;j++)
{
LcmWriteCommand(0xE0);
CheckScreen();
CheckRWCD();
X = LcmReadData();
X = ~X;
LcmWriteCommandWith1Par(X,0xC0);
}
}
//屏读需要一点时间,运行速度比较慢,运行过程中由于文本图形互补的关系,屏幕全黑
LcmWriteCommand(0x98); //关闭文本区看显示效果
DelayKey(3);
LcmWriteCommand(0x9C); //恢复文本区显示
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41); //宽度改回原值
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43);
LcmClear(0); //清屏
}
//主函数
void main(void)
{
uchar i;
FS =0;
Delay(60);
LcmInit();
LcmClear(0);
while(1)
{
DisplayOneBmp(bmp1); //显示一副图片
DelayKey(3);
//ReverseOneBmp(); //反显当前图片
//DelayKey(3);
//LcmClear(0); //清屏,此处不清屏可观察文本xor图形的显示效果
//for(i=0;i<16;i++) //显示一屏字符串
//PutString(0,i,str1);
//DelayKey(3);
//LcmClear(0);
//LcmClear(0xff); //全黑检测
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -