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