以前的文章写过1602液晶的显示程序,现在将液晶显示的画面移动起来,其实很简单,大家实验!(本实验经过本博客开发板实验)
/*
***************************************************************************
* (C) Copyright 2007,单片机初学者园地
* All Rights reserved.
*项目名称: 51单片机学习开发系统
*本文件名称:LCD1602.c
* 完成作者 : 单片机初学者 QQ:50501160
ahai0306@sina.com
* 当前版本 : V1.0
* 完成日期 : 2007年4月3日
* 描 述 :
* 此程序实现,完成液晶的驱动程序,可以显示任意的ASCII字符
*
* 我的博客:
http://blog.ednchina.com/ahai0306/
* 开发板介绍:
http://blog.ednchina.com/ahai0306/84416/message.aspx
* 淘宝网店铺地址:
http://shop35284066.taobao.com/
* 我的论坛:
http://dianzi.5d6d.com/?fromuser=mcu_51
****************************************************************************
*/
#include
//调用头文件(单片机内部的寄存器定义)
/******本段为硬件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++;
}
}
增加硬件原理图: