logo资料库

LCD1602程序代码及显示流程图.pdf

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
LCD1602程序代码及显示流程图 程序代码及显示流程图 前些天弄了最小系统板后就想着学习1602的显示程序,可惜坛子里的或网上的,都没有简单的1602显示程序, 无柰在网上下载了一段经过反复修改测试,终于有了下面一段代码 lcd1602显示程序代码 前些天弄了最小系统板后就想着学习1602的显示程序,可惜坛子里的或网上的,都没有简单的1602显示程序,无柰在网上下 载了一段经过反复修改测试,终于有了下面一段代码: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - 初始化接口 # define LCD_DB P0 // - - P0 = DB0~DB7 sbit LCD_RS=P2^0; // - - p2.0 = RS sbit LCD_RW=P2^1; // - - p2.1 = RW sbit LCD_E=P2^2; // - - p2.2 = E // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - 定义函数 # define uchar unsigned char # define uint unsigned int // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - 定义子程序函数 void LCD_init(void); // - - 初始化LCD1602函数 void LCD_write_command(uchar command); // - - 向LCD1602写指令函数 void LCD_write_data(uchar dat); // - - 向LCD1602写数据函数 void LCD_set_xy(uchar x,uchar y); // - - 设置LCD1602显示位置 X(0-16),y(1-2) void LCD_disp_char(uchar x,uchar y,uchar dat); // - - 在LCD1602上显示一个字符 void LCD_disp_string(uchar X,uchar Y,uchar *s); // - - 在LCD1602上显示一个字符串 //void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。 void LCD_delay_10us(uint n); // - - 10微秒的延时子程序 void LCD_delay_50us(uint n); // - - 50微秒的延时子程序 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - 初始化LCD1602 void LCD_init(void) { LCD_delay_10us(20); LCD_write_command(0x38); // - - 设置8位格式,2行,5x7 LCD_delay_10us(5); LCD_write_command(0x0c); // - - 整体显示,关光标,不闪烁 LCD_delay_10us(5); LCD_write_command(0x06); // - - 设定输入方式,增量不移位
LCD_delay_10us(5); LCD_write_command(0x01); // - - 清除屏幕显示 LCD_delay_50us(40); } //******************************** // - - 向LCD1602写指令 void LCD_write_command(uchar dat) { LCD_delay_10us(5); LCD_RS=0; // - - 指令 LCD_RW=0; // - - 写入 LCD_DB=dat; LCD_delay_10us(5); LCD_E=1; // - - 允许 LCD_delay_10us(5); LCD_E=0; } // - - 向LCD1602写数据 void LCD_write_data(uchar dat) { LCD_delay_10us(5); LCD_RS=1;// - - 数据 LCD_RW=0;// - - 写入 LCD_DB=dat; LCD_delay_10us(5); LCD_E=1;// - - 允许 LCD_delay_10us(5); LCD_E=0; } // - - 设置显示位置 void LCD_set_xy(uchar x,uchar y) { uchar address; if(y==1) { address=0x80+x; // - - 第一行位置 } else {
address=0xc0+x; // - - 第二行位置 } LCD_delay_10us(5); LCD_write_command(address); } // - - 显示一个字符函数 void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - 显示8 { LCD_set_xy(x,y); LCD_delay_10us(5); LCD_write_data(dat); } // - - 显示一个字符串函数 void LCD_disp_string(uchar x,uchar y,uchar *s) { LCD_set_xy(x,y); LCD_delay_10us(5); while(*s!=‘\0’) { LCD_write_data(*s); s++; } } //******************************** /*******检查忙函数************* void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以 { //至于不能正常使用LCD。因此我没有再用检查忙函数。而使 do //用了延时的方法,延时还是非常好用的。我试了一下,用 { LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令 LCD_RS=0; //要用200次循环便能完成。 LCD_RW=1; LCD_DB=0xff; LCD_E=1; }while(LCD_DB^7==1); } ******************************/ void LCD_delay_10us(uint n) // - - 10微秒的延时子程序
{ uint i,j; for(i=n;i》0;i--) for(j=2;j》0;j--); } void LCD_delay_50us(uint n) // - - 50微秒的延时子程序 { uint i,j; for(i=n;i》0;i--) for(j=22;j》0;j--); } LCD1602显示程序流程图及句解 让LCD1602显示字符前要输入字符所在的地址,这也是每显示一个字符地址要加一的原因,在下面的一段代码里你会明白怎 么设置地址,怎么让地址自动加一,怎么清屏,怎么显示字符,希望你能看懂哦 sbit LCD_E=P2^0; //lcd1602控制置位 sbit LCD_RW=P2^1; //lcd1602控制置位 sbit LCD_RS=P2^2; //lcd1602控制置位 void LCD_command(unsigned char com) { LCD_E=0; LCD_RW=0; LCD_RS=0; P1=com; delay_us(100); LCD_E=1; delay_us(100); LCD_E=0; } void LCD_date(unsigned char dat) { LCD_E=0; LCD_RW=0; LCD_RS=1; P1=dat; delay_us(100); LCD_E=1; delay_us(100);
LCD_E=0; } LCD_command(0x38); //设置LCD为16*2显示,5*7点阵,8位数据接口 LCD_command(0x0c); //设置LCD显示开,光标显示关 LCD_command(0x06); //写一个数据后地址加1 LCD_command(0x01); //显示清屏 LCD_command(0x80); //数据指针设置为第一行第一位 LCD_date(‘pi’); LCD_date(‘l’); LCD_date(‘e’); LCD_date(‘a’); LCD_date(‘s’); LCD_date(‘e’); LCD_date(‘ ’); LCD_date(‘c’); LCD_date(‘h’); LCD_date(‘e’); LCD_date(‘c’); LCD_date(‘k’); LCD_date(‘ ’); LCD_date(‘t’); LCD_date(‘h’); LCD_date(‘e’); LCD_command(0x80+0x40); //LCD地址指针指向第二行第一个位置 LCD_date(‘c’); LCD_date(‘o’); LCD_date(‘n’); LCD_date(‘n’); LCD_date(‘e’); LCD_date(‘c’); LCD_date(‘t’); LCD_date(‘i’); LCD_date(‘o’); LCD_date(‘n’); LCD_date(‘!’); LCD_date(‘!’);
分享到:
收藏