出于愛好,喜歡單片機而進行的學習,將學習過程發(fā)出來進行交流。如有不妥的地方,也希望大家可以指正,多謝。軟件版本:proteus8.9,keil uvision5
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
顯示結果:
圖片及字體取模
附件中含詳細的代碼及C源文件,及顯示的控制芯片的手冊及個人記錄的相應芯片操作指令。
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<stdlib.h>
- #define uchar unsigned char
- #define uint unsigned int
- //定義端口
- sbit A0=P2^0; //定義端口是傳輸命令還是數(shù)據(jù),
- sbit RW=P2^1;//定義端口是讀取還是寫入,
- sbit LCDEN=P2^2;//芯片使能啟動
- sbit RST=P2^3;//復位鍵
- uchar code dis1[]={/*-- 文字: 我 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
- 0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00};
- uchar code dis2[]={
- /*-- 文字: 愛 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- 0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00,
- 0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00};
- 中間省略 見附件
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
- };
- /*******************************************************************************
- * 函 數(shù) 名 : delay_ms,
- * 函數(shù)功能 : 毫秒延時程序
- * 輸 入 : 輸入延時時間長度,單位為毫秒
- * 輸 出 : 無
- *******************************************************************************/
- void delay_ms(uint x)
- {
- uint i,j;
- for (j=0;j<x;j++)
- for(i=0;i<110;i++);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : write_com
- * 函數(shù)功能 : LCD寫指令程序
- * 輸 入 : 輸入LCD對應的設置指令代碼
- * 輸 出 : 對LCD進行相應的設置
- *******************************************************************************/
- void write_com(uchar cmd)
- {
- A0=0;
- RW=0;
- LCDEN=1;
- P0=cmd;
- _nop_();
- LCDEN=0;
- RW=1;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : write_dat
- * 函數(shù)功能 : LCD寫數(shù)據(jù)程序
- * 輸 入 : 向LCD寫入對應的數(shù)據(jù)或代碼
- * 輸 出 : 對LCD數(shù)據(jù)輸入顯示
- *******************************************************************************/
- void write_dat(uchar dat)
- {
- A0=1;
- RW=0;
- LCDEN=1;
- P0=dat;
- _nop_();
- LCDEN=0;
- RW=1;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LCD_Initial
- * 函數(shù)功能 : 對LCD進行初始化
- * 輸 入 : 對LCD的初始狀態(tài)進行配置
- * 輸 出 : 無
- *******************************************************************************/
- /*LCD初始化*/
- void LCD_Initial()
- {
- RST=0;
- delay_ms(10);
- RST=1;
- delay_ms(10);
- write_com(0xa2); //1/9 bias set
- write_com(0xa1); //adc=0,正常從左到右顯示
- write_com(0xc8); //COM顛倒輸出,,Startline0在上側,Com0 在上側
- write_com(0xae); //Display_Hanzi 0ff
- write_com(0xaf); //Display_Hanzi on
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Display_Hanzi
- * 函數(shù)功能 : 在指定的行與列寫入對應的漢字
- * 輸 入 : a對應的是寫入位置的頁,b對應寫入字符的列,c為寫入的漢字代碼數(shù)組,漢字的寬度為16,
- 則在對高四位來進行設定的時候,直接用0x10與其列數(shù)進行與操作,高四位的變化范圍只能
- 為0-7,滿足128列的范圍。
- * 輸 出 : 在屏幕上顯示要輸出的內容
- *******************************************************************************/
- void Display_Hanzi(int a,int b,uchar *c)
- {
- int n;
- for(n=0;n<=15;n++)
- {
- write_com(a); //選擇a頁
- _nop_();
- write_com(0x10|b); //由于字符特征,直接選取對應的高位進行設置。
- _nop_();
- write_com(0x00|n);
- _nop_();
- write_dat(c[n]);
- _nop_();
-
- write_com(1+a); //選擇a+1頁
- _nop_();
- write_com(0x10|b);//列的高四位
- _nop_();
- write_com(0x00|n);//列的低四位
- _nop_();
- write_dat(c[n+16]);
- _nop_();
- }
-
- }
-
- /*******************************************************************************
- * 函 數(shù) 名 : Display_SC
- * 函數(shù)功能 : 在指定的行與列寫入對應的單字節(jié)字符
- * 輸 入 : a對應的是寫入位置的頁,b對應寫入字符的列,c為寫入的漢字代碼數(shù)組
- * 輸 出 : 在屏幕上顯示要輸出的內容
- *******************************************************************************/
- void Display_SC(int a,int b,uchar *c)
- {
- int n;
- int C_high,C_low;
- C_high = (b&0xF0)>>4;//選擇列的高四位
- C_low = (b&0x0F); //列的低四位
- for(n=0;n<=7;n++)
- {
- write_com(a); //選擇a頁
-
- write_com(0x10|C_high);//列的高四位
- write_com((0x00|C_low)+n);//列的低四位
- write_dat(c[n]);
-
- write_com(1+a); //選擇a+1頁
- write_com(0x10|C_high);//列的高四位
- write_com((0x00|C_low)+n);//列的低四位
- write_dat(c[n+8]);
- }
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Display_BMP
- * 函數(shù)功能 : 顯示圖片的內容,圖片大小為128*64
- * 輸 入 : 輸入對應的代碼數(shù)組
- * 輸 出 : 在屏幕上顯示要輸出的圖片內容
- *******************************************************************************/
- void Display_BMP(uchar *bmp)
- {
- int i=0; //頁碼,0-7頁
- int j=0; //列數(shù),0-127列,對應一行的像素數(shù)
- int C_high,C_low,C_COLUMN;
- {
- for(i=0;i<8;i++)
- {
- write_com(0xb0+i);//寫入頁數(shù)
-
- C_COLUMN=0x00;
-
- for (j=0;j<128;j++)
- {
- if(j<128)
- {
-
- C_high = ((C_COLUMN+j)&0xF0)>>4;//選擇列的高四位
- C_low = ((C_COLUMN+j)&0x0F); //列的低四位
- write_com(0x10|C_high);//列的高四位
- write_com(0x00|C_low);//列的低四位
-
- write_dat(bmp[i*128+j]);}
- else
- {
- C_COLUMN=0X00;
-
- }
-
- }
- }
-
- }
- }
-
-
- main()
- {
- LCD_Initial();
-
-
- while(1)
-
- {
-
- Display_Hanzi(0xb0,0x00,dis1);
- Display_Hanzi(0xb0,0x01,dis2);
- Display_Hanzi(0xb0,0x02,dis3);
- Display_Hanzi(0xb0,0x03,dis4);
- Display_Hanzi(0xb0,0x04,dis5);
- Display_Hanzi(0xb0,0x05,dis6);
- Display_Hanzi(0xb0,0x06,dis7);
-
- Display_Hanzi(0xb2,0x00,dis21);
- Display_Hanzi(0xb2,0x01,dis22);
- Display_Hanzi(0xb2,0x02,dis23);
-
- Display_SC(0xb4,0x00,dis30);
- Display_SC(0xb4,0x08,dis31);
- Display_SC(0xb4,16,dis32);
- Display_SC(0xb4,24,dis33);
- Display_SC(0xb6,0,dis40);
- Display_SC(0xb6,8,dis41);
- Display_SC(0xb6,16,dis42);
- Display_SC(0xb6,24,dis43);
-
- delay_ms(2000);
-
- Display_BMP(img);
-
-
- delay_ms(2000);
- Display_BMP(C_Clear);
-
- }
-
-
- }
復制代碼
所有資料51hei提供下載:
12864 Display.zip
(1.82 MB, 下載次數(shù): 66)
2020-12-1 09:18 上傳
點擊文件名下載附件
|