📄 lcd.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 + -