**************************************LCD1602頭文件*********************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_ //輸入方式設(shè)置 #define LCD_AC_AUTO_INCREMENT 0x06 //數(shù)據(jù)讀、寫操作后,AC自動(dòng)增一 #define LCD_AC_AUTO_DECREASE 0x04 //數(shù)據(jù)讀、寫操作后,AC自動(dòng)減一 #define LCD_MOVE_ENABLE 0x05 //數(shù)據(jù)讀、寫操作,畫面平移 #define LCD_MOVE_DISENABLE 0x04 //數(shù)據(jù)讀、寫操作,畫面不動(dòng) #define LCD_GO_HOME 0x02 //AC=0,光標(biāo)、畫面回HOME位 //設(shè)置顯示、光標(biāo)及閃爍開、關(guān) #define LCD_DISPLAY_ON 0x0C //顯示開 #define LCD_DISPLAY_OFF 0x08 //顯示關(guān) #define LCD_CURSOR_ON 0x0A //光標(biāo)顯示 #define LCD_CURSOR_OFF 0x08 //光標(biāo)不顯示 #define LCD_CURSOR_BLINK_ON 0x09 //光標(biāo)閃爍 #define LCD_CURSOR_BLINK_OFF 0x08 //光標(biāo)不閃爍 //光標(biāo)、畫面移動(dòng),不影響DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD顯示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD顯示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光標(biāo)左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光標(biāo)右移一位 //工作方式設(shè)置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //兩行顯示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //單行顯示 #define LCD_CLEAR_SCREEN 0X01 //清屏 /***********************LCD1602地址相關(guān)******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址 #define LINE1 0 //第一行 #define LINE2 1 //第二行 #define LINE_LENGTH 16 //每行的最大字符長度 /***********************LCD1602接線引腳定義**************************/
#define LCDIO P2 //定義P2口與LCD1602的數(shù)據(jù)口相接
sbit LCD_RS=P1^4; sbit LCD_RW=P1^3; sbit LCD_EN=P1^2; sbit LCD_BUSY=LCDIO^7; /**********************另外相關(guān)的定*********************************/ #define HIGH 1 #define LOW 0 #define TURE 1 #define FALSE 0 #define uchar unsigned char #define uint unsigned int /*************************以下是函數(shù)的申明部*************************/ void LCD_init(void); //LCD1602初始化 void LCD_send_command(uchar command); // void LCD_send_data(uchar dat); void LCD_write_char(uchar x,uchar y,uchar dat); void LCD_disp_string(uchar x,uchar y,char *Data); void delay_ms(uint n); void LCD_check_busy(void); #endif /****************************************************************** /#include <reg51.h>
#include "LCD1602.h" /*******************主函數(shù)**********************************/ uchar string[]=" I LOVE YOU! "; //這里是要顯示的字符 void main(void) { uchar *cp; cp=string; LCD_init(); while(1) { LCD_send_command(LCD_CLEAR_SCREEN); delay_ms(2); LCD_disp_string(0,1,cp); delay_ms(100); cp++; if(*cp==''\0'') { cp=string; //到達(dá)字符的尾部時(shí),改變指針,重新指向字符串的頭部 } } } /*********************************************************/ /**************LCD1602的初始化***************************/ void LCD_init(void) { LCD_send_command(LCD_DISPLAY_DOUBLE_LINE); LCD_send_command(LCD_AC_AUTO_INCREMENT LCD_MOVE_DISENABLE); LCD_send_command(LCD_DISPLAY_ON LCD_CURSOR_OFF); LCD_send_command(LCD_CLEAR_SCREEN); } /********************************************************/ void LCD_check_busy(void) //檢測LCD狀態(tài),看它是不是還在忙呢 { do { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCDIO=0xff; LCD_EN=1; } while(LCD_BUSY==1); LCD_EN=0; } /************LCD1602寫命令*******************************/
void LCD_send_command(uchar command) { LCD_check_busy(); LCD_RS=LOW; LCD_RW=LOW; LCD_EN=HIGH; LCDIO=command; LCD_EN=LOW; } /********************************************************/ /*****************LCD1602寫數(shù)據(jù)**************************/ void LCD_send_data(uchar dat) { LCD_check_busy(); LCD_RS=HIGH; LCD_RW=LOW; LCD_EN=HIGH; LCDIO=dat; LCD_EN=LOW; } /******************************************************** void LCD_write_char(uchar x,uchar y,uchar dat) { unsigned char address; if (y == LINE1) address = LINE1_HEAD + x; else address = LINE2_HEAD + x; LCD_send_command(address); LCD_send_data(dat); } ******************LCD1602顯示字符串*********************/ void LCD_disp_string(uchar x,uchar y,uchar *Data) { if(y==LINE1) { if(x<LINE_LENGTH) { LCD_send_command(LINE1_HEAD+x); for(;x<LINE_LENGTH&&*Data!=''\0'';x++) { LCD_send_data(*(Data++)); } if(*Data!=''\0'') { x=0; y=LINE2; } } } if(y==LINE2) { LCD_send_command(LINE2_HEAD+x); for(;x<LINE_LENGTH&&*Data!=''\0'';x++) { LCD_send_data(*(Data++)); } } } /****************************************************************/ /********************延時(shí)函數(shù)***********************************/ /***************************************************************/ void delay_ms(uint n) { uint i,j; for(i=n;i>0;i--) for(j=0;j<1140;j++) ; } /*********************************************************************/ |
|