《LCD1602驱动程序(C51)(6页).doc》由会员分享,可在线阅读,更多相关《LCD1602驱动程序(C51)(6页).doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-LCD1602驱动程序(C51)-第 6 页 *Module:lcd1602_drv.h *Function:lcd1602显示屏驱动程序和中间接口 *Author:槐之林 *Version: 2016-05-29#ifndef _lcd1602_drv_h_#define _lcd1602_drv_h_#ifndef NULL #define NULL (void *) 0L)#endiftypedef unsigned char uchar;typedef unsigned int uint;/LCD1602显示IO#define LCD_DATA P0sbit LCD_RS = P20
2、; sbit LCD_RW = P21;sbit LCD_EP = P22;#include app_common.h#define LCD_CLEAR 1#define LCD_NORMER 2#define LCD_CURSOR_BLINK 3/对外接口bit Lcd_bz(); /忙时判断,1表示忙void Lcd_cmd(uchar cmd); /写指令 void Lcd_ctrl(uchar L, uchar C, uchar CC);/控制函数void Lcd_pos(uchar x,uchar y); /定位void Lcd_ch(uchar ch); /写数据,单个字符并显示v
3、oid Lcd_str(uchar *str, uint len); /写入字符串并显示(用到Lcd_ch()函数)void Lcd_num(int num); /显示整数void Lcd_init();void Lcd_flo(float s,uint n); /浮点显示,n=8; #endif *Module:lcd1602_drv.c *Function:lcd1602显示屏驱动程序和中间接口 *Author:槐之林 *Version: 2016-05-29#include #include #include #include lcd1602_drv.h函数名: bit Lcd_bz()
4、功能 : 测试是否为忙时,返回1为忙,0为闲说明 : bit Lcd_bz() /判是否为忙时bit result;LCD_RS=0;LCD_RW=1;LCD_EP=1;delay_us(5);result=(bit)(LCD_DATA&0x80);LCD_EP=0;return result;函数名: void Lcd_cmd(uchar cmd)功能 : 写指令:cmd说明 : 指令库: 清屏函数: 0X01; 1.64ms 光标归位: 0X02; 1.64ms 模式设置: DB2=1 DB1=I/D DB0=S; I/D=0-写入数据后,光标左移; I/D=1-写入数据后,光标右移; S
5、=0-写入数据后,显示屏不移动; S=1-写入数据后,显示屏右移1; 显示开关控制: DB3=1 DB2=D DB1=C DB0=B; D=0 显示功能关 D=1 显示功能开 C=0 无光标 C=1 有光标 B=0 光标无闪烁 B=1 光标闪烁 设置光标/屏移动方向指令: DB4=1 DB3=S/C DB2=R/L DB1=x DB0=x; S/C R/L 对应指令 0 0 光标左移一格,AC减一 0 1 光标右移一格,AC加一 1 0 显示器上所有字符左移一格,光标不动 1 1 显示器上所有字符右移一格,光标不动 功能设置: 0X38 16*2显示,5*7点阵,8位数据void Lcd_cm
6、d(uchar cmd)while(Lcd_bz();LCD_RS=0;LCD_RW=0; LCD_EP=0;delay_us(5);LCD_DATA=cmd;delay_us(5);LCD_EP=1;delay_us(5);LCD_EP=0; delay_us(5);/控制函数,比如清屏/L/C表示行/列(12)/(116)/CC表示控制指令,指令在.h文件中定义/有些指令没有用于参数C和L,可以赋值为0void Lcd_ctrl(uchar L, uchar C, uchar CC)switch(CC)case LCD_CLEAR:Lcd_cmd(0x01);delay_ms(3);bre
7、ak;case LCD_CURSOR_BLINK:Lcd_pos(L, C);Lcd_cmd(0x0F);break;case LCD_NORMER:Lcd_cmd(0x0C);Lcd_cmd(0x06);Lcd_cmd(0x01);break;default: break;函数名: void Lcd_pos(uchar pos)功能 : 定位说明 : x表示第x行(116) y表示第y列(12)void Lcd_pos(uchar x,uchar y) y=y-1; if (x=1) Lcd_cmd(0x80+y);/表示第一行,位置y处 else if(x=2) Lcd_cmd(0x80
8、+ 0x40 + y);/表示第二行,位置y处函数名:void Lcd_dat(uchar dat)功能 :写数据,显示单个字符说明 :直接写入单个字符,如cvoid Lcd_ch(uchar ch)while(Lcd_bz();LCD_RS=1;LCD_RW=0; LCD_EP=0;LCD_DATA=ch;delay_us(5);LCD_EP=1;delay_us(5);LCD_EP=0; delay_ms(1); /必须有函数名:void Lcd_str(uchar *str, uint len)功能 :写数据,显示字符串说明 :str 为字符串首地址,左对齐 , len字串长度void
9、Lcd_str(uchar *str,uint len)uint i=0;uchar *s=str;while(len0)Lcd_ch(*(s+i);i+;len-;函数名:void Lcd_num(int num)功能 :写数据,显示正整数,从右往左,低位到高位显示,注意定位时应在最左边开始说明 :num 显示数字, DIS_MAX_LEN 显示最大长度,负号-也表示一位#define DIS_MAX_LEN 6void Lcd_num(int num)uchar i, dat_bufDIS_MAX_LEN = 0x00;if(num 0)dat_bufi = (num%10)+0;num
10、= num/10;i = i-1;i = 1;while(dat_bufi = 0)i+;if(dat_buf0 = -)dat_bufi-1 = -;i = i-1;Lcd_str(dat_buf+i, DIS_MAX_LEN-i);函数名:void Lcd_flo2(float s,uint n)功能:浮点数显示说明:严格按有效位 n显示,n=8void Lcd_flo(float s,uint n) uint i=0,k=0;if(s0) Lcd_ch(-); s=-1*s;/判断正负do /获得整数位位数 i s=s/10; i+;while(uint)s!=0);for(k=0;kk
11、) s=s*10; Lcd_ch(uint)s+0);s=s-(uint)s;elseif(i=n) Lcd_ch(0x20);else Lcd_ch(.); i=99; /只要保证ik 执行上面的if() 语句函数名:void Lcd_init()功能 :初始化说明 :无void Lcd_init()Lcd_cmd(0x38); /16*2显示,5*7点阵,8位数据delay_ms(1);Lcd_cmd(0x0c); /显示开,关光标delay_ms(1);Lcd_cmd(0x06); /移动光标delay_ms(1);Lcd_cmd(0x01); /清除LCD的显示内容delay_ms(10);