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

📄 lcd.c

📁 对显示器LCD的读写和I2C的控制程序
💻 C
字号:
#include "config.h"
#define DISPLAY_ON                0X3F
#define DISPLAY_START_LINE        0XC0

#define SET_X_ADDRESS             0XB8
#define SET_Y_ADDRESS             0X40


void Write_LCDByte(uint8 comd_word)
 {
  if(comd_word&0x01)    IO0SET|=LCD_D0;
  else                  IO0CLR|=LCD_D0;  
            
  if(comd_word&0x02)    IO1SET|=LCD_D1;
  else                  IO1CLR|=LCD_D1;
          
  if(comd_word&0x04)    IO0SET|=LCD_D2;   
  else                  IO0CLR|=LCD_D2;
               
  if(comd_word&0x08)    IO0SET|=LCD_D3;  
  else                  IO0CLR|=LCD_D3;
            
  if(comd_word&0x10)    IO1SET|=LCD_D4;
  else                  IO1CLR|=LCD_D4;
        
  if(comd_word&0x20)    IO0SET|=LCD_D5;
  else                  IO0CLR|=LCD_D5;
              
  if(comd_word&0x40)    IO1SET|=LCD_D6;
  else                  IO1CLR|=LCD_D6;           
        
  if(comd_word&0x80)    IO0SET|=LCD_D7;
  else                  IO0CLR|=LCD_D7;
 }
//========================================================================//

void lcd_delay(uint8 delay_timer)
{
  uint8 delay_t;
  for(delay_t=0;delay_t<delay_timer;delay_t++);
}

void Busy(void)
{  
 	IO0DIR = IO0DIR|LCD_CS1|LCD_CS2|LCD_RW|LCD_E|LCD_D0|LCD_D2|LCD_D3|LCD_D5|LCD_D7;
   	IO1DIR = IO1DIR|LCD_RS|LCD_D1|LCD_D4|LCD_D6;
  	
	IO1CLR|=LCD_RS;     			        //D/I=0
	lcd_delay(10);
	IO0SET|=LCD_RW;						//R/W=1
	lcd_delay(10);
	Write_LCDByte(0X80);//PORTD=0X\F;
	IO0DIR=IO0DIR&0xff7fffff;	
		while(1)
	   {
		    IO0SET|=LCD_E;					//E=1
		    lcd_delay(5);
			IO0CLR|=LCD_E;					//E=0
	    if((IO0PIN&0x00800000)==0)   break;	   				
	   }	
}

void init_LCD(void)
{
  IO0SET|=LCD_CS2;
  lcd_delay(10); 
  IO0CLR|=LCD_CS1;
  lcd_delay(10); 
  write_LCD_comd1(DISPLAY_ON,0);  
  write_LCD_comd1(DISPLAY_START_LINE,0);
  clr_LCD_screen0(0);
  lcd_delay(10); 
  IO0SET|=LCD_CS1;
  lcd_delay(10); 
  IO0CLR|=LCD_CS2;
  write_LCD_comd1(DISPLAY_ON,0);  
  write_LCD_comd1(DISPLAY_START_LINE,0);
  clr_LCD_screen0(1);
}
//===========================================================================//
void write_LCD_comd0(uint8 comd_word)
{	  
      	Busy();
    	IO0DIR = IO0DIR|LCD_CS1|LCD_CS2|LCD_RW|LCD_E|LCD_D0|LCD_D2|LCD_D3|LCD_D5|LCD_D7;
   	    IO1DIR = IO1DIR|LCD_RS|LCD_D1|LCD_D4|LCD_D6;
  	
        lcd_delay(10);
        IO1SET|=LCD_RS;
        lcd_delay(10);
        IO0CLR|=LCD_RW;   
        lcd_delay(10);       
        Write_LCDByte(comd_word);
        lcd_delay(10);				
	    IO0SET|=LCD_E;	
	    lcd_delay(10);					
    	IO0CLR|=LCD_E;
}  	
//===========================================================================//
void write_LCD_comd1(uint8 d1,uint8 comd_word)
{
        Busy();	
	    IO0DIR = IO0DIR|LCD_CS1|LCD_CS2|LCD_RW|LCD_E|LCD_D0|LCD_D2|LCD_D3|LCD_D5|LCD_D7;
        IO1DIR = IO1DIR|LCD_RS|LCD_D1|LCD_D4|LCD_D6;
  	
	    lcd_delay(10);
	    IO0CLR|=LCD_RS;	
      	lcd_delay(10);
      	IO0CLR|=LCD_RW;   
        lcd_delay(10);
        Write_LCDByte(comd_word|d1);    
      	lcd_delay(10);
      	IO0SET|=LCD_E;					
    	lcd_delay(10);
    	IO0CLR|=LCD_E;
}

//----------------------------------------
void clr_LCD_screen0(uint8 Bselect_area)////// clear  the LCD_screen
{

  unsigned char i,j;
  if(Bselect_area)
   {
   IO0CLR|=LCD_CS2;
   IO0SET|=LCD_CS1;   
   
   }
  else
   {
   IO0CLR|=LCD_CS1;
   IO0SET|=LCD_CS2;
   
   }
  lcd_delay(10);   
   for (i=0;i<8;i++)         
   {
    write_LCD_comd1(SET_X_ADDRESS,i);//set the page address
	write_LCD_comd1(SET_Y_ADDRESS,0);//set the list address
    for (j=0;j<64;j++)
      {	 
      write_LCD_comd0(0);  
      }
   }
}

void clr_LCD_screen(void)
{

 clr_LCD_screen0(1);
 clr_LCD_screen0(0); 

}  


//*******************************************************************************
//function:     
//description:  picture modle 
//               
//parameter:   *word_tab---the first address of the word modle in code area         
//             word_position_x,word_position_y---the coordinate of the word or 
//                                               picture corresponding to the character
//                                               word in the screen                   
//             m---the dots number per row    ex. 8,16,24,32....
//             n---the dots number per list   ex. 8,16,24,32....                            
//return value:                                                             
//*******************************************************************************
void show_picture(uint8 const *word_tab,uint8 word_position_x,uint8 word_position_y,uint8 m,uint8 n)
{
  uint8 const *temp_pointer;
  uint8 i,j;
  uint8 Bchange_area;

  temp_pointer=word_tab;
  for (i=0;i<n/8;i++)         
   {
    if(word_position_y<64&&word_position_y+m>64)
     Bchange_area=1;
    else
     Bchange_area=0;

    if(word_position_y/64)
     {
      IO0CLR|=LCD_CS2;
      IO0SET|=LCD_CS1;
	
     }
    else
     {
      IO0CLR|=LCD_CS1;
      IO0SET|=LCD_CS2;
	
     }
    lcd_delay(10);
    write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);//写地址命令
	write_LCD_comd1(SET_Y_ADDRESS,word_position_y%64);
    for (j=0;j<m;j++)
      {
	   if(Bchange_area)
	   {
	    
        if(word_position_y+j>=64)
         {
          Bchange_area=0;
	      IO0CLR|=LCD_CS2;
          IO0SET|=LCD_CS1;
		  write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);
          write_LCD_comd1(SET_Y_ADDRESS,0); 	
	     }
	   }
       write_LCD_comd0(*temp_pointer++);
      }
   } 
}


void show_picture_n(uint8 const *word_tab,uint8 word_position_x,uint8 word_position_y,uint8 m,uint8 n)
{
  uint8 const *temp_pointer;
  uint8 i,j;
  uint8 Bchange_area;
  temp_pointer=word_tab;
  for (i=0;i<n/8;i++)         
   {
    if(word_position_y<64&&word_position_y+m>64)
     Bchange_area=1;
    else
     Bchange_area=0;
    if(word_position_y/64)
     {
      IO0CLR=LCD_CS2;
      IO0SET=LCD_CS1;
	
     }
    else
     {
      IO0CLR=LCD_CS1;
      IO0SET=LCD_CS2;
	
     }
    lcd_delay(10);
    write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);
	write_LCD_comd1(SET_Y_ADDRESS,word_position_y%64);
    for (j=0;j<m;j++)
      {
	   if(Bchange_area)
	   {
	    
        if(word_position_y+j>=64)
         {
          Bchange_area=0;
	      IO0CLR=LCD_CS2;
          IO0SET=LCD_CS1;
	      lcd_delay(10);
		  write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);
          write_LCD_comd1(SET_Y_ADDRESS,0); 	
	     }
	   }
       write_LCD_comd0(~(*temp_pointer++)); 
      }
   }
}   

void erase_picture(uint8 word_position_x,uint8 word_position_y,uint8 m,uint8 n)
{
  uint8 i,j;
  uint8 Bchange_area;
  lcd_delay(10); 

  for (i=0;i<n/8;i++)         
   {
    if(word_position_y<64&&word_position_y+m>64)
     Bchange_area=1;
    else
     Bchange_area=0;
    if(word_position_y/64)
     {
      IO0CLR=LCD_CS2;
      IO0SET=LCD_CS1;
	
     }
    else
     {
      IO0CLR=LCD_CS1;
      IO0SET=LCD_CS2;
	
     }
     lcd_delay(10);
    write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);
	write_LCD_comd1(SET_Y_ADDRESS,word_position_y%64);

    lcd_delay(10);
     
    for (j=0;j<m+1;j++)
      {
	   if(Bchange_area)
	   {
	    
        if(word_position_y+j>=64)
         {
          Bchange_area=0;
	      IO0CLR=LCD_CS2;
          IO0SET=LCD_CS1;
	      lcd_delay(10);
		  write_LCD_comd1(SET_X_ADDRESS,word_position_x/8+i);
          write_LCD_comd1(SET_Y_ADDRESS,0); 	
	     }
	   }
       write_LCD_comd0(0); 
      }     
   }
}
//===========================================================================//


void Show_Picture_data(uint8 data,uint8 x,uint8 y)
{
	
	uint8 w=8,h=16;
	switch(data)
	{
		case '0':
		show_picture(ASCII_0,x,y,w,h);
		break;
		case '1':
		show_picture(ASCII_1,x,y,w,h);
		break;
		case '2':
		show_picture(ASCII_2,x,y,w,h);
		break;
		case '3':
		show_picture(ASCII_3,x,y,w,h);
		break;
		case '4':
		show_picture(ASCII_4,x,y,w,h);
		break;
		case '5':
		show_picture(ASCII_5,x,y,w,h);
		break;
		case '6':
		show_picture(ASCII_6,x,y,w,h);
		break;
		case '7':
		show_picture(ASCII_7,x,y,w,h);
		break;
		case '8':
		show_picture(ASCII_8,x,y,w,h);
		break;
		case '9':
		show_picture(ASCII_9,x,y,w,h);
		break;
		
		case 'A':
		show_picture(asc_A,x,y,w,h);
		break;
		case 'B':
		show_picture(asc_B,x,y,w,h);
		break;
		case 'C':
		show_picture(asc_C,x,y,w,h);
		break;
		case 'D':
		show_picture(asc_D,x,y,w,h);
		break;
		case 'E':
		show_picture(asc_E,x,y,w,h);
		break;
		case 'F':
		show_picture(asc_F,x,y,w,h);
		break;
		case 'G':
		show_picture(asc_G,x,y,w,h);
		break;
		case 'H':
		show_picture(asc_H,x,y,w,h);
		break;
		case 'I':
		show_picture(asc_I,x,y,w,h);
		break;
		case 'J':
		show_picture(asc_J,x,y,w,h);
		break;
		case 'K':
		show_picture(asc_K,x,y,w,h);
		break;
		case 'L':
		show_picture(asc_L,x,y,w,h);
		break;
		case 'M':
		show_picture(asc_M,x,y,w,h);
		break;
		case 'N':
		show_picture(asc_N,x,y,w,h);
		break;
		case 'O':
		show_picture(asc_O,x,y,w,h);
		break;
		case 'P':
		show_picture(asc_P,x,y,w,h);
		break;
		case 'Q':
		show_picture(asc_Q,x,y,w,h);
		break;
		case 'R':
		show_picture(asc_R,x,y,w,h);
		break;
		case 'S':
		show_picture(asc_S,x,y,w,h);
		break;
		case 'T':
		show_picture(asc_T,x,y,w,h);
		break;
		case 'U':
		show_picture(asc_U,x,y,w,h);
		break;
		case 'V':
		show_picture(asc_V,x,y,w,h);
		break;
		case 'W':
		show_picture(asc_W,x,y,w,h);
		break;
		case 'X':
		show_picture(asc_X,x,y,w,h);
		break;
		case 'Y':
		show_picture(asc_Y,x,y,w,h);
		break;
		case 'Z':
		show_picture(asc_Z,x,y,w,h);
		break;	
		
/*			
		case 'a':
		show_picture(asc_a,x,y,w,h);
		break;
		case 'b':
		show_picture(asc_b,x,y,w,h);
		break;
		case 'c':
		show_picture(asc_c,x,y,w,h);
		break;
		case 'd':
		show_picture(asc_d,x,y,w,h);
		break;
		case 'e':
		show_picture(asc_e,x,y,w,h);
		break;
		case 'f':
		show_picture(asc_f,x,y,w,h);
		break;
		case 'g':
		show_picture(asc_g,x,y,w,h);
		break;
		case 'h':
		show_picture(asc_h,x,y,w,h);
		break;
		case 'i':
		show_picture(asc_i,x,y,w,h);
		break;
		case 'j':
		show_picture(asc_j,x,y,w,h);
		break;
		case 'k':
		show_picture(asc_k,x,y,w,h);
		break;
		case 'l':
		show_picture(asc_l,x,y,w,h);
		break;
		case 'm':
		show_picture(asc_m,x,y,w,h);
		break;
		case 'n':
		show_picture(asc_n,x,y,w,h);
		break;
		case 'o':
		show_picture(asc_o,x,y,w,h);
		break;
		case 'p':
		show_picture(asc_p,x,y,w,h);
		break;
		case 'q':
		show_picture(asc_q,x,y,w,h);
		break;
		case 'r':
		show_picture(asc_r,x,y,w,h);
		break;
		case 's':
		show_picture(asc_s,x,y,w,h);
		break;
		case 't':
		show_picture(asc_t,x,y,w,h);
		break;
		case 'u':
		show_picture(asc_u,x,y,w,h);
		break;
		case 'v':
		show_picture(asc_v,x,y,w,h);
		break;
		case 'w':
		show_picture(asc_w,x,y,w,h);
		break;
		case 'x':
		show_picture(asc_x,x,y,w,h);
		break;
		case 'y':
		show_picture(asc_y,x,y,w,h);
		break;
		case 'z':
		show_picture(asc_z,x,y,w,h);
		break;
	
		case ':':
		show_picture(maohao,x,y,w,h);
		break;
		
		case '_':
		show_picture(Xhx,x,y,w,h);
		break;
		
		case '|':
		show_picture(Shx,x,y,w,h);
		break;
		
		case '.':
		show_picture(dian,x,y,w,h);
		break;
		default:
		show_picture(ASCII_0,x,y,w,h);
		break;
			  
*/	
	}
	

}


void Show_Str(uint8 *str,uint8 x,uint8 y,uint8 lenth)
{
	uint8 i;
	for(i=0;i<lenth;i++)
	{
		Show_Picture_data(str[i],x,(y+(8*i)));
	}

}

⌨️ 快捷键说明

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