📄 lcddev.c
字号:
#include "lcddev.h"
#include "ctypedef.h"
//初始化8051
void Port_IO_Init()
{
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //io交叉配置允许
P0MDOUT = 0xff;
P3MDOUT = 0xff;
}
void Oscillator_Init() //选用内部振荡器
{
OSCICN = 0x05;
}
void Reset_Sources_Init()
{
WDTCN = 0xDE; //关闭看门狗
WDTCN = 0xAD;
}
void SYSCLK_Init (void)
{
int i;
OSCXCN = 0x67; // 外部晶振,大于6.7MHz
for (i=0; i < 2000; i++) ; // 等待起振
while (!(OSCXCN & 0x80)) ; // 检测是否起振
OSCICN = 0x88; // 设置为系统时钟为外部晶振,且开启时钟丢失检测
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
SYSCLK_Init ();
//Oscillator_Init();
Port_IO_Init();
}
/*
*/
void Delay(uchar t)
{
while(t--);
}
/*--------------------------------
函数名:void LCD_ChkBusy(void);
函数功能:检查LCD是否忙
使用说明:
使用说明:
状态字格式:bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
状态字说明:
bit7: 存储器读写状态 0 准备好 1 忙
bit6: 扫描状态 0 准备好 1 忙
bit5: 睡眠模式 0 正常 1 睡眠
bit4 bit3: 不用
bit2: 唤醒状态位
bit1: KS状态
bit0: TP状态
-----------------------------------*/
void Lcd_ChkBusy(void)
{
uchar temp;
do{
//LcdDataPort_InPut();
RS = 0;
CS = 1;
WR = 1;
RD = 1;
Delay(2);
RS = 1;
Delay(2);
CS = 0;
Delay(5);
RD = 0;//开始读状态
temp = Lcd_DataPort;
Delay(10);
RD = 1;
Delay(2);
CS = 1;
RS = 0;
}while(temp & 0xC0);
}
/*void Lcd_writedatatocmd(uchar CmdReg,uchar udata) ///写数据到到寄存器
{
CS = 0;
RS = 1;
Delay(2);//
WR = 0;
Lcd_DataPort = CmdReg;
Delay(10);// 最小20ns
WR = 1;// 完成写寄存器
Delay(2);
CS = 1;
RS = 0;
Delay(20);
CS = 0;
Delay(10);//
WR = 0;
Lcd_DataPort = udata;
Delay(30);//最小50ns
WR = 1;
CS = 1;
RS = 1;
}*/
void Lcd_writecmd(uchar CmdReg) //写命令
{
CS = 0;
RS = 1;
WR = 0;
Lcd_DataPort = CmdReg;
Delay(10);// 最小20ns
WR = 1;// 完成写寄存器
Delay(2);
CS = 1;
RS = 0;
}
void Lcd_writedata(uchar DatValue)//写数据
{
CS = 0;
RS = 0;
Delay(10);//
WR = 0;
Lcd_DataPort = DatValue;
Delay(30);//最小50ns
WR = 1;
CS = 1;
RS = 1;
}
void Lcd_writedatatocmd(uchar CmdReg,uchar udata) ///写数据到到寄存器
{
Lcd_writecmd(CmdReg);
Lcd_writedata(udata);
}
/*
函数名:
*/
/*uchar Lcd_readcmd(void)
{
uchar CmdReg;
LcdDataPort_InPut();
CS = 0;
RS = 0;
WR = 1;
RD = 0;
CmdReg = Lcd_DataPort;
Delay(4);
RD = 1;
CS = 1;
return CmdReg;
}
*/
uchar Lcd_readdatafromcmd(uchar CmdReg)
{
uchar udata;
Lcd_writecmd(CmdReg);
udata = Lcd_readdata();
return udata;
}
uchar Lcd_readdata(void)
{
uchar udata;
CS = 0;
RS = 0;
WR = 1;
Delay(10);//
RD = 0;
udata = Lcd_DataPort;
Delay(30);//最小50ns
RD = 1;
CS = 1;
RS = 1;
return udata;
}
//开显示
void LCD_ON(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(WLCR);
temp |= 0x04;
Lcd_writedatatocmd(WLCR,temp);
}
/*
函数名:void LCD_OFF(void)
*/
//关显示
void LCD_OFF(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(WLCR );
temp &= 0xFB;
Lcd_writedatatocmd(WLCR ,temp);
}
//设置光标位置
void LCD_GotoXY(uchar X1,uchar Y1)
{
Lcd_writedatatocmd(CURX,X1 & 0x3f);
Delay(2);
Lcd_writedatatocmd(CURY,Y1 & 0xff);
Delay(2);
}
//文字模式
void LCD_TEXT(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(WLCR);
temp |= 0x08; //WLCR寄存器第3位
Lcd_writedatatocmd(WLCR,temp);
}
//绘图模式
void LCD_Graphic(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(WLCR);
temp &= 0xf7; //改变WLCR第三位
Lcd_writedatatocmd(WLCR,temp);
}
//显示
void Access_2Page(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(MAMR);
temp |= 0x03;//置位第 1 2 位,完成选择同时存取DDRAM1和DDRAM2
Lcd_writedatatocmd(MAMR,temp);
}
void Onlyshowpage1(void)
{
uchar temp;
temp = Lcd_readdatafromcmd(MAMR);
temp &= 0x9f;//清零第6 ,5位
temp |= 0x10;//置位第4位;完成在屏幕上只显示DDRAM1
Lcd_writedatatocmd(MAMR,temp);
}
void Lcd_stringwrite(uchar *pstr,uchar strlen,uchar DispMode)
{
uint i;
Lcd_ChkBusy();
//LcdDataPort_OutPut();
RS = 1;
RD = 1;
CS = 0;
Lcd_DataPort = MWCR; //从光标处写入内存指令
WR = 0; //写寄存器
Delay(5);
WR = 1;
CS = 1;
RS = 0;
CS = 0;
for(i=0; i<strlen; i++)
{
if(DispMode == 1)
Lcd_DataPort = ((*pstr++)); // 准备预写入显示内存的数据
else
Lcd_DataPort = (~(*pstr++)); // 准备预写入显示内存的数据
WR = 0; // "写"信号使能 开始写
Delay(2);
WR = 1; // "写"信号禁能
}
CS = 1;
RS = 1;
}
void ClearRam(void)
{
uchar temp0,temp1;
//LCD_Graphic();
//Access_2Page();
temp0 = Lcd_readdatafromcmd(FNCR);
temp0 |= 0x80; //
Lcd_writedatatocmd(FNCR,temp0); //开始清除内存
do //检测是否已经清除完
{
Delay(5);
temp1 =Lcd_readdatafromcmd(FNCR);
temp1 &= 0x80;
} while(temp1 );
}
void Lcd_clearscreen(void)
{
//LCD_TEXT();
Onlyshowpage1();
Lcd_writedatatocmd(FNCR,0x00);
ClearRam();
}
//初始化液晶寄存器
void IniLcd(void)
{
Lcd_writedatatocmd(WLCR,0X00);
Lcd_writedatatocmd(MISC,0x00);
Lcd_writedatatocmd(ADSR,0x00);
Lcd_writedatatocmd(INTR,0x00);
Lcd_writedatatocmd(WCCR,0x00);
Lcd_writedatatocmd(CHWI,0x00);
Lcd_writedatatocmd(MAMR,0x11);
Lcd_writedatatocmd(AWRR,0x27);
Lcd_writedatatocmd(DWWR,0x27);
Lcd_writedatatocmd(AWBR,0xEF);
Lcd_writedatatocmd(DWHR,0xEF);
Lcd_writedatatocmd(AWLR,0x00);
Lcd_writedatatocmd(AWTR,0x00);
Lcd_writedatatocmd(CURX,0x00);
Lcd_writedatatocmd(BGSG,0x00);
Lcd_writedatatocmd(EDSG,0x00);
Lcd_writedatatocmd(CURY,0x00);
Lcd_writedatatocmd(BGCM,0x00);
Lcd_writedatatocmd(EDCM,0x00);
Lcd_writedatatocmd(BTMR,0x00);
Lcd_writedatatocmd(ITCR,0x00);
Lcd_writedatatocmd(KSCR1,0x00);
Lcd_writedatatocmd(KSCR2,0x00);
Lcd_writedatatocmd(KSDR0,0x00);
Lcd_writedatatocmd(KSDR1,0x00);
Lcd_writedatatocmd(KSDR2,0x00);
Lcd_writedatatocmd(TPCR1,0x00);
Lcd_writedatatocmd(TPXR,0x00);
Lcd_writedatatocmd(TPYR,0x00);
Lcd_writedatatocmd(TPZR,0x00);
Lcd_writedatatocmd(TPCR2,0x00);
Lcd_writedatatocmd(PCR,0x00);
Lcd_writedatatocmd(PDCR,0x00);
Lcd_writedatatocmd(PNTR,0x00);
Lcd_writedatatocmd(FNCR,0X00);
Lcd_writedatatocmd(FVHT,0x00);
// Lcd_clearscreen();//初始化LCD,选择只显示TXT格式,DDRAM1,自动清除DDRAM
//LCD_GotoXY(0x00,0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -