以前的**写过1602液晶的显示程序,现在将液晶显示的画面移动起来,其实很简单,大家实验!(本实验经过本博客开发板实验)
/* *************************************************************************** * (C) Copyright 2007,单片机初学者园地 * All Rights reserved. *项目名称: 51单片机学习开发系统 *本文件名称:LCD1602.c * 完成作者 : 单片机初学者 QQ:50501160 ahai0306@sina.com * 当前版本 : V1.0 * 完成日期 : 2007年4月3日 * 描 述 : * 此程序实现,完成液晶的驱动程序,可以显示任意的ASCII字符 * * 我的博客:http://blog.**/ahai0306/ * 开发板介绍:http://blog.**/ahai0306/84416/message.aspx * 淘宝网店铺地址:http://shop35284066.taobao.com/ * 我的论坛:http://dianzi.5d6d.com/?fromuser=mcu_51 **************************************************************************** */ #include <reg52.h> //调用头文件(单片机内部的寄存器定义)
/******本段为硬件I/O口定义********/ sbit KEY0 = P0 ^ 0; //KEY和发光管复用,请将跳线插到KEY端 sbit KEY1 = P0 ^ 1; sbit KEY2 = P0 ^ 2; sbit KEY3 = P0 ^ 3; sbit DIG0 = P0 ^ 4; //数码管位0 sbit DIG1 = P0 ^ 5; //数码管位1
sbit BUZZ = P3 ^ 3; //蜂鸣器 sbit LCD_RW = P3 ^ 6; sbit LCD_RS = P3 ^ 7; sbit LCD_E = P3 ^ 4;
#define LED_SEG P1 //数码管 #define LCD_DATA P2 //LCD DATA #define LCD_BUSY 0x80 // 用于检测LCD的BUSY标识(本程序中用的延时,未检测) //LCD显示内容,定义到代码段 unsigned char code LcdBuf1[]= {"welcom!"}; unsigned char code LcdBuf2[]= {"MCU-STUDY-BOARD"};
//函数声明 void lcd_init(void); void display_string(unsigned char x,unsigned char y,unsigned char *s); void disp_selec(unsigned char bit_selec,unsigned char seg);
void WriteCommandLcd(unsigned char wdata);
/************************************************** ** 函数名称: dellay ** 入口参数:h(unsigned int型) ** 出口参数:无 ** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS ****************************************************/ void dellay(unsigned int h) { while(h--); //0.01MS }
/************主程序**************/ main() { lcd_init(); display_string(3,0,LcdBuf1); //显示第一行,从第3个位置开始 display_string(0,1,LcdBuf2); //显示第二行,从第0个位置开始 while(1) //单片机待机 {
dellay(23000); //滚动的延时时间 WriteCommandLcd(0x18); //画面向左移动1位
//WriteCommandLcd(0x1c); //画面向右移动1位
}
}
/************************************************** ** 函数名称: WriteDataLcd ** 入口参数:wdata(unsigned char型) ** 出口参数:无 ** 功能描述: 写数据到LCD ****************************************************/ void WriteDataLcd(unsigned char wdata) { LCD_DATA=wdata; LCD_RS=1; LCD_RW=0; LCD_E=0; dellay(100); //短暂延时,代替检测忙状态
LCD_E=1; } /************************************************** ** 函数名称: WriteCommandLcd ** 入口参数:wdata(unsigned char型) ** 出口参数:无 ** 功能描述: 写命令到LCD ****************************************************/ void WriteCommandLcd(unsigned char wdata) { LCD_DATA=wdata; LCD_RS=0; LCD_RW=0; LCD_E=0; dellay(100); //短暂延时,代替检测忙状态 LCD_E=1; }
//LCD初始化 void lcd_init(void) { LCD_DATA=0; WriteCommandLcd(0x38); dellay(1000); WriteCommandLcd(0x38); //显示模式设置 WriteCommandLcd(0x08); //关闭显示 WriteCommandLcd(0x01); //显示清屏 WriteCommandLcd(0x06); //显示光标移动设置 WriteCommandLcd(0x0c); //显示开及光标移动设置 } /************************************************** ** 函数名称: display_xy ** 入口参数:x(unsigned char型),y(unsigned char型) ** 出口参数:无 ** 功能描述: 设置光标位置, x是列号,y是行号 ****************************************************/ void display_xy(unsigned char x,unsigned char y) { if(y==1) x+=0x40; x+=0x80; WriteCommandLcd(x); } /******************************************************************** ** 函数名称: display_char ** 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型) ** 出口参数:无 ** 功能描述: 在具体位置显示单个字符,x是列号,y是行号 *********************************************************************/ void display_char(unsigned char x,unsigned char y,unsigned char dat) { display_xy(x,y); WriteDataLcd(dat); }
/********************************************************************* ** 函数名称: display_string ** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型) ** 出口参数:无 ** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号 **********************************************************************/ void display_string(unsigned char x,unsigned char y,unsigned char *s) { display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; } }
增加硬件原理图:
相关链接:http://blog.**/ahai0306/ |