#include
#include
#define lcd1602_db P0
typedef unsigned int uint16;
sbit lcd1602_en=P2^4;
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
/*
LCD1602指令
显示模式设置指令
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 DL N F * *
DL=1; 8位数据接口气 DL=0; 4位数据接口
N=1; 两行显示; N=0;单行显示
F=1; 5*10点阵字符 F=0.5*8点阵字符
*/
#define lcd_mode_pin8 0x38 //8位数据口,两行,5*8点阵
#define lcd_mode_pin4 0x28 //4位数据口,两行,5*8点阵
#define lcd_screen_clr 0x01 //清屏幕
#define lcd_cursor_rst 0x02 //光标复位
// 显示开关控制指令
#define lcd_dis_cur_blk_on 0x0F //显示开,光标开,光标闪烁
#define lcd_dis_cur_on 0x0E //显示开,光标开,光标不闪烁
#define lcd_dis_on 0x0C //显示开,光标关,光标不闪烁
#define lcd_dis_off 0x08 //显示关,光标关,光标不闪烁
//显示模式控制
# define lcd_cursor_right 0x06 //光标右移,显示不移动
# define lcd_cursor_left 0x04 //光标左移,显示不移动
# define lcd_dis_mode_left 0x07 //操作后,AC自增,画面平移,
# define lcd_dis_mode_right 0x05 //操作后,AC自减,画面平移,
//光标、显示移动指令
#define lcd_cur_move_left 0x10 //光标左移
#define lcd_cur_move_right 0x14 //光标左移
#define lcd_dis_move_left 0x18 //光标左移
#define lcd_dis_move_right 0x1C //光标左移
/*
DDRAM 地址设置
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 A6 A5 A4 A3 A2 A1 A0
N=0; 单行显示 A6 - A0=00H-4FH
N=1; 首行 A6 - A0=00H-27H
次行 A6 - A0=40H-67H
读BF / AC 值(BF:BUSY FLAG)
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 BF A6 A5 A4 A3 A2 A1 A0
写数据
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 A7 A6 A5 A4 A3 A2 A1 A0
写命令
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 A7 A6 A5 A4 A4 A3 A2 A1
*/
void lcdreadbf()
{
unsigned char state;
unsigned char i;
lcd1602_db=0xff;//i0口置1 做输入
lcd1602_rs=0;
lcd1602_rw=1;
do
{
lcd1602_en=1;
state=lcd1602_db;
lcd1602_en=0;
i++;
if(i>50)
break;
}
while(state&0x80);
}
void lcdwritecmd(unsigned char cmd)
{
lcdreadbf();//等待忙检测 ,不忙时操作
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_db=cmd;
lcd1602_en=1;
lcd1602_en=0;
}
void lcdwritedata(unsigned char dat)
{
lcdreadbf(); //等待忙检测 ,不忙时操作
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_db=dat;
lcd1602_en=1;
lcd1602_en=0;
}
void lcdinit()
{
lcdwritecmd(lcd_mode_pin8); //显示模式设置 2行,5*8点阵
lcdwritecmd(lcd_dis_on); //显示开 光标关
lcdwritecmd(lcd_cursor_right); //光标右移
lcdwritecmd(lcd_screen_clr); //清屏
}
void lcdshowstr(unsigned char x,unsigned char y,unsigned char *str)
{
if(0==y)
{
lcdwritecmd(0x80|x);
}
else
{
lcdwritecmd(0x80|0x40+x);
}
while(*str!='\0')
{
lcdwritedata(*str++);
}
}
void main()
{
unsigned char i;
unsigned char str[]=" hello everybody ";
unsigned char str1[]=" 123456789abcdefg";
lcdinit();
//lcdwritecmd(lcd_dis_mode_left);
delay(30);
while(1)
{
lcdwritecmd(0x80);
for(i=0;i
{
lcdwritedata(str[i]);
}
lcdwritecmd(0xc0);
for(i=0;i
{
lcdwritedata(str1[i]);
}
lcdwritecmd(0x18);
delay(65535);
}
}
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>2;i--)
for(j=1;j>2;j--);
}