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

📄 1602.h

📁 本源码是实现1602的液晶驱动,实验平台是AVR单片机
💻 H
字号:
# define True           0x01 
# define False          0x00 
# define Enable         0x01 
# define Disable        0x00 
# define LCD_Write          0x00 
# define LCD_Read           0x01 
# define LCD_Command        0x00 
# define LCD_Data           0x01 
# define LCD_CMD_Init       0x28 
# define LCD_CMD_DispCtr    0x0c 
# define LCD_CMD_CLS        0x01 
# define LCD_CMD_EnterSet   0x06 
# define LCD_CMD_IconShow   0x0f 
# define LCD_CMD_IconHide   0x0c 
# define LCD_RS              _PB4 
# define LCD_RW              _PB7 
# define LCD_E               _PB5 
# define LCD_BF              Read_PB3 
# define LCD_HalfData_Port   PORTB 
# define LCD_HalfData_DDR    DDRB 
# define LCD_SetWriteData    LCD_HalfData_DDR |= 0x0f;LCD_HalfData_Port &= 0xf0; 
# define LCD_SetReadData     LCD_HalfData_DDR &= 0xf0;LCD_HalfData_Port |= 0x0f;  
# define LCD_SendHalfCharHigh(a) LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a>>4); 
# define LCD_SendHalfCharLow(a)  LCD_HalfData_Port &= 0xf0; LCD_HalfData_Port |= (a<<4>>4); 
/*---------------------* 
*    动 作 宏 定 义    * 
*---------------------*/ 
# define SetReadState       LCD_SetReadData;LCD_RS = LCD_Command;LCD_RW = LCD_Read; 
# define SetRead            LCD_SetReadData;LCD_RW = LCD_Read; 
# define SetWrite           LCD_SetWriteData;LCD_RW = LCD_Write; 
# define SetCommand         LCD_RS = LCD_Command; 
# define SetData            LCD_RS = LCD_Data; 
# define RunLeft            0x00
# define RunRight           0x01
# define Print(a)           LCDDisplayString(a); 
# define Locate(x,y)        LCDSetXY(x-1,y-1); 
# define CLS                LCDWaitForReady();LCDSendCommand(LCD_CMD_CLS); 
# define PrintN(a,b)        LCDDisplayNum((unsigned long)a,b); 
# define ShowIcon           LCDWaitForReady();LCDSendCommand(LCD_CMD_IconShow); 
# define HideIcon           LCDWaitForReady();LCDSendCommand(LCD_CMD_IconHide); 
/*********************** 
*    全局变量声明区    * 
***********************/ 
const char CHR[10] = {"0123456789"}; 
/*********************** 
*    系统函数声明区    * 
***********************/ 
void LCDInit(void); 
void LCDSendCommand(char Command); 
void LCDSendData(char Data); 
void LCDWaitForReady(void); 
void LCDSetXY(char X,char Y); 
void LCDDisplayString(char *String); 
void LCDDisplayNum(unsigned int Num); 
void delay_nms(unsigned int n);
void RunString(char *String,char Direction,char Y,char StartX,char EndX);
char StringLenth(char *String);
void Flash(char *String,char Icon,char X,char Y);
/*
void Flash(char *String,char Icon,char X,char Y)
{
    char a = 0;
	char StringLong = StringLenth(String);
	
    if (SystemTimeCounter > 499)
	{
	    Locate(X,Y)
		Print(String)    
	}
	else
	{
	    for (a = X ;a < X+StringLong;a++)
		{
		    Locate(a,Y)
			Print(&Icon)
		}
	}
}
*/
char StringLenth(char *String)
{
    char n = 0;
	while (*String)
	{
	    n++;
		String ++;
	}
	
	return n;
}
/******************************************************** 
*  函数说明:LCD初始化函数                              * 
********************************************************/ 
void LCDInit(void) 
{ 
    delay_nms(15); 
    
   LCDWaitForReady(); 
   LCDSendCommand(LCD_CMD_Init); 
    
   LCDWaitForReady(); 
   LCDSendCommand(LCD_CMD_DispCtr); 
    
   LCDWaitForReady(); 
   LCDSendCommand(LCD_CMD_CLS); 
   delay_nms(2); 
   LCDSendCommand(LCD_CMD_EnterSet); 
} 

/******************************************************** 
*  函数说明:向LCD发送指令函数                          * 
*  输入:    需要发送的指令                             * 
********************************************************/ 
void LCDSendCommand(char Command) 
{ 
   SetWrite; 
   SetCommand; 
   { 
       LCD_E = Enable; 
       
      LCD_SendHalfCharHigh(Command); 
       
       LCD_E = Disable; 
   } 
   { 
       LCD_E = Enable; 
       
        LCD_SendHalfCharLow(Command);    
       
      LCD_E = Disable; 
   } 
    SetRead;       
   SetCommand; 
} 

/******************************************************** 
*  函数说明:向LCD发送数据函数                          * 
********************************************************/ 
void LCDSendData(char Data) 
{ 
    SetWrite; 
   SetData; 
   { 
       LCD_E = Enable; 
       
      LCD_SendHalfCharHigh(Data); 
       
       LCD_E = Disable; 
   } 

   { 
       LCD_E = Enable; 
       
        LCD_SendHalfCharLow(Data);    
       
      LCD_E = Disable; 
   } 
    SetRead;       
   SetCommand; 
} 

/******************************************************** 
*  函数说明:等待LCD空闲状态函数                        * 
********************************************************/ 
void LCDWaitForReady(void) 
{ 
    //DelayUs(30); 
   SetRead; 
   SetCommand; 
    
    LCD_E = Enable;    
     
   while (LCD_BF == Enable);   //RW=1,读PD7,为0表示空闲; 
    
    LCD_E = Disable; 
} 

/******************************************************** 
*  函数说明:设置显示坐标函数                           * 
********************************************************/ 
void LCDSetXY(char X,char Y) 
{ 
    char Address; 
    if (Y == 0) 
   { 
       Address = 0x80 + X; 
   } 
    else 
   {  
        Address = 0xc0 + X; 
   } 
    
   LCDWaitForReady(); 
    LCDSendCommand(Address); 
} 

/******************************************************** 
*  函数说明:LCD字符串显示函数                          * 
********************************************************/ 
void LCDDisplayString(char *String) 
{ 
    while(*String) 
   { 
       LCDWaitForReady(); 
       LCDSendData(*String); 
      String++; 
   } 
} 


/******************************************************** 
*  函数说明:数值显示函数(HEX)                          * 
*  输入:    需要显示的数字                             * 
********************************************************/ 
void LCDDisplayNum(unsigned int Num)

{
char showtext[8]="0"; 

unsigned long temp;
unsigned int a1,a2,a3,a4,a5,a6,a7,a8;
char nn;
char a;
temp=Num;
a1=temp/10000000;
a2=temp/1000000-a1*10;
a3=temp/100000-(a2*10+a1*100);
a4=temp/10000-(a3*10+a2*100+a1*1000);
a5=temp/1000-(a4*10+a3*100+a2*1000+a1*10000);
a6=temp/100-(a5*10+a4*100+a3*1000+a2*10000+a1*100000);
a7=temp/10-(a6*10+a5*100+a4*1000+a3*10000+a2*100000+a1*1000000);
a8=temp-(a7*10+a6*100+a5*1000+a4*10000+a3*100000+a2*1000000+a1*10000000);

if      (a1>0)nn=8;
else if (a2>0)nn=7;
else if (a3>0)nn=6;
else if (a4>0)nn=5;
else if (a5>0)nn=4; 
else if (a6>0)nn=3; 
else if (a7>0)nn=2; 
else if (a8>0)nn=1; 
else nn=0;
switch(nn){
case 8:
showtext[0]=a1+0x30;
showtext[1]=a2+0x30;
showtext[2]=a3+0x30;
showtext[3]=a4+0x30;
showtext[4]=a5+0x30;
showtext[5]=a6+0x30;
showtext[6]=a7+0x30;
showtext[7]=a8+0x30;
for(a=0;a<8;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 7:
showtext[0]=a2+0x30;
showtext[1]=a3+0x30;
showtext[2]=a4+0x30;
showtext[3]=a5+0x30;
showtext[4]=a6+0x30;
showtext[5]=a7+0x30;
showtext[6]=a8+0x30;
for(a=0;a<7;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 6:
showtext[0]=a3+0x30;
showtext[1]=a4+0x30;
showtext[2]=a5+0x30;
showtext[3]=a6+0x30;
showtext[4]=a7+0x30;
showtext[5]=a8+0x30;
for(a=0;a<6;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 5:
showtext[0]=a4+0x30;
showtext[1]=a5+0x30;
showtext[2]=a6+0x30;
showtext[3]=a7+0x30;
showtext[4]=a8+0x30;
for(a=0;a<5;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 4:
showtext[0]=a5+0x30;
showtext[1]=a6+0x30;
showtext[2]=a7+0x30;
showtext[3]=a8+0x30;
for(a=0;a<4;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 3:
showtext[0]=a6+0x30;
showtext[1]=a7+0x30;
showtext[2]=a8+0x30;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 2:
showtext[0]=a7+0x30;
showtext[1]=a8+0x30;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);

}
break;
case 1:
showtext[0]=a8+0x30;
showtext[1]=0x20;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;
case 0:
showtext[0]=0x30;
showtext[1]=0x20;
showtext[2]=0x20;
showtext[3]=0x20;
for(a=0;a<4;a++)
{
LCDWaitForReady(); 
LCDSendData(showtext[a]);
}
break;

}
}
void RunString(char *String,char Direction,char Y,char StartX,char EndX)
{
    static char StringHead = 0;
	char SCREEN[17];
	char a = 0;
	char Point = StringHead;
	char StringLong = StringLenth(String);
	static int RunTimeCounter = 0;
	
	for (a = 0;a<EndX - StartX + 1;a++)
	{
	     SCREEN[a] = String[Point];
		 Point ++;
		 if (Point == StringLong)
		 {
		     Point = 0;
		 }
	}
	
	for (;a < 17;a++)
	{
	    SCREEN[a] =' ';
	}
	
	RunTimeCounter ++;
	if (RunTimeCounter >50)
	{
	    StringHead ++;
		RunTimeCounter = 0;
		if (StringHead == StringLong)
	    {
	        StringHead = 0;
	    }
	}
	
	Locate(StartX,Y)
	Print(SCREEN)
}


void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
  
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }

⌨️ 快捷键说明

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