標題:
1602字符液晶工作于8位模式直接驅(qū)動顯示Proteus仿真+單片機程序
[打印本頁]
作者:
2531572670
時間:
2020-6-23 16:28
標題:
1602字符液晶工作于8位模式直接驅(qū)動顯示Proteus仿真+單片機程序
1602字符液晶工作于8位模式直接驅(qū)動顯示,有仿真文件,附件找
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(44.24 KB, 下載次數(shù): 74)
下載附件
2020-6-23 20:17 上傳
單片機源程序如下:
//-----------------------------------------------------------------
// 名稱: 1602字符液晶工作于8位模式直接驅(qū)動顯示
//-----------------------------------------------------------------
// 說明: 本例液晶實現(xiàn)了四項演示功能,分別為水平滾動,帶光標顯示隨機
// 算術式,全碼表字符顯示,CGRAM自定義字符顯示.
//
//-----------------------------------------------------------------
#include <reg51.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define INT8U unsigned char
#define INT16U unsigned int
sbit SW1 = P3^0; //水平水平滾動顯示
sbit SW2 = P3^1; //帶光標顯示隨機算術式
sbit SW3 = P3^2; //全碼表字符顯示
sbit SW4 = P3^3; //CGRAM自定義字符顯示
INT8U code msg[] = //待滾動顯示的字符串(字符串最前面加了16個空格)
" you are going to spend even more time working on the schematic ?";
//-----------------------------------------------------------------
extern delay_ms(INT16U x);
extern void Initialize_LCD();
extern void Write_LCD_Data(INT8U dat);
extern void Write_LCD_Command(INT8U cmd);
extern void Busy_Wait();
extern void LCD_ShowString(INT8U,INT8U,INT8U *);
//-----------------------------------------------------------------
//自定義CGRAM字符及圖標點陣數(shù)據(jù)(共兩組,每組字符不超過8個)
INT8U code CGRAM_Dat1[][8] = //7個圖標符號(高度由1~7橫遞增的矩形)
{ {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00}, //1橫
{0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00}, //2橫
{0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x00}, //3橫
{0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x00}, //4橫
{0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x00}, //5橫
{0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00}, //6橫
{0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00} //7橫
};
INT8U code CGRAM_Dat2[][8] = //5個漢字字符
{ {0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00}, //年
{0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00}, //月
{0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00}, //日
{0x1F,0x0A,0x1F,0x0A,0x0A,0x0A,0x12,0x00}, //開
{0x0A,0x1F,0x04,0x1F,0x04,0x0A,0x11,0x00} //關
};
//-----------------------------------------------------------------
// 將自定義字符點陣寫入CGRAM
//-----------------------------------------------------------------
void Write_CGRAM(INT8U g[][8], INT8U n)
{
INT8U i,j;
Write_LCD_Command(0x40); //設置CGRAM地址為0x40
for (i = 0; i < n; i++) //n個自定義字符
for (j = 0; j < 8; j++) //每個字符8字節(jié)點陣數(shù)據(jù)
Write_LCD_Data(g[i][j]); //寫入CGRAM
}
//-----------------------------------------------------------------
// SW1: 水平滾動顯示字符串
//-----------------------------------------------------------------
void H_Scroll_Display()
{
INT16U i;
Write_LCD_Command (0x0C); //開顯示,關光標
LCD_ShowString(0,0,"LCD1602 DEMO - 1") ; //第0行顯示標題
LOOP1:
for (i = 0; i <= strlen(msg); i++) //滾動輸出所有字符
{ LCD_ShowString(1,0,msg + i); //msg+i實現(xiàn)取字符指針遞增
delay_ms(50);if (SW1) return; //未置于SW1位置時立即返回
}
delay_ms(1000); goto LOOP1; //顯示完所有字符后暫停1s然后繼續(xù)
}
//-----------------------------------------------------------------
// SW2: 帶光標顯示隨機算術式
//-----------------------------------------------------------------
void Cursor_Display()
{
INT8U i; int a,b; char disp_buff[17];
Write_LCD_Command (0x0C); //開顯示,關光標
LCD_ShowString(0,0,"LCD1602 DEMO - 2"); //第0行顯示標題
LCD_ShowString(1,0," "); //清空第1行(輸出16個空格)
Write_LCD_Command(0x0F); //開顯示,開光標,光標閃爍
srand(TH0); //用THO作為隨機種子
while (1)
{ if (SW2) return; //未置于SW2位置時立即返回
a = rand() % 100; //產(chǎn)生不超過100的隨機數(shù)a,b;
b = rand() % 100;
sprintf(disp_buff, // 生成算術式及運算結(jié)果字符串
"%2d + %2d = %2d",a,b,a+b);
Write_LCD_Command(0xC0); //顯示位置定位于第1行開始位置
for (i = 0; i < 16; i++) //循環(huán)逐個輸出算術式字符
{ if (disp_buff[i]) Write_LCD_Data(disp_buff[i]);
else Write_LCD_Data(' ');
delay_ms(100);
}
delay_ms(200); //顯示完一個算術式后暫停200ms
LCD_ShowString(1,0," "); //清空該行(輸出16個空格)
}
}
//-----------------------------------------------------------------
// SW3: 全碼表字符顯示
//-----------------------------------------------------------------
void Show_All_Inter_Chars()
{
INT8U i,j = 0;
Write_LCD_Command(0x0C); //開顯示,關光標
LCD_ShowString(0,0,"LCD1602 DEMO - 3"); //第 0行顯示標題
LCD_ShowString(1,0," "); //第1 行清空(輸出16個空格)
LOOP3:
Write_LCD_Command(0xC0); //顯示位置定位于第1行開始位置
//從全碼表顯示,范圍為0x20~0xFF,超過0xFF后溢出為0x00,循環(huán)結(jié)束
for (i = 0x20; i != 0x00; i++)
{ if (i >= 0x80 && i <= 0x9F) continue; //跳過空白區(qū)字符
if ((++j) % 16 == 0) //判斷是否顯示滿一行
{ delay_ms(500); //滿一行時延時500ms
LCD_ShowString(1,0," "); //清空該行
Write_LCD_Command(0xC0); //顯示位置定位于第1行開始位置
j=0; //顯示字符計數(shù)變量清零
}
Write_LCD_Data(i); //在當前位置顯示編碼為i的字符
delay_ms(20); //顯示一個字符后短延時40ms
if (SW3) return; //未置于SW3位置時立即返回
}
delay_ms(500); //一趟演示后延時500ms
goto LOOP3; //繼續(xù)全碼表字符顯示
}
//-----------------------------------------------------------------
// SW4: CGRAM自定義字符顯示
//-----------------------------------------------------------------
void Display_CGRAM_Chars()
{
INT8U i,j = 0;
Write_LCD_Command(0x0C); //開顯示,關光標
LCD_ShowString(0,0,"LCD1602 DEMO - 4"); //第0行顯示標題
LOOP4: //第1組自定義CGRAM字符演示
LCD_ShowString(1,0," "); //第1行清空(輸出16個空格)
Write_CGRAM(CGRAM_Dat1,7); //第1組自定義字符點陣寫入CGRAM
Write_LCD_Command(0xC0 | 1); //顯示位置定位于第1行1列位置
for (i = 6; i != 0xFF; i--) //7線~1線式方塊逐個顯示
{ Write_LCD_Data(i); //在當前位置顯示編碼為i的字符
delay_ms(50); if (SW4) return; //未置于SW4位置時立即返回
}
for(i = 0; i <= 6; i++) //1線~7線式方塊逐個顯示
{ Write_LCD_Data(i); //在當前位置顯示編碼為i的字符
delay_ms(50); if (SW4) return; //未置于 SW4位置時立即返回
}
delay_ms (500); //第1組自定義字符演示后延時1s
//第2組自定義CGRAM字符演示
LCD_ShowString(1,0, " "); //第1行清空(輸出16個空格)
Write_CGRAM(CGRAM_Dat2,5); //第2組自定義字符點陣寫入CGRAM
Write_LCD_Command(0xC0 | 4); //顯示位置定位于第1行4列位置
for (i = 0; i <= 4; i++) //5個自定義漢字字符顯示
{ Write_LCD_Data(i); //在當前位置顯示編碼為i的字符
Write_LCD_Data(' '); //每顯示一個自定義字符后加一一 空格
delay_ms(100);if (SW4) return; //未置于SW4位置時立即返回
}
delay_ms(1000); //第2組自定義字符演示后延時1s
goto LOOP4; //繼續(xù)
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
P3 = 0xFF; //P3端口置為0xFF
Initialize_LCD(); //初始化LCD
TR0 = 1; //啟動定時器,提供隨機種子
while(1) //主循環(huán)控制實現(xiàn)各類演示
{ if (SW1 == 0) H_Scroll_Display();
if (SW2 == 0) Cursor_Display();
if (SW3 == 0) Show_All_Inter_Chars();
if (SW4 == 0) Display_CGRAM_Chars();
}
}
復制代碼
所有資料51hei提供下載:
1602字符液晶工作于8位模式直接驅(qū)動顯示.zip
(60.12 KB, 下載次數(shù): 8)
2020-6-23 16:28 上傳
點擊文件名下載附件
1602字符液晶工作于8位模式直接驅(qū)動顯示
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1