您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > LCD1602驱动程序(C51)
/**********************************************************************************Module:lcd1602_drv.h*Function:lcd1602显示屏驱动程序和中间接口*Author:槐之林**Version:2016-05-29*********************************************************************************/#ifndef_lcd1602_drv_h_#define_lcd1602_drv_h_#ifndefNULL#defineNULL((void*)0L)#endiftypedefunsignedcharuchar;typedefunsignedintuint;//LCD1602显示IO#defineLCD_DATAP0sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EP=P2^2;#includeapp_common.h#defineLCD_CLEAR1#defineLCD_NORMER2#defineLCD_CURSOR_BLINK3////对外接口bitLcd_bz();//忙时判断,1表示忙voidLcd_cmd(ucharcmd);//写指令voidLcd_ctrl(ucharL,ucharC,ucharCC);//控制函数voidLcd_pos(ucharx,uchary);//定位voidLcd_ch(ucharch);//写数据,单个字符并显示voidLcd_str(uchar*str,uintlen);//写入字符串并显示(用到Lcd_ch()函数)voidLcd_num(intnum);//显示整数voidLcd_init();voidLcd_flo(floats,uintn);//浮点显示,n=8;#endif/**********************************************************************************Module:lcd1602_drv.c*Function:lcd1602显示屏驱动程序和中间接口*Author:槐之林**Version:2016-05-29*********************************************************************************/#includeintrins.h#includestring.h#includemath.h#includelcd1602_drv.h/******************************************************************函数名:bitLcd_bz()功能:测试是否为忙时,返回1为忙,0为闲说明:******************************************************************/bitLcd_bz()//判是否为忙时{bitresult;LCD_RS=0;LCD_RW=1;LCD_EP=1;delay_us(5);result=(bit)(LCD_DATA&0x80);LCD_EP=0;returnresult;}/******************************************************************函数名:voidLcd_cmd(ucharcmd)功能:写指令:cmd说明:指令库:清屏函数:0X01;1.64ms光标归位:0X02;1.64ms模式设置:DB2=1DB1=I/DDB0=S;I/D=0---写入数据后,光标左移;I/D=1---写入数据后,光标右移;S=0-----写入数据后,显示屏不移动;S=1-----写入数据后,显示屏右移1;显示开关控制:DB3=1DB2=DDB1=CDB0=B;D=0显示功能关D=1显示功能开C=0无光标C=1有光标B=0光标无闪烁B=1光标闪烁设置光标/屏移动方向指令:DB4=1DB3=S/CDB2=R/LDB1=xDB0=x;S/CR/L对应指令00光标左移一格,AC减一01光标右移一格,AC加一10显示器上所有字符左移一格,光标不动11显示器上所有字符右移一格,光标不动功能设置:0X3816*2显示,5*7点阵,8位数据********************************************************************/voidLcd_cmd(ucharcmd){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表示行/列(1~2)/(1~16)//CC表示控制指令,指令在.h文件中定义//有些指令没有用于参数C和L,可以赋值为0voidLcd_ctrl(ucharL,ucharC,ucharCC){switch(CC){caseLCD_CLEAR:Lcd_cmd(0x01);delay_ms(3);break;caseLCD_CURSOR_BLINK:Lcd_pos(L,C);Lcd_cmd(0x0F);break;caseLCD_NORMER:Lcd_cmd(0x0C);Lcd_cmd(0x06);Lcd_cmd(0x01);break;default:break;}}/******************************************************************函数名:voidLcd_pos(ucharpos)功能:定位说明:x表示第x行(1~16)y表示第y列(1~2)******************************************************************/voidLcd_pos(ucharx,uchary){y=y-1;if(x==1){Lcd_cmd(0x80+y);//表示第一行,位置y处}elseif(x==2){Lcd_cmd(0x80+0x40+y);//表示第二行,位置y处}}/*****************************************************************函数名:voidLcd_dat(uchardat)功能:写数据,显示单个字符说明:直接写入单个字符,如'c'*****************************************************************/voidLcd_ch(ucharch){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);//必须有}/*****************************************************************函数名:voidLcd_str(uchar*str,uintlen)功能:写数据,显示字符串说明:str为字符串首地址,左对齐,len字串长度*****************************************************************/voidLcd_str(uchar*str,uintlen){uinti=0;uchar*s=str;while(len0){Lcd_ch(*(s+i));i++;len--;}}/*****************************************************************函数名:voidLcd_num(intnum)功能:写数据,显示正整数,从右往左,低位到高位显示,注意定位时应在最左边开始说明:num显示数字,DIS_MAX_LEN显示最大长度,负号'-'也表示一位*****************************************************************/#defineDIS_MAX_LEN6voidLcd_num(intnum){uchari,dat_buf[DIS_MAX_LEN]=0x00;if(num0){dat_buf[0]='-';num=-1*num;}elsedat_buf[0]='+';i=DIS_MAX_LEN-1;while(num0){dat_buf[i]=(num%10)+'0';num=num/10;i=i-1;}i=1;while(dat_buf[i]==0){i++;}if(dat_buf[0]=='-'){dat_buf[i-1]='-';i=i-1;}Lcd_str(dat_buf+i,DIS_MAX_LEN-i);}/**************************************************************函数名:voidLcd_flo2(floats,uintn)功能:浮点数显示说明:严格按有效位n显示,n=8***************************************************************/voidLcd_flo(floats,uintn){uinti=0,k=0;if(s0){Lcd_ch('-');s=-1*s;}//判断正负do{//获得整数位位数is=s/10;i++;}while((uint)s!=0);for(k=0;kn+1;k++){if(ik){s=s*10;Lcd_ch((uint)s+'0');s=s-(uint)s;}else{if(i==n)Lcd_ch(0x20);elseLcd_ch('.');i=99;//只要保证ik执行上面的if()语句}}}/*****************************************************************函数名:voidLcd_init()功能:初始化说明:无*****************************************************************/voidLcd_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);}/*****************************************************************/
本文标题:LCD1602驱动程序(C51)
链接地址:https://www.777doc.com/doc-6276299 .html