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

📄 lcd_ad877.c

📁 用C语言实现PIC的LCD显示
💻 C
字号:
#include    <pic.h>
#include    <math.h>
#include    <stdlib.h>
#include	<delay.h>
//#define	LCD_D4		PORTD, 0	; LCD data bits
//#define	LCD_D5		PORTD, 1
//#define	LCD_D6		PORTD, 2
//#define	LCD_D7		PORTD, 3

//#define	LCD_D4_DIR	TRISD, 0	; LCD data bits
//#define	LCD_D5_DIR	TRISD, 1
//#define	LCD_D6_DIR	TRISD, 2
//#define	LCD_D7_DIR	TRISD, 3

//#define	LCD_E		PORTA, 1	; LCD E clock
//#define	LCD_RW		PORTA, 2	; LCD read/write line
//#define	LCD_RS		PORTA, 3	; LCD register select line

//#define	LCD_E_DIR	TRISA, 1	
//#define	LCD_RW_DIR	TRISA, 2	
//#define	LCD_RS_DIR	TRISA, 3	

//#define	LCD_INS		0	
//#define	LCD_DATA	1

unsigned  char  Temp_wr;
unsigned  char  Temp_rd;
unsigned  int   delay;
unsigned  char  LCDMode;
unsigned  char  LCDMode_R;

unsigned  char  AD_Model   ;
unsigned  char  AD_Times   ;
unsigned  char  AD_VReultB ;
unsigned  char  AD_CReultB ;
unsigned  int   AD_Vols;
unsigned  int   AD_Curs;
   div_t        FrontD ; 
   div_t        BackD  ;
unsigned  char  Swapval;
unsigned  char  WrData ;
unsigned  char  i,k,j;
const     char  table[64]={' ',' ',' ',' ','W','E','L','C',
		    	           'O','M','E','!',' ',' ',' ',' ',
                           'H','N',' ','E','l','e','c','t',
                           '-','T','e','c','.','L','t','d',
                           ' ','V','o','l','t','s',':',' ',
		    	           ' ',' ',' ',' ',' ',' ',' ','V',
                           ' ','C','u','r','r','t',':',' ',
                           ' ',' ',' ',' ',' ',' ',' ','A'};


void DelayMs(unsigned char cnt)    // Delay Subproguam
{
#if	XTAL_FREQ <= 2MHZ
	do {
		DelayUs(996);
	} while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ	
	unsigned char	i;
	do {
		i = 4;
		do {
			DelayUs(250);
		} while(--i);
	} while(--cnt);
#endif
}

void LCDRead()
{
  RA1 =0 ;    //LCD_E =0 ;
  
  TRISD0=1;
  TRISD1=1;
  TRISD2=1;
  TRISD3=1;
  
  if (LCDMode_R==0)
     RA3 =0 ;                 //LCD_RS=0;
  else if (LCDMode_R==1)
     RA3 =1 ;                 //LCD_RS=1; 

  RA2 =1 ;                    //LCD_RW =1 ;
  #asm
   NOP
   NOP
  #endasm
  RA1 =1 ;                    //LCD_E =1 ;
  #asm
   NOP
   NOP
   NOP
   NOP
  #endasm

  if (RD3==1) 
     Temp_rd = Temp_rd | 0x80 ;
  else
     Temp_rd = Temp_rd & 0x7F ;
  if (RD2=1) 
     Temp_rd = Temp_rd | 0x40 ;
  else
     Temp_rd = Temp_rd & 0xBF ;
  if (RD1==1) 
     Temp_rd = Temp_rd | 0x20 ;
  else
     Temp_rd = Temp_rd & 0xDF ;
  if (RD0=1) 
     Temp_rd = Temp_rd | 0x10 ;
  else
     Temp_rd = Temp_rd & 0xEF ;
  
  RA1 =0 ;    //LCD_E =0 ;
  #asm
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
   NOP
  #endasm    

  RA1 =1 ;    //LCD_E =1 ;
  
  #asm
   NOP
   NOP
  #endasm

  if (RD3==1) 
     Temp_rd = Temp_rd | 0x08 ;
  else
     Temp_rd = Temp_rd & 0xF7 ;
  if (RD2=1) 
     Temp_rd = Temp_rd | 0x04 ;
  else
     Temp_rd = Temp_rd & 0xFB ;
  if (RD1==1) 
     Temp_rd = Temp_rd | 0x02 ;
  else
     Temp_rd = Temp_rd & 0xFD ;
  if (RD0=1) 
     Temp_rd = Temp_rd | 0x01 ;
  else
     Temp_rd = Temp_rd & 0xFE ;

  RA1 =0 ;    //LCD_E =0 ;  
  #asm
   NOP
   NOP
   NOP
   NOP
  #endasm
  }
void LCDBUSY()
{
  while(1)
         {
          LCDMode_R = 0 ;
          LCDRead();
          if ((Temp_rd & 0x80)==0) 
              { 
                DelayMs(1);
                break;      
                }  
           }
 }


void LCDWriteNibble()
{ 
  RA1 =0 ;    //LCD_E =0 ;
  if (LCDMode==0)
     RA3 =0 ;                 //LCD_RS=0;
  else if (LCDMode==1)
     RA3 =1 ;                 //LCD_RS=1; 
  RA2 =0 ;                    //LCD_RW =0 ;

  TRISD0=0;
  TRISD1=0;
  TRISD2=0;
  TRISD3=0;
  #asm
   NOP
   NOP
  #endasm
  RA1 =1 ;                     //LCD_E =1 ;

  if ((Temp_wr & 0x80)==0x80) 
     RD3=1 ;
  else
     RD3=0 ;
  if ((Temp_wr & 0x40)==0x40) 
     RD2=1 ;
  else
     RD2=0 ;  
  if ((Temp_wr & 0x20)==0x20) 
     RD1=1 ;
  else
     RD1=0 ;
  if ((Temp_wr & 0x10)==0x10) 
     RD0=1 ;
  else
     RD0=0 ; 
 
  #asm
   NOP
   NOP
  #endasm
  RA1 =0 ;    //LCD_E =0 ;
 }

void LCDWrite()
{
  LCDBUSY();
  //DelayMs(6);
  LCDWriteNibble();
  #asm
   banksel  Temp_wr 
   swapf   _Temp_wr , f
  #endasm
  LCDWriteNibble();
  #asm
   swapf   _Temp_wr , f
  #endasm
 }

void  DWrite()
{
  LCDBUSY();
  //DelayMs(6);
  LCDMode =1 ;
  LCDWrite();
}

void IWrite()
{
  LCDBUSY();
  //DelayMs(6);
  LCDMode =0 ;
  LCDWrite();
 }

void  LCDLine1()   // B'100000000'  Set DDRAM addresss 00H (the 1 line begin )
{
  Temp_wr= 0X80;   
  IWrite();
}

void  LCDLine_2()  // B'110000000'  Set DDRAM addresss 40H (the 2 line begin )
{
  Temp_wr=0xC0;
  IWrite();
}

void  LCDInit()
{
  /*LCD_E_DIR=0	;
  LCD_RW_DIR=0	;
  LCD_RS_DIR=0    ;*/
  TRISA1 =0;
  TRISA2 =0;
  TRISA3 =0;

  ADCON1=0x0E  ;       // B'00001110'

  //delay15ms()  ;       // Delay 15ms @ 4M 
  DelayMs(15); 
 
  Temp_wr=0x30 ;       // B'00110000'
  LCDMode =0 ;
  LCDWriteNibble();

  //delay5ms()  ;       // Delay 5ms @ 4M 
  DelayMs(6);

  Temp_wr=0x30 ;       // B'00110000'
  LCDMode =0 ;
  LCDWriteNibble();

  //delay100us()  ;       // Delay 100u @ 4M 
  DelayUs(100);
  
  Temp_wr=0x30 ;       // B'00110000'
  LCDMode =0 ;
  LCDWriteNibble();

  //delay100us()  ;       // Delay 100u @ 4M 
  DelayUs(100);

  Temp_wr=0x20 ;       // B'00100000'  Set LCD 4 Data bit
  LCDMode =0 ;
  LCDWriteNibble();

  //LCDBUSY();           //????????????????????????????  

  Temp_wr=0x28 ;       // B'00101000'  Set LCD 5*7
  IWrite();

  Temp_wr=0x0D ;       // B'00001101'  Display = ON
  IWrite();

  Temp_wr=0x01 ;       // B'00000001' Clear LCD
  IWrite();

  Temp_wr=0x06 ;       // B'00000110'
  IWrite();


  Temp_wr=0x80 ;       // B'100000000'  Set DDRAM addresss 00H
  IWrite();

  //Temp_wr=0x02 ;     // B'00000010'
  //IWrite();
 }

void StringL1_Display()
{
   LCDLine1() ;
   for(k=i;k<(16+i);k++)
    {     
     Temp_wr = table[k];
     DWrite();
     } 
 } 
 
void StringL2_Display()
{
   LCDLine_2() ;
   for(k=i;k<(16+i);k++)
    {     
     Temp_wr = table[k];
     DWrite();
     } 
 } 

void LCD_CLear()
{
  Temp_wr=0x01 ;       // B'00000001' Clear LCD
  IWrite();
 }
//--------------------------------------------------------------
unsigned char AscIITable(unsigned int num) 
{
  unsigned char Rultchar ;
  switch(num){
    case 0:
      Rultchar = '0'; 
      break ;
    case 1:
      Rultchar = '1'; 
      break ;
    case 2:
      Rultchar = '2'; 
      break ;
    case 3:
      Rultchar = '3'; 
      break ;
    case 4:
      Rultchar = '4'; 
      break ;
    case 5:
      Rultchar = '5'; 
      break ;
    case 6:
      Rultchar = '6'; 
      break ;
    case 7:
      Rultchar = '7'; 
      break ;
    case 8:
      Rultchar = '8'; 
      break ;
    case 9:
      Rultchar = '9'; 
      break ;
   }
  return Rultchar;
 }

void adinitial()
{ ADCON0=0x41 ;  //  Vol----A/D----Channl--0
  ADCON1=0x0E ;  //  A/D Channl RA0 is 'A' ,Other is 'D'
  AD_Model= 'v';
  TRISA0=1;
 }

void ad_RultDisp()
{
  AD_Vols = AD_Vols * 2;    // change the 2 ,is change range.
  FrontD = div(AD_Vols,100);
  BackD  = div(FrontD.rem,10); 
  Temp_wr=0x8A ;                // B'100001010'  Set DDRAM addresss 0AH
  IWrite();
  /*
  Temp_wr = AscIITable(FrontD.quot);
  DWrite();
  Temp_wr = '.';
  DWrite();
  Temp_wr = AscIITable(BackD.quot);
  DWrite();
  Temp_wr = AscIITable(BackD.rem);
  DWrite();
  */
  Temp_wr = FrontD.quot+0x30;
  DWrite();
  Temp_wr = '.';
  DWrite();
  Temp_wr = BackD.quot+0x30;
  DWrite();
  Temp_wr = BackD.rem +0x30;
  DWrite();
 } 

void main()
{ 
  LCDInit();
  i=0;
  StringL1_Display();
  i=16;
  StringL2_Display();
  for (j=0;j<100;j++)
       DelayMs(20);
  adinitial();
  i=32;
  StringL1_Display();
  i=48;
  StringL2_Display();
  AD_Times = 0 ;
  AD_Vols = 0  ;
  ADGO=1;
  while(1)
     {
       if (ADGO==0)
          {  
            AD_Times = AD_Times + 1 ; 
            AD_VReultB = ADRESH     ;          //   AD_VReultB----存放适时的A/D采样结果。
            AD_Vols = AD_Vols + AD_VReultB ;            
            if (AD_Times >= 16)
               {
                 // AD_Vols = AD_Vols/AD_Times ;
                 AD_Vols = AD_Vols >> 4; 
                 ad_RultDisp() ;
                 AD_Times = 0 ;
                 AD_Vols = 0  ;
                }
            ADGO=1; 
           }
      }
  }

⌨️ 快捷键说明

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