理解單片機的液晶顯示器接口原理,掌握基本編程流程。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- //函數庫名稱:12864顯示函數
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define PORT P0
- sbit CS1=P2^4; //左半屏片選腳
- sbit CS2=P2^3; //右半屏片選腳
- sbit RS=P2^2; //H代表數據輸入,L代表指令碼輸入
- sbit RW=P2^1; //H讀取,L寫入
- sbit E=P2^0; //使能,由H到L完成使能
- sbit bflag=P0^7; //忙標志位
- uchar code Num[]={
- 0x00,0x20,0x60,0xE0,0xE0,0xE0,0xF0,0xFC,
- 0xFF,0xFC,0xF0,0xE0,0xE0,0xE0,0x60,0x20,
- 0x00,0x00,0x40,0x30,0x3D,0x1F,0x1F,0x0F,
- 0x07,0x0F,0x1F,0x1F,0x3D,0x30,0x40,0x00, //星號
- 0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0xff,
- 0x08,0x08,0x08,0x08,0x08,0xfc,0x08,0x00,
- 0x00,0x03,0x01,0x01,0x01,0x01,0x01,0xff,
- 0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00, //中
- 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xff,
- 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,
- 0x00,0x7f,0x20,0x20,0x20,0x20,0x20,0x3f,
- 0x20,0x20,0x20,0x20,0x20,0x7f,0x00,0x00, //山
- 0x20,0x20,0x20,0x20,0x20,0x20,0xa0,0x7f,
- 0xa0,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
- 0x00,0x40,0x40,0x20,0x10,0x0c,0x03,0x00,
- 0x01,0x06,0x08,0x10,0x20,0x60,0x20,0x00, //大
- 0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
- 0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
- 0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7e,
- 0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00, //學
- };
- //****驅動函數****
- void Left()//選左半屏
- {
- CS1=0;
- CS2=1;
- }
- void Right()//選右半屏
- {
- CS1=1;
- CS2=0;
- }
- void Busy_12864()//判忙函數
- {
- do
- {
- E=0;
- RS=0; //讀狀態
- RW=1;
- PORT=0xff;
- E=1;
- E=0;
- }
- while(bflag); //若bflag=1則代表系統忙
- }
- void Wreg(uchar c)//寫指令
- {
- Busy_12864();
- RS=0;
- RW=0;
- PORT=c;
- E=1; //E下降沿,液晶模塊從數據總線寫入指令
- E=0;
- }
- void Wdata(uchar c)//寫數據
- {
- Busy_12864();
- RS=1;
- RW=0;
- PORT=c;
- E=1;
- E=0;
- }
- void Pagefirst(uchar c)//頁設置
- //LCD12864一共可以畫32個字,4行,每行8個字,左半屏4個,右半屏4個;
- //每個字占2頁,第0頁顯示上半字,第1頁顯示下半字,畫1個字是16X16個點;
- //8小行為一頁,DDRAM共64小行,即8頁,Page0-7,所以只能顯示4行漢字
- {
- uchar i;
- i=c;
- c=i|0xb8;//實際頁數和b8(即10111000B)的或運算就是要送的代碼,邏輯加法
- Busy_12864();
- Wreg(c);
- }
- void Linefirst(uchar c)//列設置,Y=0-63,左右半屏各64列
- {
- uchar i;
- i=c;
- c=i|0x40;//實際列數和40(即01000000B)的或運算就是要送的代碼
- Busy_12864();
- Wreg(c);
- }
- //****清屏函數****
- void Ready_12864()
- {
- uint i,j;
- Left();
- Wreg(0x3f);//左屏開顯示;0x3e為關顯示的控制字
- Right();
- Wreg(0x3f);//右屏開顯示;0x3f為開顯示的控制字
- Left();//清左屏
- for(i=0;i<8;i++)
- {
- Pagefirst(i);
- Linefirst(0x00);
- for(j=0;j<64;j++)
- {
- Wdata(0x00);
- }
- }
- Right();//清右屏
- for(i=0;i<8;i++)
- {
- Pagefirst(i);
- Linefirst(0x00);
- for(j=0;j<64;j++)
- {
- Wdata(0x00);
- }
- }
- }
- //****16×6漢字顯示程序****
- void Display(uchar *s,uchar page,uchar line)
- {
- //先上半字,再下半字;由左向右逐列送值
- uchar i,j;
- Pagefirst(page);
- Linefirst(line);
- for(i=0;i<16;i++)
- {
- Wdata(*s);//指針S指向數組Num進行抽數
- s++;
- }
- Pagefirst(page+1);
- //換頁,顯示下半字,一個字需要2頁才可以完成顯示,即16小行
- Linefirst(line);
- for(j=0;j<16;j++)
- {
- Wdata(*s);
- s++;
- }
- }
- main()//主程序
- {
- //在第2行(3、4頁)顯示6個字;
- Ready_12864();
- Left();
- Display(Num+0,0x03,16); //第3頁第16列(左屏第1個字位置)
- Display(Num+32,0x03,32); //第3頁第32列(左屏第2個字位置)
- Display(Num+64,0x03,48); //第3頁第48列(左屏第3個字位置)
- Right();
- Display(Num+96,0x03,0); //第3頁第0列(右屏第0個字位置)
- Display(Num+128,0x03,16); //第3頁第16列(右屏第1個字位置)
- Display(Num+0,0x03,32); //第3頁第32列(右屏第2個字位置)
- while(1);
- }
復制代碼
所有資料51hei提供下載:
LCD12864.zip
(758.39 KB, 下載次數: 86)
2018-6-25 11:34 上傳
點擊文件名下載附件
液晶顯示器接口
|