/********************************************************************************
* 描述: 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--);
}
|