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

📄 lcd7920.c

📁 网卡驱动程序
💻 C
字号:
//本程序测试通过     --2007.11.27

//本程序是7920的LM3037的液晶驱动程序
//汉字2x9
//可显示图形
//ATMEGA16, 内部晶振8M  (也可用于外部7.3728MHz晶振)
//使用串行传输 (2线)

#include "Lcd7920.h"

#define LINEWIDTH 18  //行宽
#define LINES 2       //行数

//LCD初始化
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);    // 8bit I/F, basic command, graphic off
	LCD_WriteCmd(0x20);    // 8bit I/F, basic command, graphic off
	LCD_WriteCmd(0x0C);    // display on
	LCD_WriteCmd(0x06);    // cursor right shift
	
	LCD_Clear();    // cursor right shift	
}


//LCD清屏
void  LCD_Clear(void)
{
   LCD_WriteCmd(0x01);
   Delay_nms(1);        //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
}


//状态检查函数,判断是否处于忙状态   //--保留
void  LCD_CheckState(void)      
{
/*   unsigned char dat;
   CLRBIT(LCD_CONTROL_PORT,RS);  //RS=0
   //SETBIT(LCD_CONTROL_PORT,RW);  //RW=1
   LCD_DATA_DDR=0x00;			// portA as input
   do
   {
      SETBIT(LCD_CONTROL_PORT,E);
      NOP();
      CLRBIT(LCD_CONTROL_PORT,E);
   }
   while (LCD_DATA_PIN&0x80);
   */
}


//对LCD写入数据的时序协议处理
void LCD_Send(unsigned char senddata)   
{
   unsigned char i;

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

//写一个命令到LCD
void LCD_WriteCmd(unsigned char scmd)  
{
   LCD_Send(0xf8);
   LCD_Send(scmd&0xf0);
   LCD_Send(scmd<<4);	
   Delay_nus(20);
}

////写一个数据到LCD
void LCD_WriteData(unsigned char DData)  
{
   LCD_Send(0xfa);
   LCD_Send(DData&0xf0);
   LCD_Send(DData<<4);	
   Delay_nus(20);
}

//设置光标位置,先Y坐标后X坐标
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
void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
{
//从显示屏指定的行(Y),列(X)的位置写入字符

   LCD_WriteCmd(0x34);        // 8bit I/F, basic command
   LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off
   
   LCD_Set_xy(X,Y);   
   LCD_WriteData(c1);
   
   Delay_nms(1); //2006.11.19
}

//指定光标位置,写字符串到LCD显示
void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
{
//从显示屏指定的行(Y),列(X)的位置写入字符串
unsigned char j;
unsigned char *pstr = pstr1;

   LCD_WriteCmd(0x34);        // 8bit I/F, basic command
   LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off

   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
}

//从显示屏的初始位置写入字符串,自动换行
void LCD_WriteStrAuto(unsigned char *pstr1)
{
unsigned char i;
unsigned char j;
unsigned char *pstr = pstr1;

   LCD_WriteCmd(0x34);        // 8bit I/F, basic command
   LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off

   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); //11.19
}

⌨️ 快捷键说明

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