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

📄 lcd7920.c

📁 用单片机ATMEGA16写的PS2键盘驱动程序
💻 C
字号:
#include "Lcd7920.h"

#define LINEWIDTH 18  /* 中文LCD行宽 */
#define LINES 2       /* 中文LCD行数 */

/*-------------------------------------------------------------------- 
 函数功能:LCD初始化 
 输    入:无  
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_Init(void)
{
	Delay_nms(100);

 	/* 端口初始化 */
	LCD_CONTROL_DDR=0xFF; 

	CLRBIT(LCD_CONTROL_PORT,E);
	CLRBIT(LCD_CONTROL_PORT,RW);
	Delay_nms(1);
	
	LCD_WriteCmd(0x20);    
	LCD_WriteCmd(0x20);    
	LCD_WriteCmd(0x0C);    
	LCD_WriteCmd(0x06);    
	
	LCD_Clear();           	
}

/*-------------------------------------------------------------------- 
 函数功能:LCD清屏 
 输    入:无  
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void  LCD_Clear(void)
{
   LCD_WriteCmd(0x01);
   Delay_nms(1);       
}

/*-------------------------------------------------------------------- 
 函数功能:检查LCD是否处于忙状态 
 输    入:无  
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void  LCD_CheckState(void)      
{
   unsigned char dat;
   CLRBIT(LCD_CONTROL_PORT,RS);  
   //SETBIT(LCD_CONTROL_PORT,RW); 
   LCD_DATA_DDR=0x00;			
   do
   {
      SETBIT(LCD_CONTROL_PORT,E);
      NOP();
      CLRBIT(LCD_CONTROL_PORT,E);
   }
   while (LCD_DATA_PIN&0x80);
   
}

/*-------------------------------------------------------------------- 
 函数功能:往LCD端口写数据
 输    入:senddata 要发送到LCD端口的字节  
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_Send(unsigned char senddata)   
{
   unsigned char i;

   for(i=0;i<8;i++)
   {
      if((senddata)&0x80)
      {
         SETBIT(LCD_CONTROL_PORT,RW);	
      }
      else
      {
         CLRBIT(LCD_CONTROL_PORT,RW);		
      }
		
      SETBIT(LCD_CONTROL_PORT,E);	
      NOP();
      CLRBIT(LCD_CONTROL_PORT,E);	
		
      senddata<<=1;
   }
}

/*-------------------------------------------------------------------- 
 函数功能:写一个命令到LCD
 输    入:scmd 要发送到LCD的命令 
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_WriteCmd(unsigned char scmd)  
{
   LCD_Send(0xf8);
   LCD_Send(scmd&0xf0);
   LCD_Send(scmd<<4);	
   Delay_nus(20);
}

/*-------------------------------------------------------------------- 
 函数功能:写一个数据到LCD
 输    入:scmd 要发送到LCD的数据   
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_WriteData(unsigned char DData)  
{
   LCD_Send(0xfa);
   LCD_Send(DData&0xf0);
   LCD_Send(DData<<4);	
   Delay_nus(20);
}

/*-------------------------------------------------------------------- 
 函数功能:设置光标位置,先Y坐标后X坐标
 输    入:Y  LCD的行位置 
           X  LCD的列位置    
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_Set_xy(unsigned char Y, unsigned char X)
{
   unsigned char i=0x00;
   switch(Y & 0x0f)      /* 确定行号 */
   {
      case 0x00:
		i=0x80;
		break;
      case 0x01: 
		i=0x90; 
		break;
      case 0x02: 
		i=0x88;
		break;
      case 0x03:
		i=0x98;
		break;
      default : 
		break;
   }
   i = (X & 0x0f)|i;    /* 确定列号 */
   LCD_WriteCmd(i);
	
}

/*-------------------------------------------------------------------- 
 函数功能:按指定位置写一个字符到LCD
 输    入:Y  LCD的行位置 
           X  LCD的列位置    
           c1 要写入的字符    
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
{
   LCD_WriteCmd(0x34);        
   LCD_WriteCmd(0x30);        
   
   LCD_Set_xy(X,Y);   
   LCD_WriteData(c1);
   
   Delay_nms(1); 
}

/*-------------------------------------------------------------------- 
 函数功能:指定光标位置,写字符串到LCD显示
 输    入:Y  LCD的行位置 
           X  LCD的列位置    
           pstr1  要写入的字符串指针    
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
{
unsigned char j;
unsigned char *pstr = pstr1;

   LCD_WriteCmd(0x34);        
   LCD_WriteCmd(0x30);        

   LCD_Set_xy(Y,X);
	 
   j=Y * LINEWIDTH + X;
   while (*pstr && j< (LINEWIDTH * LINES))
   {
      if (j%LINEWIDTH==0)             /* 判断是否换行 */
      {
         LCD_Set_xy(j/LINEWIDTH,0);   /* 如换行, 则光标移动到行首 */
      }
		 
      /* 避免最后一格写半个汉字, 把汉字写到下一行 */
      if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128) 
      {
         LCD_WriteData(' '); 
         j++;
      }
      else
      {	
         LCD_WriteData(*pstr++);
         j++;
      }
   }
	 
   Delay_nms(1); //2006.11.19
}

/*-------------------------------------------------------------------- 
 函数功能:从显示屏的初始位置写入字符串,自动换行
 输    入:pstr1  要写入的字符串指针    
 输    出:无 
 调    用: 
 修改日期: 2007.12.28
 作    者:TOM
 备    注:
--------------------------------------------------------------------*/
void LCD_WriteStrAuto(unsigned char *pstr1)
{
unsigned char i;
unsigned char j;
unsigned char *pstr = pstr1;

   LCD_WriteCmd(0x34);        
   LCD_WriteCmd(0x30);        

   for(i=0;i<36;i++)           /* 清空屏幕 */
   {
      if (i%18==0)             /* 判断是否换行 */
      {
         LCD_Set_xy(i/18,0);   /* 如换行, 则光标移动到行首 */
      }

      LCD_WriteData(' '); 
   }
		
   j=0;
   while (*pstr && j<36)
   {
      if (j%18==0)             /* 判断是否换行 */
      {
         LCD_Set_xy(j/18,0);   /* 如换行, 则光标移动到行首 */
      }
		 
      /* 避免最后一格写半个汉字, 把汉字写到下一行 */
      if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128) 
      {
         LCD_WriteData(' ');  
         j++;
      }
      else
      {	
         LCD_WriteData(*pstr++);
         j++;
      }
   }
	 
   Delay_nms(1); 
}

⌨️ 快捷键说明

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