**************************************LCD1602头文件*********************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_ //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动 #define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位 //设置显示、光标及闪烁开、关 #define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 //工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 #define LCD_CLEAR_SCREEN 0X01 //清屏 /***********************LCD1602地址相关******************************/
#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的数据口相接
sbit LCD_RS=P1^4; sbit LCD_RW=P1^3; sbit LCD_EN=P1^2; sbit LCD_BUSY=LCDIO^7; /**********************另外相关的定*********************************/ #define HIGH 1 #define LOW 0 #define TURE 1 #define FALSE 0 #define uchar unsigned char #define uint unsigned int /*************************以下是函数的申明部*************************/ 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" /*******************主函数**********************************/ 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; //到达字符的尾部时,改变指针,重新指向字符串的头部 } } } /*********************************************************/ /**************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状态,看它是不是还在忙呢 { 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写数据**************************/ 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++)); } } } /****************************************************************/ /********************延时函数***********************************/ /***************************************************************/ void delay_ms(uint n) { uint i,j; for(i=n;i>0;i--) for(j=0;j<1140;j++) ; } /*********************************************************************/ |
|