⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcddev.c

📁 基于C8051F020及RA8806控制芯片的液晶驱动程序
💻 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 + -