找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1564|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)LCD1602字符液晶滾動(dòng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我在單片機(jī)設(shè)計(jì)學(xué)習(xí)的過程中 , 做的單片機(jī)LCD1602字符液晶滾動(dòng)程序.
2.字符滾動(dòng)
2.1.第一種方式
使用LCD內(nèi)置指令設(shè)置整屏左移或者右移,在讀入字符時(shí)每讀一個(gè)字符都要有個(gè)延遲,否則會(huì)因?yàn)樗俣忍,看到屏幕上就是沒有字符。

#define LCD_DIS_MODE_LEFT 0x07         // AC自增,畫面左移
#define LCD_DIS_MODE_RIGHT 0X05        // AC自增,畫面右移
1
2
設(shè)置字符左移核心代碼
void main(){
        unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
        unsigned char i;
        LCD1602_Init();
        // 1.設(shè)置整屏幕左移
        LCD1602_WriteCMD(LCD_DIS_MODE_LEFT);

        while(1){
                //設(shè)置字符顯示起始位置
                LCD1602_WriteCMD(0x80);
                //讀取字符,注意每讀取一個(gè)字符時(shí)都要有個(gè)延遲時(shí)間。
                for(i=0;i<strlen(str1);i++){
                        LCD1602_WriteData(str1[ i]);
                        DELAY_MS(500);
                }

        }

}

字符移動(dòng)完整代碼
#include <STC12C2052AD.H>
#include <string.h>
typedef unsigned char uint8;
// 定義引腳
#define        LCD1602_DB0_DB7        P1                        // 定義LCD1602的數(shù)據(jù)總線
sbit LCD1602_RS = P3 ^ 2;                                        // 定義LCD1602的RS控制線
sbit LCD1602_RW = P3 ^ 3;                                        // 定義LCD1602的RW控制線
sbit LCD1602_E  = P3 ^ 4;                                        // 定義LCD1602的E控制線
sbit LCD1602_Busy = P1 ^ 7;                                        // 定義LCD1602的測(cè)忙線(與LCD1602_DB0_DB7關(guān)聯(lián))


// 定義指令集
/*設(shè)置顯示模式*/
#define LCD_MODE_PIN8 0x38        // 8位數(shù)據(jù)線,兩行顯示
#define LCD_MODE_PIN4 0x28        // 4位數(shù)據(jù)線,兩個(gè)顯示
#define LCD_SCREEN_CLR 0x01        // 清屏
#define LCD_CURSOR_RET 0x02        // 光標(biāo)復(fù)位
#define LCD_CURSOR_RIGHT 0x06        // 光標(biāo)右移,顯示不移動(dòng)
#define LCD_CURSOR_LEFT 0x04        // 光標(biāo)左移,顯示不移動(dòng)
#define LCD_DIS_MODE_LEFT 0x07         // AC自增,畫面左移
#define LCD_DIS_MODE_RIGHT 0X05        // AC自增,畫面右移


/*光標(biāo)開關(guān)控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f        // 顯示開,光標(biāo)開,光標(biāo)閃爍
#define LCD_DIS_CUR_ON 0x0e        // 顯示開,光標(biāo)開,光標(biāo)不閃爍
#define LCD_DIS_ON 0x0c        // 顯示開,光標(biāo)關(guān),光標(biāo)不閃爍
#define LCD_DIS_OFF 0x08        // 顯示關(guān),光標(biāo)關(guān),光標(biāo)不閃爍

/*光標(biāo)、顯示移動(dòng)*/
#define LCD_CUR_MOVE_LEFT 0x10        // 光標(biāo)左移
#define LCD_CUR_MOVE_RIGHT 0x14        // 光標(biāo)右移
#define LCD_DIS_MOVE_LEFT 0x18        // 顯示左移
#define LCD_DIS_MOVE_RIGHT 0x1c        // 顯示右移


/**
LCD1602忙碌狀態(tài)不會(huì)接收新指令,因此在發(fā)送新指令前先檢測(cè)是否忙碌。
判斷LCD1602_Busy變量的值為低電平則為不忙。
*/
void LCD1602_TestBusy(void){
        LCD1602_DB0_DB7 = 0xff;        //將數(shù)據(jù)引腳置為高電平
        LCD1602_RS = 0; // 指令狀態(tài)
        LCD1602_RW = 1;        // 讀狀態(tài)
        LCD1602_E = 1;        // 打開LCD顯示器讀指令
        while(LCD1602_Busy);        //讀取LCD1602_Busy(P1.7)為低電平則結(jié)束循環(huán)
        LCD1602_E = 0;        // 關(guān)閉LCD顯示器讀指令
}


/********************************************************************************************
// 寫指令程序 //
// 向LCD1602寫命令 本函數(shù)需要1個(gè)指令集的入口參數(shù) //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) {
        LCD1602_TestBusy();
        //輸入的命令賦值給LCD1602_DB0_DB7
        LCD1602_DB0_DB7 = LCD1602_command;
        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_E = 1;
        LCD1602_E = 0;
}
/********************************************************************************************
// 寫數(shù)據(jù)程序 //
// 向LCD1602寫數(shù)據(jù) //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){
        LCD1602_TestBusy();
        LCD1602_DB0_DB7 = LCD1602_data;
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_E = 1;
        LCD1602_E = 0;
}


// LCD1602初始化
void LCD1602_Init(void){
        LCD1602_WriteCMD(LCD_MODE_PIN8);        // 顯示模式設(shè)置:顯示2行,每個(gè)字符為5*7個(gè)像素
        LCD1602_WriteCMD(LCD_DIS_ON);         // 顯示開及光標(biāo)設(shè)置:顯示開,光標(biāo)關(guān)
        LCD1602_WriteCMD(LCD_CURSOR_RIGHT);                //顯示光標(biāo)移動(dòng)設(shè)置:文字不動(dòng),光標(biāo)右移
        LCD1602_WriteCMD(LCD_SCREEN_CLR);        // 顯示清屏
}

void DELAY_MS (unsigned int a){
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 600; i++);
        }
}

void main(){
        unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
        unsigned char i;
        LCD1602_Init();
        // 設(shè)置整屏幕左移
        LCD1602_WriteCMD(LCD_DIS_MODE_LEFT);
        while(1){
                LCD1602_WriteCMD(0x80);
                for(i=0;i<strlen(str1);i++){
                        LCD1602_WriteData(str1[ i]);
                        DELAY_MS(500);
                }

        }

}

2.2.第二種移動(dòng)方式
這種移動(dòng)方式不需要在初始化時(shí)設(shè)置好移動(dòng)方式,而是在需要的時(shí)候開啟移動(dòng),不需要時(shí)候關(guān)閉移動(dòng)。

核心代碼
1602的內(nèi)置指令中提供了顯示左移或右移的指令#define LCD_DIS_MOVE_LEFT 0x18,使用該指令可以使內(nèi)容移動(dòng)。
下面是實(shí)現(xiàn)屏幕左移的核心代碼,其他代碼同上面實(shí)例代碼一致就不在展示。

void main(){
        unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
        unsigned char i;
        LCD1602_Init();
        // 輸出字符內(nèi)容
        LCD1602_WriteCMD(0x80);
        for(i=0;i<strlen(str1);i++){
                LCD1602_WriteData(str1[ i]);
        }

        while(1){
                // 設(shè)置屏幕左移
                LCD1602_WriteCMD(LCD_DIS_MOVE_LEFT);
                DELAY_MS(500);



        }

Snipaste_2024-01-01_19-38-11.png (363.13 KB, 下載次數(shù): 61)

仿真圖

仿真圖

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表