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

📄 19264.c

📁 LCD19264液晶显示驱动程序,包含英文字符,12点阵,14点阵,16点阵汉字于屏中任意位置显示
💻 C
字号:
/*The following is for lm12896 liquid crystal module drived
by S6B0741 LCD controller,4-pin Serial Interface */
/*
Set Page Address                            :  1  0  1  1   P3  P2  P1  P0//BX
Set Column Address MSB                		:  0  0  0  1    0  Y6  Y5  Y4
Set Column Address LSB                 		:  0  0  0  0   Y3  Y2  Y1  Y0
*/
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
code uchar data_out[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
sbit LCD_RST=P3^6; //
sbit LCD_BK =P0^2;
sbit LCD_CS =P3^7; //
sbit LCD_RS =P3^4; //
sbit SID    =P0^7; // 串行数据
sbit SCLK   =P0^6; //
void delay100us(void)	/*delay TIMER1*1 ms for 12MHz */
{
	uchar data i;
	for(i=0;i<25;i++)
	{
		_nop_();
		_nop_();
	}
}
void delay1ms(void)		/*delay TIMER1*1 ms for 12MHz */
{
	uchar data i;
	for(i=0;i<250;i++)
	{
		_nop_();
		_nop_();
	}
}
/*-------以下是驱动函数	---------- */
void wcode(uchar cc)    //send insruction
{
	uchar i;
	LCD_RS=0;
	SCLK=0;
	for(i=0;i<8;i++)
	{
        if ((cc&data_out[i]) > 0)
        {
        	SID=1;
        	_nop_();
        	SCLK=1;
        	_nop_();
        	SCLK=0;
        }
        else 
        {
        	SID=0;
        	_nop_();
        	SCLK=1;
        	_nop_();
        	SCLK=0;
        }
    }
}
void set_addr(uchar pager,uchar col_addr)
{
	uchar datatemp;
	LCD_RS=0;
	delay100us();
	wcode(0xb0|pager);/*设置页地址0xb0+pager*/	
	_nop_();
	_nop_();
	datatemp = col_addr;	/*写列地址*/
	wcode((datatemp >> 4)|0x10);/*设置列地址MSB:00010Y6Y5Y4*/
	wcode(datatemp & 0x0f);/*设置列地址LSB:0000Y3Y2Y1Y0*/
}
void wdata(uchar dd)    		//send data
{
    uchar i;
	LCD_RS=1;
	SCLK=0;
	for(i=0;i<8;i++)
	{
       if ((dd&data_out[i]) > 0)
        {
        	SID=1;
        	_nop_();
        	SCLK=1;
        	_nop_();
        	SCLK=0;
        }
        else
        {
        	SID=0;
        	_nop_();
        	SCLK=1;
        	_nop_();
        	SCLK=0;
        }
    }
}
void CLRLCD(void)
{	
	uchar i,j;
	for(i=0;i<12;i++)	//clear lcd
	{
		wcode(0xb0|i);	//set page add = 0~11
		wcode(0x10);	//set col. add MSB = 0
		wcode(0x00);	//set col. add LSB = 0
		for(j=0;j<128;j++)
		{
			wdata(0x00);
			wdata(0x00);
		}
	}
	wcode(0x3f);/*开显示*/	
}
void lcd_init()
{
	delay1ms();
	LCD_RST=0;
	LCD_CS=0;
	LCD_RS=0;
	delay1ms();
	LCD_RST=1;
	delay1ms();
	LCD_CS=0;
    LCD_RS=0;
	wcode(0xe2);	//reset
	wcode(0xae);	//display off
	wcode(0x48);	//set partial display duty ratio
	wcode(0x60);
	wcode(0xa1);	//adc = normal
	wcode(0xc8);	//SHL select = nomal
	wcode(0x44);	//set initial com0 reg
	wcode(0x10);
	wcode(0xab);	//osc on strat
	wcode(0x66);	//select dc-dc stepup = 5 times
	wcode(0x27);	//select reg resistor = 7.2
	wcode(0x81);	//set elec. vol. reg
	wcode(0x2C);	//0x2c
	wcode(0x55);	//select bias = 1/10
	wcode(0x40);	//set ini. display line reg.
	wcode(0x00);
	wcode(0x4c);	//set N-line inversion
	wcode(0x00);
	wcode(0x94);	//set FRC PWM mode 3FRC 9PWM
	wcode(0x88);	//set white mode and 1st/2nd frame set pulse width
	wcode(0x00);
	wcode(0x89);	//set white mode and 3st/4nd frame set pulse width
	wcode(0x00);
	wcode(0x8a);	//set light gray mode and 1st/2nd frame set pulse width
	wcode(0x09);
	wcode(0x8b);	//set light gray mode and 3st/4nd frame set pulse width
	wcode(0x00);
	wcode(0x8c);	//set dark gray mode and 1st/2nd frame set pulse width
	wcode(0x99);
	wcode(0x8d);	//set dark gray mode and 3st/4nd frame set pulse width
	wcode(0x00);
	wcode(0x8e);	//set black mode and 1st/2nd frame set pulse width
	wcode(0x99);
	wcode(0x8f);	//set black mode and 3st/4nd frame set pulse width
	wcode(0x09);
	wcode(0x2f);	//power ctl = all on
	wcode(0xaf);
	CLRLCD();
	}
void dis_any_dot(uchar pager,uchar col_addr,uchar dot,uchar reverse)
{
    uchar tem=dot;
    if(reverse==1)tem=~dot;	/*反白显示*/
    if(pager==0)tem=0x01|tem;/*第一页要显示上边框*/	
    if(pager==11)tem=0x80|tem;/*最后一页要显示下边框	*/
    if(col_addr==0|col_addr==127)tem=0xff; /*第一列要显示左边框,最后一列要显示右边框*/
	wdata(tem);
	wdata(tem);
}
/*void dis_16x16(uchar pager,uchar col_addr,uchar *character,uchar reverse)	
{
	uchar i;
	set_addr(pager,col_addr);
	
	for(i=0;i<16;i++)
	{	
		dis_any_dot(pager,col_addr+i,*character++,reverse);
	 }
	
	pager +=1;
	set_addr(pager,col_addr);
	for(i=0;i<16;i++)
	{	
		dis_any_dot(pager,col_addr+i,*character++,reverse);
	}  
}*/
void dis_12x12(uchar pager,uchar col_addr,uchar *character,uchar reverse,uchar frame)	
{
	uchar i,tem;
	set_addr(pager,col_addr);
	for(i=0;i<12;i++)
	{	
		tem=*character++;
		if(((frame==1)|(frame==2))&(reverse==0))tem=tem|0x01;//显示上边框
		if((frame==1)&(i==0)&(reverse==0))tem=0xff;//显示左边框
		if((frame==2)&(i==11)&(reverse==0))tem=0xff;//显示右边框
		dis_any_dot(pager,col_addr+i,tem,reverse);
	 }
	pager +=1;
	set_addr(pager,col_addr);
	for(i=0;i<12;i++)
	{
		tem=*character++;
		if(((frame==1)|(frame==2))&(reverse==0))tem=tem|0x80;//显示下边框
		if((frame==1)&(i==0)&(reverse==0))tem=0x7f;//显示左边框
		if((frame==2)&(i==11)&(reverse==0))tem=0x7f;//显示右边框
		dis_any_dot(pager,col_addr+i,tem,reverse);
	}  
}
void dis_14x14(uchar pager,uchar col_addr,uchar *character,uchar reverse,uchar frame)	
{
	uchar i,tem;
	set_addr(pager,col_addr);
	for(i=0;i<14;i++)
	{	
		tem=*character++;
		if((frame==1)&(i==0)&(reverse==0))tem=0xff; //显示左边框
		if((frame==2)&(i==13)&(reverse==0))tem=0xff;//显示右边框
		if(((frame==1)|(frame==2)|(frame==3))&(reverse==0))tem=tem|0x01;//显示上边框
		dis_any_dot(pager,col_addr+i,tem,reverse);
	 }
	pager +=1;
	set_addr(pager,col_addr);
	for(i=0;i<14;i++)
	{	
		tem=*character++;
		if((frame==1)&(i==0)&(reverse==0))tem=0x3f;//显示左边框
		if((frame==2)&(i==13)&(reverse==0))tem=0x3f;//显示右边框
		if(((frame==1)|(frame==2)|(frame==3))&(reverse==0))tem=tem|0x40;//显示下边框
		dis_any_dot(pager,col_addr+i,tem,reverse);
	}  
}
void dis_char_7x14(uchar pager,uchar col_addr,uchar *character,uchar reverse)	
{
	uchar i;
	set_addr(pager,col_addr);
	for(i=0;i<7;i++)
	{	
		dis_any_dot(pager,col_addr+i,*character++,reverse);
	 }
	pager +=1;
	set_addr(pager,col_addr);
	for(i=0;i<7;i++)
	{	
		dis_any_dot(pager,col_addr+i,*character++,reverse);
	}  
}
void show_lcd_borad(void)//
{    
	uchar data i;
	set_addr(0,1);	
	for(i=1;i<127;i++)
        {
		dis_any_dot(0,1,0x01,0);
        };
	set_addr(11,1);	
	for(i=1;i<127;i++)
        {
		dis_any_dot(11,1,0x80,0);
        };
    for(i=0;i<12;i++)
        {	
			set_addr(i,0);
			dis_any_dot(0,0,0xff,0);
			set_addr(i,127);
			dis_any_dot(0,0,0xff,0);
        }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -