|
* 描述: LCD1602 滾動顯示 *
* 顯示方式: *
* 1、從左到右逐字顯示,閃動二次,清屏。 *
* 2、再從右到左逐字顯示,閃動二次,清屏。 *
* 3、周期性地重復上述顯示方式。 *
同時帶仿真
#include <reg51.h> //51寄存器文件
#include <intrins.h>
typedef unsigned char BYTE; //用BYTE代替unsigned char
typedef bit BOOL; // 用BOOL代替bit
sbit LCD_RS = P2^6; //寄存器選擇(RS=0,命令寄存器;RS=1,數據寄存器)
sbit LCD_RW = P2^5; //讀寫端(RW=1,讀;RW=0,寫)
sbit LCD_EP = P2^7; //使能端
BYTE code dis1[] = {" WELCOME TO "};
BYTE code dis2[] = {" MY ZONE ST "};
BYTE code dis3[] = {" OT EMOCLEW "};
BYTE code dis4[] = {" TS ENOZ MY "};
/****************延時函數************************/
void delay(int ms)
{ //延時子程序
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_(); //空執行
_nop_();
_nop_();
_nop_();
}
}
}
/****************查忙函數************************/
BOOL lcd_bz()
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80); //檢測P0最高位是否為1
LCD_EP = 0;
return result;//返回查忙結果
}
/****************寫命令函數************************/
void lcd_wcmd(BYTE cmd)
{ // 寫入指令數據到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd; //將8位指令通過P0口傳給1602
_nop_();
_nop_(); //用于產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
void lcd_pos(BYTE pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
}
/****************寫數據函數************************/
void lcd_wdat(BYTE dat)
{ //寫入字符顯示數據到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //將8位數據通過P0口傳給1602
_nop_();
_nop_(); //用于產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
void lcd_init()
{ //LCD初始化設定
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(1);
lcd_wcmd(0x0c); //顯示開,關光標
delay(1);
lcd_wcmd(0x06); //移動光標
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(1);
}
/****************主函數************************/
main()
{
BYTE i;
lcd_init();// 初始化LCD
delay(10);
while(1)
{
lcd_wcmd(0x06);//向右移動光標
lcd_pos(0);//設置顯示位置為第一行的第1個字符
i = 0;
while(dis1[ i ] != '\0')
{ //顯示字符"WLCOME TO"
lcd_wdat(dis1[ i ]);
i++;
delay(30);//控制兩字之間顯示速度
}
lcd_pos(0x40);//設置顯示位置為第二行第1個字符
i = 0;
while(dis2[ i ] != '\0')
{
lcd_wdat(dis2[ i ]);//顯示字符" HUANGHUAI "
i++;
delay(30);//控制兩字之間顯示速度
}
delay(800);//控制停留時間
lcd_wcmd(0x01);//清除LCD的顯示內容
delay(1);
lcd_wcmd(0x04);//向左移動光標
lcd_pos(15);//設置顯示位置為第一行的第16個字符
i = 0;
while(dis3[ i ] != '\0')
{ //顯示字符"WLCOME TO"
lcd_wdat(dis3[ i ]);
i++;
delay(30); //控制兩字之間顯示速度
}
lcd_pos(0x4F); //設置顯示位置為第二行的第16個字符
i = 0;
while(dis4[ i ] != '\0')
{
lcd_wdat(dis4[ i ]); //顯示字符" HUANGHUAI "
i++;
delay(30); //控制兩字之間顯示速度
}
delay(800); //控制停留時間
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(200); //控制兩屏轉換時間
}
}
|
評分
-
查看全部評分
|