📄 lcd.c
字号:
#include <pic.h>
#define RESET RB1 //L delay 40ms then H delay20ms, safe reset!
#define PSB RB5 // H: Parrel mode, L: Serial mode
#define E RB4 //Enable LCM data input.
#define RW RB3 //H: Read L: Write
#define RS RB2 // H: Data L: Instruction Code
void DELAY20MS(void); //注意位定义 c 中用 RB 来定义i\o口的位
void init(void);
void wr_data(void);
void wr_commonde(void);
void hz_input(void);
void che_busy(void);
char LCMCOMM=0X00;
char LCMDATA=0X00;
void DELAY20MS()
{
char i=0,j=0;
for(i=0;i<=250;i++)
{
for(j=0;j<=200;j++)
{
;
}
}
}
void init()
{
TRISB=0X00;
TRISD=0X00;
ADCON0=0X00; //OFF A/D
ADCON1=0B00000110;
RESET=0;
DELAY20MS();
RESET=1;
DELAY20MS();
PSB=1;
LCMCOMM=0X01; //CLER AND DISPLAY
wr_commonde();
LCMCOMM=0X02; //address reset
wr_commonde();
LCMCOMM=0X06; //000001 I\D S I=LIFT D=RIGHT
wr_commonde();
LCMCOMM=0B00001110; //OOOO1DCB D=1=FULL DISPLAY C=1=GB=ON B=1=SS=ON
wr_commonde();
LCMCOMM=0B00110000; //001DL0RE00 DL=1=8bit RE=0=basic COMM
wr_commonde();
}
void wr_commonde()
{
che_busy();
RW=0;
NOP(); //之所以加nop防止操作口发生冲突
NOP();
NOP();
RS=0;
NOP();
NOP();
NOP();
E=1;
PORTD=LCMCOMM;
E=0;
}
void hz_input()
{
char a[]="您好,世界!"; ///////字符串的大小不用给出
char i=0;
LCMCOMM=0X80;
wr_commonde();
while(a[i]!=0)
{
LCMDATA=a[i]; //注意赋值的先后顺序
wr_data();
i++;
}
}
void wr_data()
{
che_busy();
RW=0;
NOP();
NOP();
NOP();
RS=1;
NOP();
NOP();
NOP();
E=1;
NOP();
NOP();
NOP();
PORTD=LCMDATA;
NOP();
NOP();
NOP();
E=0;
}
void che_busy()
{
TRISD=0XFF; //注意i\o口的方向
RW=1;
NOP();
NOP();
NOP();
RS=0;
NOP();
NOP();
NOP();
E=1;
NOP();
NOP();
NOP();
while(RD7==1)
{
;
}
NOP();
NOP();
NOP();
E=0;
TRISD=0X00;
}
void main()
{
while(1)
{
init();
hz_input();
while(1); //programe over
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -