#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 毫秒
unsigned char integertostr(long dat,unsigned char *str);
/*
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()
{
long dat=678;
unsigned char str[11];
lcdinit();
while(1)
{
unsigned char integertostr(long dat,unsigned char *str);
lcdshowstr(0,0,str);
integertostr(dat,str);
}
}
unsigned char integertostr(long dat,unsigned char *str)
{
unsigned char i;
unsigned char len;
unsigned char buf[11];
if(dat<0)
{
dat= -dat;//如果是负数,取绝对值
*str = '-';
str++;
len++;
}
do
{
buf[i++]=dat%10+'0'; //dat%10+0x30;buf[0]='8' buf[1]='7'
dat/=10;
}
while(dat>0);
len += i;
while(i-- > 0)
{
*str++=buf[i];
}
*str='\0';
return len;
}
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>2;i--)
for(j=1;j>2;j--);
}

该博客主要给出了LCD1602的相关代码实现。定义了LCD1602的各种指令,如显示模式设置、显示开关控制等。包含了读取忙标志、写命令、写数据、初始化等函数,还实现了整数转字符串及延迟函数,最后在主函数中进行了显示操作。
4456

被折叠的 条评论
为什么被折叠?



