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

📄 lcdlib.c

📁 SED1335驱动程序(LCD320*240)含GUI
💻 C
字号:
#include  "LCD_320240.h"
//#include "uart_lib.h"
//#include "44b.h"
#include "LCDlib.h"
#include "hanzi.h"
#include "GUIbasic.h"



#define BIT_A0  (0x1 << 7)
#define BIT_nWR (0x1 << 6)
#define BIT_nRD (0x1 << 5)
#define DELAY_TIME 2

static const BYTE SYSTAB[8] = {
    0x30,       // 0011 0000    B: 1, W/S: 0, M2: 0, M1: 0, M0: 0
    0x87,       // 1000 0111    WF: 1, FX: 7字符宽度8点阵
    0x0f,       // 0000 1111    FY: 16字符垂直大小16点阵
    0x27,       // 0010 0111    C/R: 39  每行显示的字符数
    0x36,       // 0100 0010    TC/R: 66
    0xEF,       // 1110 1111    L/F: 240
    0x28,       // 0010 1000    APL: 40
    0x00        // 0000 0000    APH: 0
};

#define BasePart1      0x00//0x0000为第一显示区首地址
#define BasePart2      0x40//0x4000为第二显示区首地址
#define BasePart3      0x80//0x8000为第三显示区首地址
#define BasePart4      0x00
static const BYTE SCRTAB[10] = {
    0x00,       // 0000 0000    SAD1L:  0x00
    BasePart1,       // 0000 0000    SAD1H:  0x00
    0xf0,       // 1111 0000    SL1:    240  ;1区显示屏的行数为240
    0x00,  // 0000 0000    SAD2L:  0x00
    BasePart2,    // 0001 0000    SAD2H:  0x10
    0xf0,       // 1111 0000    SL2:    240;1区显示屏的行数为240
    0x00,       // 0000 0000    SAD3L:  0x00
    BasePart3,       // 1000 0000    SAD3H:  0x40
    0x00,       // 0000 0000    SAD4L:  0x00
    BasePart4        // 0101 0000    SAD4H:  0x50
};
extern unsigned char ASCII16x8[][16];
UINT8 buffer[240][40]; //显示缓冲区
UINT8 nanjing[][16]=
{
	/*--  文字:  南  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44,
0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00,

/*--  文字:  京  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x02,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,
0x1F,0xF0,0x01,0x00,0x09,0x30,0x19,0x18,0x31,0x0C,0x41,0x08,0x05,0x00,0x02,0x00,
};
void LCDturnoff(void)
{
 WLCDCmd(0x58);//off screen
 WLCDData(0x00);
}

void LCDturnon(void)
{
 WLCDCmd(0x59);//on screen
 WLCDData(0x55);
}


void Delaycicle(U16 i)
{
	int j=0;
	while(j<i)j++;
}
void WLCDData(UINT8 data)
{
		/*  PORT D GR
	OUP(I/O OR LCD)										*/
	// 00-input 01-output 10-sfr

	/*  BIT  7		6		5		4		3		2		1		0	*/
	/*      VF		VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/

	/*  PD  7		6		5		4		3		2		1		0	*/
	/*      o		o		o		o		o		o		o		o	*/
	/*    LCD		LCD		LCD		LCD		LCD	 	LCD	 	LCD	 	LCD	*/
	/*	   01		01		01		01		01		01		01		01	*/

    	rPCOND=0x5555;
    	rPDATC&=~BIT_A0;
	rPDATC|= BIT_nRD;
	rPDATC&=~BIT_nWR;                       // clear nWR
	rPDATD=data;
#if DELAY_TIME > 0
      Delaycicle(DELAY_TIME);              // Delay for SED1335
#endif
       rPDATC|=BIT_nWR;
}

void WLCDCmd(UINT8 cmd)
{
		/*  PORT D GROUP(I/O OR LCD)										*/
	// 00-input 01-output 10-sfr

	/*  BIT  7		6		5		4		3		2		1		0	*/
	/*      VF		VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/

	/*  PD  7		6		5		4		3		2		1		0	*/
	/*      o		o		o		o		o		o		o		o	*/
	/*    LCD		LCD		LCD		LCD		LCD	 	LCD	 	LCD	 	LCD	*/
	/*	   01		01		01		01		01		01		01		01	*/

    	rPCOND=0x5555;
	rPDATC|=BIT_A0;
	rPDATC|=BIT_nRD;
	rPDATC&=~BIT_nWR;                       // Set nWR
	rPDATD=cmd;
#if DELAY_TIME > 0
    Delaycicle(DELAY_TIME);              // Delay for SED1335
#endif
       rPDATC|=BIT_nWR;
}
UINT8 RLCDData()
{
	UINT8 data;
			/*  PORT D GROUP(I/O OR LCD)										*/
	// 00-input 01-output 10-sfr

	/*  BIT  7		6		5		4		3		2		1		0	*/
	/*      VF		VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/

	/*  PD  7		6		5		4		3		2		1		0	*/
	/*      i		i		i		i		i		i		i		i	*/
	/*    LCD		LCD		LCD		LCD		LCD	 	LCD	 	LCD	 	LCD	*/
	/*	   00		00		00		00		00		00		00		00	*/
	rPDATD=0x0;
   	rPCOND=0x0;
	rPDATC|=BIT_A0;
	rPDATC&=~BIT_nRD;
	rPDATC|=BIT_nWR;                       // Set nWR
	data=rPDATD;
#if DELAY_TIME > 0
    Delaycicle(DELAY_TIME);              // Delay for SED1335
#endif
       rPDATC|=BIT_nRD;
return data;
}
UINT8 RLCDSta()
{
	UINT8 stu;
			/*  PORT D GROUP(I/O OR LCD)										*/
	// 00-input 01-output 10-sfr

	/*  BIT  7		6		5		4		3		2		1		0	*/
	/*      VF		VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/

	/*  PD  7		6		5		4		3		2		1		0	*/
	/*      i		i		i		i		i		i		i		i	*/
	/*    LCD		LCD		LCD		LCD		LCD	 	LCD	 	LCD	 	LCD	*/
	/*	   00		00		00		00		00		00		00		00	*/
	rPDATD=0x0;
    rPCOND=0x0;	
	rPDATC|=BIT_A0;
	rPDATC&=~BIT_nRD;
	rPDATC|=BIT_nWR;                       // Set nWR
	stu=rPDATD;
#if DELAY_TIME > 0
    Delaycicle(DELAY_TIME);              // Delay for SED1335
#endif
       rPDATC|=BIT_nRD;
return stu;
}
/* 更新指定的显示区域*/
void LCDupdata(UINT16 x1,UINT16 y1,UINT16 x2, UINT16 y2)
{
	 int i,j;
	 WLCDCmd( CSR_RIGHT);        /*光标自动向右增一*/          
     WLCDCmd( CSRW);               /*设定光标位置命令*/
     WLCDData( 0 );                     /* 从0000位置开始*/         
     WLCDData( 0 );                              
     WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/  
     for(j=y1;j<y2;j++)
     	for(i=x1;i<x2;i++)
     		WLCDData(buffer[j][i]);  
}
/* 清除显示区域*/
void LCDClear()
{
	
    U16  i=32768;
     WLCDCmd( CSR_RIGHT);        /*光标自动向右增一*/          
     WLCDCmd( CSRW);               /*设定光标位置命令*/
     WLCDData( 0 );                     /* 从0000位置开始*/         
     WLCDData( 0 );                              
     WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/            
     while(i--)  {                       /*将32K显缓全部清零,即LCD不显示任何东西*/

           WLCDData( 0x0 );   
     	}
}
/* 液晶屏初始化*/
void LCDinit()
{
	U16 i;
	Delaycicle(600);//足够的时间让液晶准备好
	WLCDCmd(SYSTEM_SET);
	for(i=0;i<8;i++)
		{

			WLCDData(SYSTAB[i]);
		}
	WLCDCmd(SCROLL);
	for(i=0;i<10;i++)
		{

			WLCDData(SCRTAB[i]);
		}
	WLCDCmd(HDOT_SCR);
	WLCDData(0);
	WLCDCmd(OVLAY);
	WLCDData(0x1C);   //设置一三区属性为图形方式,或方式合成
	WLCDCmd(DISP_ON);
	WLCDData(0x54);   //关光标显示
	LCDClear();
}

/* 液晶屏测试函数*/
void Lcd_test(void)
{
	U8 i;
	UINT8 data;
	char s[]="welcom!";
	uint32 dd[]={200,10,250,20,300,40,240,90,200,10};
	WLCDCmd( CSR_DOWN);        /*光标自动向下增一*/        
	 WLCDCmd( CSRW);               /*设定光标位置命令*/
       WLCDData( 0x0 );                     /* 从0000位置开始*/         
       WLCDData( 0x0 );  
	 WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/     
	for(i=0;i<16;i++)
		{
		 	data=nanjing[0][i*2];
			WLCDData(data);
			Delay(10);
			//Uart_Printf("lcddata=%d;\n",RLCDData());
		}
     WLCDCmd( CSRW);               /*设定光标位置命令*/
     WLCDData( 0x1 );                     /* 从0000位置开始*/         
     WLCDData( 0x0 );            
	  WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/     
	for(i=0;i<16;i++)
		{
			data=nanjing[0][i*2+1];
			WLCDData(data);
			Delay(10);
			//Uart_Printf("lcddata=%d;\n",RLCDData());
		}
		i=0;
	while(s[i]!='\0')
	{
		Lcd_printfchar(20,i,s[i]);
		i++;
	}	
	DrawSting16X16( 40,0, "我爱LCD!")	;
	GUI_HLine(2,100,100,1);
	GUI_RLine(2,100,200,1);
	GUI_RectFill(5, 110, 100,200, 1);
	GUI_CircleFill(200,150, 50, 1);
	GUI_LineS(dd, 5, 1);
}

/* 液晶屏汉字显示函数*/
void Lcd_printfHZ(UINT16 row,UINT16 col, UINT16 data)
{
	U8 i;
	UINT16 j;
	j=row*40+col;
	WLCDCmd( CSR_DOWN);        /*光标自动向下增一*/        
	WLCDCmd( CSRW);               /*设定光标位置命令*/
    WLCDData( j%256 );                     /* 从0000位置开始*/         
    WLCDData( j/256 );  
	WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/     
	for(i=0;i<16;i++)
		{
		 WLCDData((UINT8)hanzi[data][i*2]);
		 Delay(10);
			//Uart_Printf("lcddata=%d;\n",RLCDData());
		}
    WLCDCmd( CSRW);               /*设定光标位置命令*/
    WLCDData( (j%256)+1 );                     /* 从0000位置开始*/         
    WLCDData( j/256 );          
	WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/     
	for(i=0;i<16;i++)
		{
			WLCDData(hanzi[data][i*2+1]);
			Delay(10);
			//Uart_Printf("lcddata=%d;\n",RLCDData());
		}
}
/* 液晶ASCII码显示函数*/

void Lcd_printfchar(UINT16 row,UINT16 col, UINT8 data )
{
	UINT8 i;
	UINT16 j;
	j=row*40+col;
	WLCDCmd( CSR_DOWN);        /*光标自动向下增一*/        
	WLCDCmd( CSRW);               /*设定光标位置命令*/
    WLCDData( j%256 );                            
    WLCDData( j/256 );  
	WLCDCmd( MWRITE);          /* 允许uPU连续地把显示数据写入显示区内命令*/     
	for(i=0;i<16;i++)
		{
			WLCDData(ASCII16x8[data-0x20][i]);
			Delay(10);
		}
}

/*字符串显示输出*/
void  DrawSting16X16( UINT16 rowfirst,UINT16  colfirst, char *p)
{
        UINT16 q,qq;
	 UINT16 row,col; 	
        int i; 
	    row=rowfirst;
        col=colfirst;		
        i=0;
        while(p[i]!='\0')
	          	{ 	            
		   if(p[i]&0x80)
                      {
                      q=p[i];
			i++;
			qq=p[i];
                      q=(q-0xB0)*94+(qq-0xA1);                       //取出汉字内码  
                      Lcd_printfHZ(row,col,q);      
			col+=2;
			if(col==40)
				{
					col=0;
					row++;
				}
                       }
                 else
                 	{
         
	                  Lcd_printfchar(row,col,p[i]);               //输出单个字符  
	                 col++;
			   if(col==40)
				{
					col=0;
					row++;
				}
	                }                                 		             
                   i++;
     }
}



⌨️ 快捷键说明

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