/********************************************************************************
* 描述: LCD1602 滚动显示 *
* 显示方式: *
* 1、从左到右逐字显示,闪动二次,清屏。 *
* 2、再从右到左逐字显示,闪动二次,清屏。 *
* 3、周期性地重复上述显示方式。 *
********************************************************************************/
#include "common.h"
//选择单片机
#if MCU_F
#include <stc15f2k60s2.h> //STC15单片机
#else
#include <STC89C5xRC.H> //STC89C52单片机
#endif
#include "delay.h"
#define LCDdata P0 //数据输出端口
sbit LCD_RS = P2^5; //寄存器选择(RS=0,命令寄存器;RS=1,数据寄存器)
sbit LCD_RW = P2^6; //读写端(RW=1,读;RW=0,写)
sbit LCD_EP = P2^7; //使能端
#if LCD1602_F
u8 idata dis1[] =" WELCOME TO "; //显示内容
u8 idata dis2[] ="CHANGSHAMINZHENG";
#endif
/****************查忙函数************************/
bit lcd_bz()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
result = (bit)(LCDdata & 0x80); //检测数据端口最高位是否为1
LCD_EP = 0;
return result;//返回查忙结果
}
/****************写命令函数************************/
void lcd_wcmd(u8 cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
LCDdata = cmd; //将8位指令通过P0口传给1602
LCD_EP = 1; //用于产生一个脉冲宽度
LCD_EP = 0;
}
void lcd_pos(u8 pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
/****************写数据函数************************/
void lcd_wdat(u8 dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
LCDdata = dat; //将8位数据通过P0口传给1602
LCD_EP = 1; //用于产生一个脉冲宽度
LCD_EP = 0;
}
void lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(10);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(10);
lcd_wcmd(0x06); //移动光标
delay_ms(10);
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(10);
}
//液晶显示
#if LCD1602_F
void LCD1602disp()
{
u8 i;
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis1[ i ] != '\0') //显示字符"WLCOME TO"
{
lcd_wdat(dis1[ i ]);
i++;
delay_ms(500); //控制两字之间显示速度
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
i = 0;
while(dis2[ i ] != '\0') //显示字符"CHANGSHAMINZHENG"
{
lcd_wdat(dis2[ i ]);
i++;
delay_ms(500); //控制两字之间显示速度
}
delay_ms(5000); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(1);
lcd_wcmd(0x04); //向左移动光标
lcd_pos(15); //设置显示位置为第一行的第16个字符
i = 0;
while(dis1[ i ] != '\0')
{ //显示字符"WLCOME TO"
lcd_wdat(dis1[ i ]);
i++;
delay_ms(500); //控制两字之间显示速度
}
lcd_pos(0x4F); //设置显示位置为第二行的第16个字符
i = 0;
while(dis2[ i ] != '\0')
{
lcd_wdat(dis2[ i ]); //显示字符" HUANGHUAI "
i++;
delay_ms(500); //控制两字之间显示速度
}
delay_ms(5000); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(5000); //控制两屏转换时间
}
#endif
延时程序用下面提供的
void delay500ms(void)
{
u8 i,j,k;
for(i=254;i>0;i--)
for(j=32;j>0;j--)
for(k=183;k>0;k--);
}
void delay200ms(void)
{
u8 i,j,k;
for(i=10;i>0;i--)
for(j=239;j>0;j--)
for(k=250;k>0;k--);
}
void delay100ms(void)
{
u8 i,j,k;
for(i=246;i>0;i--)
for(j=12;j>0;j--)
for(k=100;k>0;k--);
}
void delay10ms(void)
{
u8 i,j,k;
for(i=30;i>0;i--)
for(j=80;j>0;j--)
for(k=10;k>0;k--);
}
void delay2ms(void)
{
u8 i,j,k;
for(i=1;i>0;i--)
for(j=36;j>0;j--)
for(k=152;k>0;k--);
}
void delay_ms(u8 t)
{
u8 i,j,k;
for(i=t;i>0;i--)
for(j=80;j>0;j--)
for(k=33;k>0;k--);
}
void delay500us(void)
{
u8 i,j,k;
for(i=1;i>0;i--)
for(j=52;j>0;j--)
for(k=25;k>0;k--);
}
void delay30us(void)
{
u8 i,j,k;
for(i=1;i>0;i--)
for(j=1;j>0;j--)
for(k=77;k>0;k--);
}
void delay_us(u8 t)
{
u8 i,j;
for(i=t;i>0;i--)
for(j=11;j>0;j--);
}
void delay1s(void)
{
u8 i,j,k;
for(i=198;i>0;i--)
for(j=100;j>0;j--)
for(k=150;k>0;k--);
}
|