📄 lcd.c
字号:
#include <p33FJ64GP306.h>
#include "delay.h"
#include <string.h>
// LCD is controlled by this source.
#define LCDLEN 8
// LCD is 8 char x 2 line.
// If longer LCD used, change number.
/*flag:RS, 1 = data, 0 = cmd*/
/*code: upper 4 bit only*/
// PIN
// D.0: E
// D.1: RS
// D.7..4: DB7..4
void lcd_out(int code, int flag)
{
PORTD = code & 0xF0;
Nop();
PORTDbits.RD1 = flag; /* set RS */
Nop();
PORTDbits.RD0 = 0x01; /* E high */
Delay8Tcy();
PORTDbits.RD0 = 0x00; /* E low */
Nop();
}
void lcd_cmd(int cmd) /* 4bit command set routine */
{
lcd_out(cmd,0); /* upper 4 bit */
lcd_out(cmd<<4,0); /* lower 4 bit */
Delay_Us(1);
}
void lcd_data(int ascii)
{
lcd_out(ascii,1); /* upper 4 bit */
lcd_out(ascii<<4,1); /* lower 4 bit */
Delay_Us(1);
}
void lcd_str(char *buffer, int line)
{
int i;
int len;
char lcdbuffer[LCDLEN + 2];
if (line == 2) /* Move to Line2 DDRAM Address */
{
lcd_cmd(0xC0);
}
else /* Move to 0x00 DDRAM Address */
{
lcd_cmd(0x80);
}
// initialize buffer to 0x00
memset(lcdbuffer, 0, sizeof(lcdbuffer));
len = strlen(buffer);
// not to overrun
if (len > LCDLEN) len = LCDLEN;
strncpy(lcdbuffer,buffer,len);
if (len < LCDLEN)
{
// At least LCDLEN characters to fill LCD.
for (i = 0; i < (LCDLEN - len); i++)
{strcat(lcdbuffer, " ");}
}
/*output string to LCD*/
for ( i = 0; i < LCDLEN; i++)
{
lcd_data(lcdbuffer[i]);
}
}
void init_lcd()
{
/* Initialize LCD Display */
TRISD = 0x00;
/* wait > 15ms */
Delay_Us(80);
/* write 00110000=8bit mode */
lcd_out(0x30,1);
/* wait 5ms */
Delay_Us(30);
/* write 00110000=8bit mode */
lcd_out(0x30,1);
/* wait 5ms */
Delay_Us(30);
/* write 00110000=8bit mode */
lcd_out(0x30,1);
/* wait 5ms */
Delay_Us(30);
/* write 00100000=4bit mode */
lcd_out(0x20,1);
/* wait 3ms */
Delay_Us(30);
lcd_cmd(0x2E);
lcd_cmd(0x08);
lcd_cmd(0x0D);
lcd_cmd(0x06);
lcd_cmd(0x02); /* home */
/* wait > 3ms */
Delay_Us(30);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -