LCD12864液晶顯示以51單片機為核心設計一個LCD12864液晶顯示器。具有簡單的文字和圖案花樣顯示功能。
系統主要由51單片機進行控制各個電路的配合,從而完成簡單的花樣顯示文字和圖案的功能。
電路主要包括:
單片機最小系統電路,ST7920控制電路,LCD12864液晶顯示等電路。
點陣圖形液晶
字庫:帶中文字庫、不帶中文字庫
數據接口:串口、并口
LCD12864:指128列,64行點陣的液晶屏,可以顯示32個漢字(16*16的點陣),4行,每行8個漢字)
PPT課件內容預覽:
屏幕截圖(41).png (462.9 KB, 下載次數: 75)
下載附件
2018-9-17 21:31 上傳
屏幕截圖(44).png (297.85 KB, 下載次數: 47)
下載附件
2018-9-17 21:31 上傳
屏幕截圖(43).png (305.92 KB, 下載次數: 36)
下載附件
2018-9-17 21:31 上傳
屏幕截圖(42).png (360.22 KB, 下載次數: 41)
下載附件
2018-9-17 21:31 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (14.42 KB, 下載次數: 36)
下載附件
2018-9-18 01:23 上傳
數字0亮 ,數字1滅
cs1 打開顯示
RW:讀/寫
RS數據/指令
E:使能,下降沿數據寫入控制器內寄存器
cs1=0.,左半屏;cs2=0,右半屏
e(sclk時鐘引腳);RS(cs,打開顯示);rw(sid數據引腳),括號中為串行含義
單片機源程序如下:
- /*
- 液晶12864字符顯示,DDRAM編碼書寫,
- 就是先寫頁地址,頁地址共8頁,例如第2頁
- write_comm(0xba); //,頁地址格式1011 1???
- 然后列地址,列地址共64列,例如第5頁
- write_comm(0x40); //DDRAM的列地址01??????
- */
- #include "reg51.h"
- sbit cs1_zuo=P3^3;
- sbit cs2_you=P3^4;
- sbit enable_12864=P3^5; //允許
- sbit read_write=P3^6; //數據引腳
- sbit command_date=P3^7;//
- void delayms(int t)
- {int i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
-
- }
- void chech_busy()
- { //unsigned char timeout=200;
- unsigned char busy;
- enable_12864=0;
- read_write=1; // 讀寫引腳 1/0
- command_date=0; //命令/數據引腳 1/0
- P2=0xff;//讀入前先置1
- enable_12864=1;
- while(0x80&busy); //最高位為1就忙,不能接收,等待
- enable_12864=0;
- }
-
- unsigned char read_date()//實際讀狀態寄存器
- {unsigned char dat;
- chech_busy();//每次讀寫之前進行忙檢測
- enable_12864=0;
- command_date=1;
- read_write=1;
- P2=0xff;//準備讀入
- enable_12864=1; //enable_12864的高電平讀數據
- dat=P2;
- delayms(2);//延時
- enable_12864=0;
- return dat;
- }
- void write_date(unsigned char dat)
- { chech_busy();//每次讀寫之前進行忙檢測
- command_date=1; //寫數據RS引腳高電平
- read_write=0;
- P2=dat;
- delayms(2); //延時50us
- enable_12864=1; //e的下降沿寫入
- delayms(2); //延時50us
- enable_12864=0;
-
- }
- //
- void write_comm(unsigned char comm)
- { chech_busy();//每次讀寫之前進行忙檢測
- command_date=0; //寫命令RS引腳低電平
- read_write=0;
- P2=comm;
- delayms(2);
- enable_12864=1; //e的下降沿寫入
- delayms(2);
- enable_12864=0;
- }
- /*******初始化**************/
- void init_lcd()
- { delayms(100);
- write_comm(0x30);//8位數據,基本指令集
- write_comm(0x0c);//顯示打開,光標關、反白關
- write_comm(0x01);//清屏,DDRAM填滿0x20,且地址計數器清0
-
- delayms(100);
- }
-
- void main()
-
- {unsigned char code tuan[]=
- //陽碼(0點亮)逐列,逆向
- {
- // 0xFF,0xF7,0xFD,0xF7,0xFD,0xF7,0x0D,0xF7, //馬
- // 0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,
- // 0x7D,0xF7,0x7D,0xF7,0x01,0xB7,0x7F,0x7F,
- // 0x7F,0xBF,0x7F,0xC0,0xFF,0xFF,0xFF,0xFF
- 0xDF,0xDD,0xCF,0x98,0x53,0xDD,0x9C,0xED,0xDF,0xED,0xE7,0x6D,0xF7,0xBF,0xF7,0xCF,
- 0x07,0xF0,0x76,0xFF,0x71,0xBF,0x77,0x7F,0x77,0xBF,0x77,0xC0,0xF7,0xFF,0xFF,0xFF,/*"紡",0*/
- 0xDF,0xDD,0xCF,0x98,0x53,0xDD,0x9C,0xED,0xDF,0xED,0xE7,0x6D,0xFF,0xBF,0x03,0xDC,
- 0xFB,0xE6,0xFB,0xFE,0xFB,0xFE,0xFB,0xF6,0xFB,0xEE,0x03,0xDC,0xFF,0x3F,0xFF,0xFF,/*"織",1*/
- 0xFD,0xF7,0xFD,0xE7,0x01,0xF0,0x6D,0xF7,0x6D,0xFB,0x01,0x00,0xFD,0xFB,0xFD,0x7F,
- 0x03,0x9C,0xFB,0xE6,0xFB,0xFE,0xFB,0xFE,0xFB,0xF6,0x03,0xCC,0xFF,0x3F,0xFF,0xFF,/*"職",2*/
- 0xFF,0xBF,0xEF,0xBF,0x9F,0xBF,0x7F,0xBC,0xFF,0xBF,0x00,0x80,0xFF,0xBF,0xFF,0xBF,
- 0xFF,0xBF,0x00,0x80,0xFF,0xBD,0xFF,0xBE,0x3F,0xBF,0xCF,0xBF,0xFF,0xBF,0xFF,0xFF,
- 0xFF,0xFF,0x8F,0xCF,0xF7,0xD7,0xF7,0xDB,0xF7,0xDD,0x77,0xDE,0x8F,0xCF,0xFF,0xFF,/*"2",0*/
- 0xFF,0xFF,0x1F,0xF0,0xEF,0xEF,0xF7,0xDF,0xF7,0xDF,0xEF,0xEF,0x1F,0xF0,0xFF,0xFF,/*"0",1*/
- 0xFF,0xFF,0xEF,0xDF,0xEF,0xDF,0x07,0xC0,0xFF,0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,/*"1",2*/
- 0xFF,0xFF,0x8F,0xE3,0x77,0xDD,0xF7,0xDE,0xF7,0xDE,0x77,0xDD,0x8F,0xE3,0xFF,0xFF/*"8",3*/
- };
- int i,j,t,x=0x80,y=0x80; //x,y為點陣的坐標0x80
- delayms(20);
- init_lcd();
- //硬件上左屏開了顯示了
- write_comm(0x01);//清屏
- delayms(40);
- cs1_zuo=0; //寫左屏
- cs2_you=1;
- write_comm(0xb8+0); //頁地址0頁1011 1???
- write_comm(0x40); //DDRAM的列地址40~7f,64列
-
- for(i=0;i<64;i++)
- write_date(tuan[2*i]);
-
- write_comm(0xb8+1);//頁地址1頁1011 1???
- write_comm(0x40);//DDRAM的列地址40~7f,64列
- //列地址設定后,列地址自動加1
- //頁地址重設起作用,設定后保持
- for(i=0;i<64;i++)
- write_date(tuan[2*i+1]);
- cs1_zuo=1; //寫右屏
- cs2_you=0;
- write_comm(0xb8+2); //頁地址3頁1011 1???
- write_comm(0x40+32); //DDRAM的列地址40~7f,64列
-
- for(i=64;i<96;i++)
- write_date(tuan[2*i]);
- write_comm(0xb8+3); //頁地址4頁1011 1???
- write_comm(0x40+32); //DDRAM的列地址40~7f,64列
-
- for(i=64;i<96;i++)
- write_date(tuan[2*i+1]);
- while(1);
- }
復制代碼
0.png (49.99 KB, 下載次數: 33)
下載附件
2018-9-18 01:22 上傳
所有資料51hei提供下載:
參考資料.zip
(8.98 MB, 下載次數: 42)
2018-9-17 21:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|