基于51單片機(jī)的LCD1602四數(shù)據(jù)線驅(qū)動(dòng)程序,LCD1602單片機(jī)驅(qū)動(dòng)程序 關(guān)鍵字:LCD1602,,C程序 /這個(gè)程序已經(jīng)調(diào)試過了 #define LCD_DATA P2 sbit LCD1602_RS=P2^2; sbit LCD1602_EN=P2^3; int p=0;
/*--------------------------------------------------------------------------------------------------
函數(shù)說明 --------------------------------------------------------------------------------------------------*/ void LCD_init(void); void LCD_en_write(void); void LCD_write_command(unsigned char command) ; void LCD_write_data(unsigned char Recdata); void LCD_set_xy (unsigned char x, unsigned char y); void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata); void delay_nus(unsigned int n); void delay_nms(unsigned int n); void delay_1us(void) //1us延時(shí)函數(shù)
{ _nop_(); } void delay_nus(unsigned int n) //N us延時(shí)函數(shù)
{ unsigned int i=0; for (i=0;i } void delay_1ms(void) //1ms延時(shí)函數(shù) { unsigned int i; for (i=0;i<1140;i++); } void delay_nms(unsigned int n) //N ms延時(shí)函數(shù) { unsigned int i=0; for (i=0;i } void LCD_init(void) //液晶初始化 { LCD_write_command(0x28);
delay_nus(40); LCD_write_command(0x28); delay_nus(40); LCD_write_command(0x28); delay_nus(40); LCD_en_write(); delay_nus(40); LCD_write_command(0x28); //4位顯示 LCD_write_command(0x0c); //顯示開 LCD_write_command(0x01); //清屏 delay_nms(2); } void LCD_en_write(void) //液晶使能
{ LCD1602_EN=1; delay_nus(1); LCD1602_EN=0; } void LCD_write_command(unsigned char command) //寫指令
{ delay_nus(16); LCD1602_RS=0; //RS=0 LCD_DATA&=0X0f; //清高四位 LCD_DATA|=command&0xf0; //寫高四位 LCD_en_write(); command=command<<4; //低四位移到高四位 LCD_DATA&=0x0f; //清高四位 LCD_DATA|=command&0xf0; //寫低四位 LCD_en_write(); } void LCD_write_data(unsigned char Recdata) //寫數(shù)據(jù)
{ delay_nus(16); LCD1602_RS=1; //RS=1 LCD_DATA&=0X0f; //清高四位 LCD_DATA|=Recdata&0xf0; //寫高四位 LCD_en_write(); Recdata=Recdata<<4; //低四位移到高四位 LCD_DATA&=0X0f; //清高四位 LCD_DATA|=Recdata&0xf0; //寫低四位 LCD_en_write(); } void LCD_set_xy( unsigned char x, unsigned char y ) //寫地址函數(shù) { unsigned char address; if (y == 0) address = 0x80 + x; else address = 0xc0 + x; LCD_write_command(address); } void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1
{ LCD_set_xy(X, Y); //寫地址 LCD_write_data(Recdata); } int LCD_PutStr(unsigned char *DData,int pos){ //----------------------------以下函數(shù)用于輸出數(shù)字---------------------unsigned char i; if(pos==-1){ LCD_write_command(0x01); //清屏 delay_nms(2); pos=0; } while((*DData)!='\0'){ switch(*DData){ case '\n': //如果是\n,,則換行 { if(pos<17){ for(i=pos;i<16;i++) LCD_write_char(i%16, i/16, ' '); pos=16; } else{ for(i=pos;i<32;i++) LCD_write_char(i%16, i/16, ' '); pos=32; } break; } case '\b': //如果是\b,則退格 { if(pos>0) pos--; LCD_write_char(pos%16, pos/16, ' '); break; } default: { if((*DData)<0x20){ *DData=' '; } LCD_write_char(pos%16, pos/16,*DData); pos++; break; } } DData++; } return(pos); } int LCD_PutNum(unsigned long num,int XS,int pos){ //從右邊數(shù),,保留幾位小數(shù) unsigned long tmp=0; unsigned char numbits=0; if(pos==-1){ LCD_write_command(0x01); delay_nms(2); pos=0; } if(num==0){ LCD_write_char(pos%16, pos/16, '0'); pos++; } else{ if(num<0){ LCD_write_char(pos%16, pos/16, '-'); num*=(-1); pos++; } while(num){ tmp=tmp*10+(num%10); num=num/10; numbits++; } while(tmp){ LCD_write_char(pos%16, pos/16, (tmp%10)+48); tmp=tmp/10; pos++; numbits--; if(numbits==XS) pos=LCD_PutStr(".",pos); //顯示小數(shù)點(diǎn) } while(numbits--){ LCD_write_char(pos%16, pos/16, '0'); pos++; } } return(pos); } |
|