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

📄 serial_lcd.c

📁 一个有关st7920控制器的测试程序和驱动程序的12864LCD的例程
💻 C
字号:
/************************************************
文件:serial_lcd.c
用途:ST7920驱动程序
注意:
创建:2008.1.26
修改:2008.1.26
Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
************************************************/
#include "..\config.h"

/******************************************************************
** 函数名称: void delay_lcd(void)
** 功能描述: lcd初始化后的延时
** 输 入: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************/
void delay_lcd(void)
{
 unsigned char i=200;
 unsigned char j=0;
 for(j=0;j<6;j++)
 {
   while(i--);
 }
}


/******************************************************************
** 函数名称: void wr_lcd(unsigned char data,unsigned char flag)
** 功能描述: 向lcd写入1B的数据或者命令
** 输 入: unsigned char data,unsigned char flag   data为要写入的数据或者命令,flag=1为命令传送,flag=0为数据传送
** 全局变量: 无
** 调用模块: 无
** 说明:首先要传送5个bit的1,起始位,flag=1为命令传送,5个bit的1起始位后面接着为000
                                      flag=0为数据传送,5个bit的1起始位后面接着为010
** 注意:
*******************************************************************/
void wr_lcd(unsigned char data,unsigned char flag)
{
 unsigned char i,j,k;
 
 CLR_LCD_SCLK;  //clock清零
 SET_LCD_STD;   //data置1
 
 for(i=0;i<5;i++) //首先要传送5个bit的1,起始位
 {
  SET_LCD_SCLK;
  CLR_LCD_SCLK;
 }
 
 if(flag)  //flag=1为命令传送,5个bit的1起始位后面接着为000
 {
  CLR_LCD_STD; //清零数据线,传送3个bit的0
  for(i=0;i<3;i++)
  {
   SET_LCD_SCLK;
   CLR_LCD_SCLK;
  }
 }
 
 else  //flag=0为数据传送,5个bit的1起始位后面接着为010
 {
  CLR_LCD_STD; //传送一位0
  SET_LCD_SCLK;
  CLR_LCD_SCLK;
  
  SET_LCD_STD; //传送一位1
  SET_LCD_SCLK;
  CLR_LCD_SCLK;
  
  CLR_LCD_STD; //传送一位0
  SET_LCD_SCLK;
  CLR_LCD_SCLK;
 }
 
 k=0x80; //后面传送信息的时候用来取得特定的位
 
 for(j=0;j<2;j++)//每一个八位的指令将被分为两个字节接收到:
                 //较高4位的指令资料将会被放在第一个字节的MSB部分
				 //而较低4位(DB3~DB0)的指令资料则会被放在第二个字节的MSB部分
				 //至于相关的另四位则都为0。
 {
   for(i=0;i<4;i++)
   {   	
	if(data&k) //如果相应的位为高
	{
	  SET_LCD_STD; //传送一位1
	}
	else       //如果相应的位为低
	{
	  CLR_LCD_STD; //传送一位0
	}
	k>>=1;
    SET_LCD_SCLK;
    CLR_LCD_SCLK;
   }
   
   CLR_LCD_STD; //传送4位0
   
   for(i=0;i<4;i++)
   {
   	SET_LCD_SCLK;
    CLR_LCD_SCLK;
   }
 }
 //CLR_LCD_SCLK;
 CLR_LCD_STD;
}


/******************************************************************
** 函数名称: void initial_lcd(void)
** 功能描述: lcd初始化
** 输 入: 无
** 全局变量: 无
** 调用模块: wr_lcd();
** 说明:
** 注意:
*******************************************************************/
void initial_lcd(void)
{
  LCD_DDR |= (1<<LCD_STD)|(1<<LCD_SCLK);
  wr_lcd(Lcd_Set_Function_Basic,1);     	//指令集设定
  wr_lcd(Lcd_Set_Entrance_Point+2,1);    	//光标右移
  wr_lcd(Lcd_Display_Status+4,1);	   		//整屏显示
  wr_lcd(Lcd_Clear,1);     		    		//clear the screen
  
  delay_lcd();
}


/*********************************************************************************************************
** 函数名称: Lcd_drawbmp(unsigned char col,unsigned char row,unsigned char col1,unsigned char row1,const unsigned char *bmp)
** 功能描述: 绘制bmp图片
** 输 入: col 起始行  col1 图片行数
** 		   row 起始列  row1 图片列数
**         *bmp:图片字型码指针
** 输 出: 
**         
** 全局变量: 无
** 调用模块: wr_lcd();
** 说明:
** 注意:
********************************************************************************************************/

void Lcd_drawbmp(const unsigned char *bmp)
{
 	 unsigned char i,j;
	 Lcd_clrbmp();
	 wr_lcd(Lcd_Set_Function_Basic+2,1);
	 wr_lcd(Lcd_Set_Function_Extend,1);
	 for(i=0;i<32;i++)
	 {
        for(j=0;j<8;j++)
		{
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
	       wr_lcd(Lcd_Set_Function_Extend+2,1);
		   
		   wr_lcd(0x80+i,1);
		   wr_lcd(0x80+j,1);
		   
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
		   wr_lcd(*bmp++,0);
		   wr_lcd(*bmp++,0);
		}
	 }
	 for(i=0;i<32;i++)
	 {
        for(j=8;j<16;j++)
		{
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
	       wr_lcd(Lcd_Set_Function_Extend+2,1);
		   
		   wr_lcd(0x80+i,1);
		   wr_lcd(0x80+j,1);
		   
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
		   wr_lcd(*bmp++,0);
		   wr_lcd(*bmp++,0);
		}
	 }
	 wr_lcd(0x36,1);
	 wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}



/*********************************************************************************************************
** 函数名称: void Lcd_clrbmp(void)
** 功能描述: 清除bmp图片
** 输 入:     
** 输 出:        
** 全局变量: 无
** 调用模块: Lcd_scomm() Lcd_sdata()
** 说明:
** 注意:
********************************************************************************************************/
void Lcd_clrbmp(void)
{
 	 unsigned char i,j;
	// wr_lcd(Lcd_Clear,1);
	 wr_lcd(Lcd_Set_Function_Basic+2,1);
	 wr_lcd(Lcd_Set_Function_Extend,1);
	 for(i=0;i<32;i++)
	 {
        for(j=0;j<16;j++)
		{
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
	       wr_lcd(Lcd_Set_Function_Extend+2,1);
		   
		   wr_lcd(0x80+i,1);
		   wr_lcd(0x80+j,1);
		   
		   wr_lcd(Lcd_Set_Function_Basic+2,1);
		   wr_lcd(0x00,0);
		   wr_lcd(0x00,0);
		}
	 }
	 wr_lcd(0x36,1);
	 wr_lcd(Lcd_Set_Function_Basic,1); //30H--基本指令操作
}


/*********************************************************************************************************
** 函数名称: Lcd_lineclr()
** 功能描述: 清除一行的显示
** 输 入: unsigned char row 要清除显示的行
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/
void Lcd_lineclr(unsigned char row)
{
    unsigned char i;
 	switch(row)
	{
	  case 1:
	  {
	     wr_lcd(Lcd_Set_Ddram,1);
		 for(i=0;i<16;i++) wr_lcd(' ',0);
		 break;
	  }
	  case 2:
	  {
	     wr_lcd(Lcd_Set_Ddram+0x10,1);
		 for(i=0;i<16;i++) wr_lcd(' ',0);
		 break;
	  }
	  case 3:
	  {
	     wr_lcd(Lcd_Set_Ddram+0x08,1);
		 for(i=0;i<16;i++) wr_lcd(' ',0);
		 break;
	  }
	  case 4:
	  {
	     wr_lcd(Lcd_Set_Ddram+0x18,1);
		 for(i=0;i<16;i++) wr_lcd(' ',0);
		 break;
	  }
	  
	  default: break;
	}
}


/*********************************************************************************************************
** 函数名称: void Lcd_linedisp(unsigned char *p,unsigned char row)
** 功能描述: 在一行中显示
** 输 入: unsigned char row 要清除显示的行
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/

void Lcd_linedisp(unsigned char *p,unsigned char row)
{
   unsigned char i;
   switch(row)
	{
	  case 1:
	  {
	   	 Lcd_lineclr(1);
	     wr_lcd(Lcd_Set_Ddram,1);
		 for(i=0;i<16;i++) wr_lcd(p[i],0);
		 break;
	  }
	  case 2:
	  {
	     Lcd_lineclr(2);
	     wr_lcd(Lcd_Set_Ddram+0x10,1);
		 for(i=0;i<16;i++) wr_lcd(p[i],0);
		 break;
	  }
	  case 3:
	  {
	     Lcd_lineclr(3);
	     wr_lcd(Lcd_Set_Ddram+0x08,1);
		 for(i=0;i<16;i++) wr_lcd(p[i],0);
		 break;
	  }
	  case 4:
	  {
	     Lcd_lineclr(4);
	     wr_lcd(Lcd_Set_Ddram+0x18,1);
		 for(i=0;i<16;i++) wr_lcd(p[i],0);
		 break;
	  }
	}
}


/*********************************************************************************************************
** 函数名称: void Lcd_backwhite(unsigned char line)
** 功能描述: 反白显示
** 输 入: unsigned char row 要反白显示的行 row=0,1行3行反白显示  row=1,二行四行反白显示
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
*******************************************************************************************************/
void Lcd_backwhite(unsigned char line)
{
	wr_lcd(Lcd_Set_Function_Extend,1);
	wr_lcd(Lcd_Back_White+line,1);
	wr_lcd(Lcd_Set_Function_Basic,1);
}

⌨️ 快捷键说明

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