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

📄 lcd.c

📁 dsPIC30F4011 + 4*4 metrix Keypad(flexible pin I/O) + Timer0 service >> MPLAB Project files &
💻 C
字号:
#include <p30f4011.h> 
#include "..\h\lcd.h"
#include "..\h\delay.h"

/* 
RS -> RD3
E  -> RE8
RW -> RD1
DATA -> RE0 - RE3   
*/

const char lcdhex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

// Control signal data pins 
#define  RS  LATDbits.LATD3      // LCD RS signal
#define  RW  LATDbits.LATD1 
#define  E   LATEbits.LATE8      // LCD E signal 

// Control signal pin direction 
#define  RS_TRIS  TRISDbits.TRISD3
#define  RW_TRIS  TRISDbits.TRISD1
#define  E_TRIS	  TRISEbits.TRISE8

// Data signals and pin direction
#define  DATAPORT   PORTE
#define  DATAOUT_bit4   LATEbits.LATE0           // Port for LCD data
#define  DATAOUT_bit5   LATEbits.LATE1           // Port for LCD data
#define  DATAOUT_bit6   LATEbits.LATE2           // Port for LCD data
#define  DATAOUT_bit7   LATEbits.LATE3           // Port for LCD data

#define  DATAIN_bit4   PORTEbits.RE0           // Port for LCD data
#define  DATAIN_bit5   PORTEbits.RE1           // Port for LCD data
#define  DATAIN_bit6   PORTEbits.RE2           // Port for LCD data
#define  DATAIN_bit7   PORTEbits.RE3           // Port for LCD data

// I/O setup for data Port
#define  TRISDATA     TRISE         
#define  Dbit4_TRIS   TRISEbits.TRISE0           // Port for LCD data
#define  Dbit5_TRIS   TRISEbits.TRISE1           // Port for LCD data
#define  Dbit6_TRIS   TRISEbits.TRISE2           // Port for LCD data
#define  Dbit7_TRIS   TRISEbits.TRISE3           // Port for LCD data

/*****	LCD SUBROUTINE  *****/

void  init_lcd(void)
{
	/* set initial states for the data and control pins */
    Dbit4_TRIS = 0;
    Dbit5_TRIS = 0;
    Dbit6_TRIS = 0;
    Dbit7_TRIS = 0;

	/* set data and control pins to outputs */
    DATAOUT_bit4 = 0;
    DATAOUT_bit5 = 0;
    DATAOUT_bit6 = 0;
    DATAOUT_bit7 = 0;

    RS_TRIS	= 0;
    RW_TRIS = 0;
    E_TRIS = 0; 

	RS = 0;                       // RS state set low
	E = 0;                        // E state set low
    RW = 0;

    Delay(Delay_5mS_Cnt);    

    lcd_send_nibble(0x03);
    lcd_pulse();
    Delay(Delay_5mS_Cnt);    

    lcd_send_nibble(0x03);
    lcd_pulse();
    Delay(Delay_5mS_Cnt);    

    lcd_send_nibble(0x03);
    lcd_pulse();
    Delay(Delay_5mS_Cnt);    

    lcd_send_nibble(0x02);
    lcd_pulse();
    Delay(Delay_5mS_Cnt);    

    lcd_send_byte( 0x28 ,0); 
    lcd_send_byte( 0x0C ,0);  //display on,cursor  off
    lcd_send_byte( 0x01 ,0);  //clear
    lcd_send_byte( 0x06 ,0);
}

void lcd_send_nibble(unsigned char nibble) 
{ 
    if(nibble & 1) DATAOUT_bit4 = 1; else DATAOUT_bit4 = 0;
    if(nibble & 2) DATAOUT_bit5 = 1; else DATAOUT_bit5 = 0;
    if(nibble & 4) DATAOUT_bit6 = 1; else DATAOUT_bit6 = 0;
    if(nibble & 8) DATAOUT_bit7 = 1; else DATAOUT_bit7 = 0;
} 

void lcd_puts(char *s)
{
static char c;
    while ((c = *s++)) {
        lcd_putc(c);
    }
}

void lcd_putc(char c)
{ 
    switch(c) { 
      case '\f'   : 
         lcd_send_byte( 1 ,0); 
         break; 
      case '\n'   : 
         lcd_gotoxy(2,1);        
         break; 
      case '\b'   : 
         lcd_send_byte( 0x10 ,0);  
         break; 
      default     : 
         lcd_send_byte( c ,1);      
         break; 
   } 
}                                        

void lcd_gotoxy(unsigned char row, unsigned char col){static unsigned char LCD_Add;
    switch(col) {
        case 1 : LCD_Add=0x00;break;   // line 1
        case 2 : LCD_Add=0x40;break;   // line 2
        case 3 : LCD_Add=0x10;break;   // line 3
        case 4 : LCD_Add=0x50;break;   // line 4 
    }
    LCD_Add += row-1;
    lcd_send_byte( (0x80 | LCD_Add),0);
}

void lcd_pulse(void)
{
    E = 1;
    Delay_Us(50);
    E = 0;
    Delay_Us(50);
}       

void lcd_send_byte(unsigned char data, unsigned char command)
{
    while ( (lcd_read_byte() & 0x80) ) ;

    RS = command;
    RW = 0;
    Delay_Us(50);
    lcd_send_nibble(data >> 4); // MSB
    lcd_pulse();
    lcd_send_nibble(data);      // LSB
    lcd_pulse();
}


unsigned char lcd_read_nibble(void) 
{ 
static unsigned char retval;
    retval  = 0x00;
    retval |= (DATAIN_bit4<<0)|(DATAIN_bit5<<1)|(DATAIN_bit6<<2)|(DATAIN_bit7<<3); 
return(retval); 
} 

unsigned char lcd_read_byte(void) 
{ 
static unsigned char low; 
static unsigned char high; 

    Dbit4_TRIS = 1;
    Dbit5_TRIS = 1;
    Dbit6_TRIS = 1;
    Dbit7_TRIS = 1;
 
    RS = 0;
    RW = 1;
    Delay_Us(50);
    
    E = 1;
    Delay_Us(50);

    high = lcd_read_nibble(); 

    E = 0;
    Delay_Us(50);

    E = 1;
    Delay_Us(50);

    low = lcd_read_nibble(); 

    E = 0;
    Delay_Us(50);

    Dbit4_TRIS = 0;
    Dbit5_TRIS = 0;
    Dbit6_TRIS = 0;
    Dbit7_TRIS = 0;

    high = high << 4;
    low = low ;

return(high|low); 

} 

void lcd_16bitHex(int hexIn)
{
	lcd_putc((char)lcdhex[((hexIn & 0xF000) >> 12)]);	
	lcd_putc((char)lcdhex[((hexIn & 0x0F00) >> 8)]);	   
	lcd_putc((char)lcdhex[((hexIn & 0x00F0) >> 4)]);	
	lcd_putc((char)lcdhex[((hexIn & 0x000F))]);	  
}

⌨️ 快捷键说明

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