?? lcd12864.c
字號:
//*************************************************************************************************
//* *
//* ******************************LCD12864驅動程序************************** *
//* *
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include <at89x51.h>
#include "LCDShowMap.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 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<128。
{
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);
}
*/
//*************************************************************************************************
//* *
//* **********************************顯示數字*********************************** *
//* *
//*************************************************************************************************
void vShowNumber(unsigned char ucRow,unsigned char ucLine,unsigned long ulNumber)
{
unsigned char ucaNumber[4];
unsigned char ucCount;
unsigned char ucNumFront;
if(ulNumber>9999)
return;
ucaNumber[0]=ulNumber/1000;
ucaNumber[1]=(ulNumber-1000*(long)ucaNumber[0])/100;
ucaNumber[2]=(ulNumber-1000*(long)ucaNumber[0]-100*(long)ucaNumber[1])/10;
ucaNumber[3]=(ulNumber-1000*(long)ucaNumber[0]-100*(long)ucaNumber[1]-10*(long)ucaNumber[2]);
for(ucNumFront=0;ucNumFront<3;ucNumFront++)
if(ucaNumber[ucNumFront]!=0)
break;
for(ucCount=0;ucCount<4;ucCount++)
{
if(ucCount<ucNumFront)
vShowOneChar(ucRow,ucLine+ucCount*8,uca_BLANK);
else
switch(ucaNumber[ucCount])
{
case 0:vShowOneChar(ucRow,ucLine+ucCount*8,uca_0);break;
case 1:vShowOneChar(ucRow,ucLine+ucCount*8,uca_1);break;
case 2:vShowOneChar(ucRow,ucLine+ucCount*8,uca_2);break;
case 3:vShowOneChar(ucRow,ucLine+ucCount*8,uca_3);break;
case 4:vShowOneChar(ucRow,ucLine+ucCount*8,uca_4);break;
case 5:vShowOneChar(ucRow,ucLine+ucCount*8,uca_5);break;
case 6:vShowOneChar(ucRow,ucLine+ucCount*8,uca_6);break;
case 7:vShowOneChar(ucRow,ucLine+ucCount*8,uca_7);break;
case 8:vShowOneChar(ucRow,ucLine+ucCount*8,uca_8);break;
case 9:vShowOneChar(ucRow,ucLine+ucCount*8,uca_9);break;
default:break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -