|
這是我在單片機設計學習的過程中 , 做的單片機LCD1602字符液晶滾動程序.
2.字符滾動
2.1.第一種方式
使用LCD內置指令設置整屏左移或者右移,在讀入字符時每讀一個字符都要有個延遲,否則會因為速度太快,看到屏幕上就是沒有字符。
#define LCD_DIS_MODE_LEFT 0x07 // AC自增,畫面左移
#define LCD_DIS_MODE_RIGHT 0X05 // AC自增,畫面右移
1
2
設置字符左移核心代碼
void main(){
unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
unsigned char i;
LCD1602_Init();
// 1.設置整屏幕左移
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);
}
}
}
字符移動完整代碼
#include <STC12C2052AD.H>
#include <string.h>
typedef unsigned char uint8;
// 定義引腳
#define LCD1602_DB0_DB7 P1 // 定義LCD1602的數據總線
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的測忙線(與LCD1602_DB0_DB7關聯)
// 定義指令集
/*設置顯示模式*/
#define LCD_MODE_PIN8 0x38 // 8位數據線,兩行顯示
#define LCD_MODE_PIN4 0x28 // 4位數據線,兩個顯示
#define LCD_SCREEN_CLR 0x01 // 清屏
#define LCD_CURSOR_RET 0x02 // 光標復位
#define LCD_CURSOR_RIGHT 0x06 // 光標右移,顯示不移動
#define LCD_CURSOR_LEFT 0x04 // 光標左移,顯示不移動
#define LCD_DIS_MODE_LEFT 0x07 // AC自增,畫面左移
#define LCD_DIS_MODE_RIGHT 0X05 // AC自增,畫面右移
/*光標開關控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f // 顯示開,光標開,光標閃爍
#define LCD_DIS_CUR_ON 0x0e // 顯示開,光標開,光標不閃爍
#define LCD_DIS_ON 0x0c // 顯示開,光標關,光標不閃爍
#define LCD_DIS_OFF 0x08 // 顯示關,光標關,光標不閃爍
/*光標、顯示移動*/
#define LCD_CUR_MOVE_LEFT 0x10 // 光標左移
#define LCD_CUR_MOVE_RIGHT 0x14 // 光標右移
#define LCD_DIS_MOVE_LEFT 0x18 // 顯示左移
#define LCD_DIS_MOVE_RIGHT 0x1c // 顯示右移
/**
LCD1602忙碌狀態不會接收新指令,因此在發送新指令前先檢測是否忙碌。
判斷LCD1602_Busy變量的值為低電平則為不忙。
*/
void LCD1602_TestBusy(void){
LCD1602_DB0_DB7 = 0xff; //將數據引腳置為高電平
LCD1602_RS = 0; // 指令狀態
LCD1602_RW = 1; // 讀狀態
LCD1602_E = 1; // 打開LCD顯示器讀指令
while(LCD1602_Busy); //讀取LCD1602_Busy(P1.7)為低電平則結束循環
LCD1602_E = 0; // 關閉LCD顯示器讀指令
}
/********************************************************************************************
// 寫指令程序 //
// 向LCD1602寫命令 本函數需要1個指令集的入口參數 //
/********************************************************************************************/
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;
}
/********************************************************************************************
// 寫數據程序 //
// 向LCD1602寫數據 //
/********************************************************************************************/
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); // 顯示模式設置:顯示2行,每個字符為5*7個像素
LCD1602_WriteCMD(LCD_DIS_ON); // 顯示開及光標設置:顯示開,光標關
LCD1602_WriteCMD(LCD_CURSOR_RIGHT); //顯示光標移動設置:文字不動,光標右移
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();
// 設置整屏幕左移
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.第二種移動方式
這種移動方式不需要在初始化時設置好移動方式,而是在需要的時候開啟移動,不需要時候關閉移動。
核心代碼
1602的內置指令中提供了顯示左移或右移的指令#define LCD_DIS_MOVE_LEFT 0x18,使用該指令可以使內容移動。
下面是實現屏幕左移的核心代碼,其他代碼同上面實例代碼一致就不在展示。
void main(){
unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
unsigned char i;
LCD1602_Init();
// 輸出字符內容
LCD1602_WriteCMD(0x80);
for(i=0;i<strlen(str1);i++){
LCD1602_WriteData(str1[ i]);
}
while(1){
// 設置屏幕左移
LCD1602_WriteCMD(LCD_DIS_MOVE_LEFT);
DELAY_MS(500);
} |
評分
-
查看全部評分
|