📄 lcd.c
字号:
// 240128液晶显示模块
//***************************************************************************
//* Create by :LAUKING 2007/11/06 KeilC V7.0 *
//***************************************************************************
//连线表: CPU=89s52 *
//C/D=P1.3 /CE=P2.7 2.6 /WR=/WR /RD=/R *
//FOSC=22.1184MHz D0-D7=P0.0-P0.7 *
//***************************************************************************
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <KEY.h>
#include <IAP.h>
#define uint unsigned int
#define uchar unsigned char
#define Graphic 1
#define TXT 0
#define LcmLengthDots 240
#define LcmWidthDots 128
#define para 1 //parameter参数
#define coor 0 //coordinate坐标
char xdata LcmPort _at_ 0x8000;
sbit CD= P1^3; //High is code, low is data
uchar code hz[];
uchar code hz_t[];
////////////////////////////////////////////////////////////////////////////////////
//函数声明
extern void CheckRWCD(void);
extern void CheckAutoWrite(void);
extern void CheckScreen(void);
extern void LcmWriteData(uchar uData);
extern uchar LcmReadData( void );
extern void LcmWriteCommand(uchar Command);
extern void LcmWriteCommandWith1Par(uchar Parameter,uchar Command);
extern void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command);
extern void LcmInit( bit Mode_Choose ); //文本法初始化函数
//extern void LcmInit_t( void ); //图形法初始化函数
extern void LcmClear( uchar FillByte );
extern void LocateXY(uchar x,uchar y,uchar mode);
extern void PutChar(uchar x,uchar y,uchar CharByte);
extern void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz);
extern void CGRAM (unsigned char q);
extern void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz);
extern void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf);
extern void cghz_char(unsigned char x_char,unsigned char y_char,unsigned char hz_char);
extern void cgzf_char(unsigned char x_char,unsigned char y_char,unsigned char zf_char);
extern void Init_Display(void);
extern void Chief_Display(void);
extern void Delay(uint MS);
/////////////////////////////////////////////////
//指令&数据读写状态
void CheckRWCD(void)
{
CD=1; //code
while((LcmPort & 0x03) != 0x03); //低电平忙
}
//数据自动写状态
void CheckAutoWrite(void)
{
CD=1; //code
while((LcmPort & 0x08) == 0); //低电平忙
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{
CD=1; //code
while(LcmPort & 0x40); //1出错,0正确
}
//一个数据子写入函数
void LcmWriteData(uchar uData)
{
CD=0; //data
LcmPort = uData;
}
//一个数据读出函数
uchar LcmReadData( void )
{
uchar uData;
CD=0; //data
uData = LcmPort;
return uData;
}
//无参数指令写入函数
void LcmWriteCommand(uchar Command)
{
CheckRWCD(); //检测指令读写状态
LcmPort = Command;
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
CheckRWCD(); //检测指令读写状态
CD=0; //data
LcmPort = Parameter;
CheckRWCD();
LcmPort = Command;
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
CheckRWCD(); //检测指令读写状态
CD=0;
LcmPort = Parameter1;
CheckRWCD();
CD=0;
LcmPort = Parameter2;
CheckRWCD();
LcmPort = Command;
}
//LCM显示初始化函数
void LcmInit( bit Mode_Choose )
{
LcmWriteCommandWith2Par(0x00,0x00,0x40); //设置文本显示区首地址
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41); //设置文本显示区宽度
LcmWriteCommandWith2Par(0x00,0x10,0x42); //设置图形显示区首地址0x1000
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43); //设置图形显示区宽度
LcmWriteCommand(0xA7); //设置光标形状 8x8方块
LcmWriteCommand(0x81); //显示方式设置 文本xor图形(异或)
LcmWriteCommand(0x9D); //显示开关设置 文本开,图形开,光标闪烁开
if(Mode_Choose==0) //如果是文本方式
{
LcmWriteCommand(0x84); //显示方式:文本特征
LcmWriteCommandWith2Par(0x03,0x00,0x22); //设置CGRAM偏址
}
}
//延时函数
void Delay(uint MS)
{
uchar us,usn;
while(MS!=0) //22.1184M Crystal
{
usn = 4;
while(usn!=0)
{
us=0xf2;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
//清显示存储器函数
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= LcmLengthDots/8*y + x;
if(mode) //mode=1为Graphic
{ //如果图形模式要加上图形区首地址0x0800
temp+=0x1000;
}
LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//显示一个ASCII码函数
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
//0 ! " # $ % & ' ( ) * + , - . /
//1 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
//2 A B C D E F G H I J K L M N O
//3 P Q R S T U V W X Y Z [ \ ] ^ _
//4 ' a b c d e f g h i j k l m n o
//5 p q r s t u v w x y z { | } ~
void PutChar(uchar x,uchar y,uchar CharByte)
{
LocateXY(x,y,TXT);
LcmWriteCommandWith1Par(CharByte,0xC4);// 0xc4 数据一次写,地址不变
}
//汉字写入函数
//x_hz:0~29; y_hz:0~127
//address为显示缓冲区的地址,在图形显示方式下直接对应点阵状态
//addr_hz即为在单片机FLASH中所建的字模的地址
void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz)
{
unsigned char i_hz;
unsigned int addr_hz;
//address=y_hz*30u+x_hz+0x1000; //计算显示存储器地址
addr_hz=code_hz*32u; //计算汉字字模地址(cctab的下标)
for(i_hz=0;i_hz<16;i_hz++) //计数值16
{
LocateXY(x_hz,y_hz,1); //设置显示存储器地址
LcmWriteCommandWith1Par(hz_t[addr_hz],0xC0); //写入汉字字模左部
LcmWriteCommandWith1Par((hz_t[addr_hz+1]),0xC0); //写入汉字字模右部
addr_hz+=2;
//address+=30; //修改显示存储器地址,显示下一列(共16列)
y_hz+=1;
}
}
//CGRAM字模写入函数
//注意,只是用了CGRAM的后1K,前1K留给映射CGROM了
//在连续的32个存储单元里是一个汉字的字模,排列顺序是前16个单元是汉字的左半部(左上、左下),后
//16个存储单元是汉字的右半部
//根据所要写入汉字的个数,只要修改q的取值即可
void CGRAM (unsigned char q)
{
unsigned char m,n,p;
LcmWriteCommandWith2Par(0x00,0x1C,0x24); //设置CGRAM的高1K地址
for(p=0;p<q;p++)
{ for(m=0;m<16;m++)
{
LcmWriteCommandWith1Par(hz[m*2u+p*32u], 0xC0 );
}
for(n=0;n<16;n++)
{
LcmWriteCommandWith1Par(hz[(n*2u+1)+p*32u], 0xC0 );
}
}
}
//CGRAM汉字显示函数
//x_cghz为0~29,y_cghz为0~15
void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz)
{
unsigned int address; //int为16位
unsigned char code_cghz;
code_cghz=4*num_cghz+0x80;
//写入左上部
address=y_cghz*30u+x_cghz; //显示缓冲区存储单元地址
LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24); //设置显示存储器地址
LcmWriteCommandWith1Par( code_cghz, 0xC4 ); //装入字符代码,写入数据,地址不变
//写入右上部
LcmWriteCommandWith2Par( (unsigned char)(address+1),(unsigned char)((address+1)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+2, 0xC4 );
//写入左下部
LcmWriteCommandWith2Par( (unsigned char)(address+30u),(unsigned char)((address+30u)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+1, 0xC4 );
//写入右下部
LcmWriteCommandWith2Par( (unsigned char)(address+31u),(unsigned char)((address+31u)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+3, 0xC4 );
}
//CGRAM字符写入函数
//x_cgzf为0~29,y_cgzf为0~15
void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf)
{
unsigned int address; //int为16位
unsigned char code_cgzf;
code_cgzf=4*num_cgzf+0x80;
//写入
address=y_cgzf*30u+x_cgzf; //显示缓冲区存储单元地址
LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24); //设置显示存储器地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -