📄 lcd.c
字号:
#include "cpld.h"
/************************************************************/
/* define sub function */
/************************************************************/
extern void InitLcd(void);
extern void Delay(unsigned int DelayValue);
extern void LcdDisplayOpen(void);
extern void LcdDisplayClose(void);
extern unsigned char LcdJudgeBusyL(void);
extern unsigned char LcdJudgeBusyR(void);
extern void LcdSetPageL(unsigned char LcdPageL);
extern void LcdSetPageR(unsigned char LcdPageR);
extern void LcdSetStartlineL(unsigned char LcdStartlineL);
extern void LcdSetStartlineR(unsigned char LcdStattlineR);
extern void LcdSetYaddressL(unsigned char LcdYaddressL);
extern void LcdSetYaddressR(unsigned char LcdYaddressR);
extern void LcdWriteDataL(unsigned char LcdDataL);
extern void LcdWriteDataR(unsigned char LcdDataR);
extern unsigned char LcdReadDataL(void);
extern unsigned char LcdReadDataR(void);
extern void LcdDrawPoint(unsigned char LcdPositionX,
unsigned char LcdPositionY);
extern void LcdDrawCharacter(unsigned char *Matrix,
unsigned char LcdRaw,
unsigned char LcdCol);
extern void LcdDrawSign_English(unsigned char Sign_x,unsigned char LcdRaw,unsigned char LcdCol,bool Position);
extern void LcdDrawNumber(unsigned char num_x,unsigned char LcdRaw,unsigned char LcdCol,bool Position);
extern void LcdDrawCapital(unsigned char capital_x,unsigned char LcdRaw,unsigned char LcdCol,bool Position);
extern void LcdDrawLetter(unsigned char letter_x,unsigned char LcdRaw,unsigned char LcdCol,bool Position);
extern void LcdDrawSign_China(unsigned short Sign_x,unsigned char LcdRaw,unsigned char LcdCol,bool Position);
extern void LcdDrawRectangle(unsigned char LcdStartPosX,
unsigned char LcdStartPosY,
unsigned char LcdEndPosX,
unsigned char LcdEndPosY);
extern void LcdWriteBack(void);
//****************** 数字和符号的点阵 **********************//
extern unsigned char Number_sz[];
extern unsigned char Sign_english[];
extern unsigned char Letter[];
extern unsigned char Capital[];
extern unsigned char Sign_china[];
/************************************************************/
/* define variable */
/************************************************************/
unsigned char DisplayBuffer[8][128];//采用2维数组,因为全屏共有128*64个点,
//而64行中每8个点为一个字节(为一页),所以需8*128个字节来存储
//排放数据时按全屏,以页和Y地址来排放
//即每个16*16的块,上半部与下半部相差128个字节.
//对字符存储时采用了两个2维数组,一个2维数组是以要显示的字为单位,
//半屏分为一个4*4的区域,坐标从(0,0)到(3,3)
//另一个2维数组是以点阵的字节为单位,即8*128;
/************************************************************/
/* sub function */
/************************************************************/
void Delay(unsigned int DelayValue)
{
unsigned int CurrentDelayValue;
for(CurrentDelayValue = 0;
CurrentDelayValue < DelayValue;
CurrentDelayValue ++)
{;
}
}
void InitLcd(void)
{
unsigned char i,j;
LcdDisplayOpen();
for(i=0;i<8;i++)
{
for(j=0;j<128;j++)
{
DisplayBuffer[i][j] = 0x00;
}
}
LcdWriteBack();
}
/*******************************************************/
void LcdDisplayOpen(void)
{
*pLcdCtrlL = 0x3f;
*pLcdCtrlR = 0x3f;
}
void LcdDisplayClose(void)
{
*pLcdCtrlL = 0x3e;
*pLcdCtrlR = 0x3e;
}
/********************************************************/
unsigned char LcdJudgeBusyL(void)
{
unsigned char lcdstatusl = 0;
lcdstatusl = *pLcdStatusL;
if(lcdstatusl >= 128)
{
return(1);//busy
}
else
{
return(0);//ready
}
}
unsigned char LcdJudgeBusyR(void)
{
unsigned char lcdstatusr = 0;
lcdstatusr = *pLcdStatusR;
if(lcdstatusr >= 128)
{
return(1);//busy
}
else
{
return(0);//ready
}
}
/*********************************************************/
void LcdSetPageL(unsigned char LcdPageL)//设置左边的页地址
{
*pLcdCtrlL = 184 + LcdPageL;
while(LcdJudgeBusyL())
{;
}
}
void LcdSetPageR(unsigned char LcdPageR)//设置右边的页地址
{
*pLcdCtrlR = 184 + LcdPageR; //184=0xB8=1011 1000
while(LcdJudgeBusyR()) //检测是否完毕
{;
}
}
void LcdSetStartlineL(unsigned char LcdStartlineL)//设置左边的起始行
{
*pLcdCtrlL = 192 + LcdStartlineL; //192=0xc0=1100 0000B
while(LcdJudgeBusyL())
{;
}
}
void LcdSetStartlineR(unsigned char LcdStartlineR)//设置右边的起始行
{
*pLcdCtrlR = 192 + LcdStartlineR;
while(LcdJudgeBusyR())
{;
}
}
void LcdSetYaddressL(unsigned char LcdYaddressL)
{
*pLcdCtrlL = 64 + LcdYaddressL;
while(LcdJudgeBusyL())
{;
}
}
void LcdSetYaddressR(unsigned char LcdYaddressR)//设置Y地址
{
*pLcdCtrlR = 64 + LcdYaddressR;//64=0x40=0100 0000
while(LcdJudgeBusyR())
{;
}
}
void LcdWriteDataL(unsigned char LcdDataL)
{
*pLcdWriteL = LcdDataL;
while(LcdJudgeBusyL())
{;
}
}
void LcdWriteDataR(unsigned char LcdDataR)//写显示数据
{
*pLcdWriteR = LcdDataR;
while(LcdJudgeBusyR())
{;
}
}
unsigned char LcdReadDataL(void)
{
unsigned char ReadOutData;
ReadOutData = *pLcdReadL;
while(LcdJudgeBusyL())
{;
}
return(ReadOutData);
}
unsigned char LcdReadDataR(void)
{
unsigned char ReadOutData;
ReadOutData = *pLcdReadR;
while(LcdJudgeBusyR())
{;
}
return(ReadOutData);
}
/*************************************************************************/
void LcdDrawPoint(unsigned char LcdPositionX,unsigned char LcdPositionY)
{
unsigned char Offset;
unsigned char Buffer = 1;
unsigned char Temp;
unsigned char CurrentPage;
CurrentPage = LcdPositionY / 8;
Temp=DisplayBuffer[CurrentPage][LcdPositionX];
Offset = LcdPositionY % 8;
Buffer = Buffer << Offset; //decide the display data.
Buffer = Temp | Buffer; //temp or buffer according to bit.
DisplayBuffer[CurrentPage][LcdPositionX] = Buffer;
}
void LcdDrawCharacter(unsigned char *Matrix,unsigned char LcdRaw,unsigned char LcdCol)
{
unsigned char i,j;
for(j=0;j<16;j++)
{
for(i=0;i<2;i++)
{
DisplayBuffer[i +LcdRaw*2][j + LcdCol*16] = *(Matrix ++);
}
}
// 该字模应用于单色的点阵液晶,数据是纵向的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -