|
51單片機12864大液晶屏proteus仿真
這里的液晶屏是LGM12641BS1R,共享資源,僅供學習參考。
0.png (30.52 KB, 下載次數: 124)
下載附件
2017-5-24 19:26 上傳
QQ圖片20170524173627.png (27.88 KB, 下載次數: 143)
下載附件
2017-5-24 17:36 上傳
單片機源程序:
- //*************************************************************************************************
- //* *
- //* ******************************LCD12864驅動程序************************** *
- //* *
- //*************************************************************************************************
- //*************************************************************************************************
- //* *
- //* ******************************頭文件及宏定義************************** *
- //* *
- //*************************************************************************************************
- #include <at89x51.h>
- #define RST P2_0
- #define E P2_1
- #define RW P2_2
- #define DI P2_3
- #define CS1 P2_5
- #define CS2 P2_4
- #define LCDPORT P0
- #define BUSYSTATUS P0_7 //忙狀態位。
- //#define DISONSTATUS P0_5 //顯示開關狀態位。
- //#define RSTSTATUS P0_4 //復位狀態位。
- #define LCDSTARTROW 0xC0 //設置起始行指令。
- #define LCDPAGE 0xB8 //設置頁指令。
- #define LCDLINE 0x40 //設置列指令。
- //*************************************************************************************************
- //* *
- //* ********************************讀忙標志位********************************* *
- //* *
- //*************************************************************************************************
- bit bCheckBusy()
- {
- LCDPORT=0xFF;
- RW=1;
- DI=0;
- E=1;
- E=0;
- return BUSYSTATUS;
- }
- //*************************************************************************************************
- //* *
- //* ********************************寫數據********************************* *
- //* *
- //*************************************************************************************************
- void vWriteData(unsigned char ucData)
- {
- while(bCheckBusy());
- LCDPORT=0xFF;
- RW=0;
- DI=1;
- LCDPORT=ucData;
- E=1;
- E=0;
- }
- //*************************************************************************************************
- //* *
- //* ********************************寫指令********************************* *
- //* *
- //*************************************************************************************************
- void vWriteCMD(unsigned char ucCMD)
- {
- while(bCheckBusy());
- LCDPORT=0xFF;
- RW=0;
- DI=0;
- LCDPORT=ucCMD;
- E=1;
- E=0;
- }
- //*************************************************************************************************
- //* *
- //* ********************************LCD初始化函數******************************* *
- //* *
- //*************************************************************************************************
- void vLCDInitialize()
- {
- CS1=1;
- CS2=1;
- vWriteCMD(0x38); //8位形式,兩行字符。
- vWriteCMD(0x0F); //開顯示。
- vWriteCMD(0x01); //清屏。
- vWriteCMD(0x06); //畫面不動,光標右移。
- vWriteCMD(LCDSTARTROW); //設置起始行。
- }
- //*************************************************************************************************
- //* *
- //* ******************************顯示自定義行********************************* *
- //* *
- //*************************************************************************************************
- //在8×128的格子里顯示自定義長度的一行
- void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
- {
- unsigned char ucCount; //取值范圍:ucPage:0~7;ucLine:0~127;
- if(ucLine<64) //ucWidth:0~127;ucLine+ucWidth<1128。
- {
- CS1=1;
- CS2=0;
- vWriteCMD(LCDPAGE+ucPage);
- vWriteCMD(LCDLINE+ucLine);
- if((ucLine+ucWidth)<64)
- {
- for(ucCount=0;ucCount<ucWidth;ucCount++)
- vWriteData(*(ucaRow+ucCount));
- }
- else
- {
- for(ucCount=0;ucCount<64-ucLine;ucCount++)
- vWriteData(*(ucaRow+ucCount));
- CS1=0;
- CS2=1;
- vWriteCMD(LCDPAGE+ucPage);
- vWriteCMD(LCDLINE);
- for(ucCount=64-ucLine;ucCount<ucWidth;ucCount++)
- vWriteData(*(ucaRow+ucCount));
- }
- }
- else
- {
- CS1=0;
- CS2=1;
- vWriteCMD(LCDPAGE+ucPage);
- vWriteCMD(LCDLINE+ucLine-64);
- for(ucCount=0;ucCount<ucWidth;ucCount++)
- vWriteData(*(ucaRow+ucCount));
- }
- }
- //*************************************************************************************************
- //* *
- //* *****************************漢字顯示函數*********************************** *
- //* *
- //*************************************************************************************************
- //此函數將16×16漢字顯示在8×128的格子里。
- void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
- {
- vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
- vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);
- }
- //*************************************************************************************************
- //* *
- //* *****************************字符顯示函數*********************************** *
- //* *
- //*************************************************************************************************
- //此函數將8×16字符顯示在8×128的格子里。
- void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
- {
- vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
- vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);
- }
- //*************************************************************************************************
- //* *
- //* **********************************顯示圖片*********************************** *
- //* *
- //*************************************************************************************************
- void vShowGraph(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char ucHigh,unsigned char * ucaGraph)
- {
- unsigned char ucCount;
- for(ucCount=0;ucCount<ucHigh;ucCount++)
- vShowCustomRow(ucPage+ucCount,ucLine,ucWidth,ucaGraph+ucCount*ucWidth);
- }
復制代碼
仿真工程文件和源碼下載:
51單片機12864大液晶屏proteus仿真.zip
(94.29 KB, 下載次數: 37)
2017-5-24 17:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|