📄 lcd128_64.c
字号:
#include "c51rf3_4620.h"
#include "Font.h"
//#define LCD_SDO LATCbits.LATC5//#define LCD_CLK LATCbits.LATC3#define LCD_CS LATAbits.LATA4#define LCD_RS LATEbits.LATE0#define LCD_RST LATEbits.LATE1
//初始化SPI
#define LCD_CONFIG()\{\ TRISCbits.TRISC3 = 0;\ TRISCbits.TRISC5 = 0;\ TRISAbits.TRISA4 = 0;\ TRISEbits.TRISE0 = 0;\ TRISEbits.TRISE1 = 0;\
SSPSTAT=0x80;\
SSPCON1=0x30;\
PIR1bits.SSPIF=0;\}
#define RECALIB_TIMEOUT 12000 // Every 2 minutes
#define MSG_PING 0x00
#define MSG_SEND 0x10
#define MSG_RECIVE 0x20
#define MSG_NEEDSEND 0x30
INT8U ContrastValue = 0x38;
void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn);
void Print6(INT8U xx,INT8U yy,INT8U ch1[],INT8U yn);
/*******************************************************************************
//函数名:void delaylcd (int16u x)
//功能:廷时
//输入:时间
//输出:无
********************************************************************************/
void delaylcd (INT16U x)
{
INT8U j;
while (x--)
{
for (j=0;j<115;j++);
}
}
/*******************************************************************************
//函数名:void fdelay(unsigned int n)
//功能:廷时
//输入:时间
//输出:无
********************************************************************************/
void fdelay(unsigned int n) /* wait n seconds*/
{
INT16U i;
INT16U j;
for (i=0;i<5;i++)
for (j=0;j<n*2;j++) ;
}
/*******************************************************************************
//函数名:void Lcdwritecom(int8u com)
//功能:lcd写指令
//输入:com指令
//输出:无
********************************************************************************/
void Lcdwritecom(INT8U com)
{
//INT8U i, temp;
//LCD_CLK = 0;
LCD_CS = 0;
LCD_RS = 0;
SSPBUF=com;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
LCD_CS = 1;
}
/*******************************************************************************
//函数名:void Lcdwritedata(int8u dat)
//功能:lcd写数据
//输入:dat数据
//输出:无
********************************************************************************/
void Lcdwritedata(INT8U dat)
{
INT8U i, temp;
LCD_CS = 0;
LCD_RS = 1;
SSPBUF=dat;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
LCD_CS = 1;
}
/*******************************************************************************
//函数名:void Prog_Reset(void)
//功能:lcd复位
//输入:无
//输出:无
********************************************************************************/
void Prog_Reset(void)
{
LCD_RST = 0;
delaylcd(100);
LCD_RST = 1;
}
/*******************************************************************************
//函数名:void Resetchip(void)
//功能:lcd软件复位
//输入:无
//输出:无
********************************************************************************/
void Resetchip(void)
{
Prog_Reset();
}
/*******************************************************************************
//函数名:void SetRamAddr (INT8U Page, INT8U Col)
//功能:lcd位置选择
//输入:Page-页,Col-列
//输出:无
********************************************************************************/
void SetRamAddr (INT8U Page, INT8U Col)
{
Lcdwritecom(0xB0 + Page);
Lcdwritecom(Col & 0x0f); //Set lower column address
Lcdwritecom(0x10 | ((Col & 0xf0) >> 4)); //Set higher column address
}
/*******************************************************************************
//函数名:void LoadICO(INT8U y , INT8U x , INT8U Ico[])
//功能:打开一个指定指针的图标
//输入:x,y坐标 Ico[]图片
//输出:无
********************************************************************************/
void LoadICO(void)
{
INT16U i,j;
for(i=0; i<8; i++)
{
SetRamAddr(i , 0);
for(j = 0;j < 112;j++)
{
Lcdwritedata(WXL112X64[j+i*112]);
}
}
fdelay(50000);
}
/*******************************************************************************
//函数名:void ClearScreen(void)
//功能:清屏
//输入:无
//输出:无
********************************************************************************/
void ClearScreen(void)
{
INT8U i;
INT8U j;
for(i=0; i<8 ; i++)
{
SetRamAddr(i,0);
for(j=0; j<128; j++)
{
Lcdwritedata(0x00);
}
}
}
/*******************************************************************************
//函数名:void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
//功能:显示6*8字符串
//输入:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
//输出:无
********************************************************************************/
void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
{
INT8U ii = 0;
INT8U bb = 0;
unsigned int index = 0 ;
SetRamAddr(xx , yy);
while(ch1[bb] != '\0')
{
index = (unsigned int)(ch1[bb] - 0x20);
index = (unsigned int)index*6;
for(ii=0;ii<6;ii++)
{
if(yn)
{
Lcdwritedata(FontSystem6x8[index]);
}
else
{
Lcdwritedata(~FontSystem6x8[index]);
}
index += 1;
}
bb += 1;
}
}
/*******************************************************************************
//函数名:void Rectangle(INT8U x1,INT8U y1,INT8U x2,INT8U y2)
//功能:画直线函数,本函数目前只能画水平和垂直线
//输入:x1,y1(第一个点) x2,y2第二个点
//输出:无
********************************************************************************/
void Rectangle(INT8U x1,INT8U y1,INT8U x2,INT8U y2)
{
INT8U ii;
for(ii=x1; ii<x2; ii++)
{
SetRamAddr(y1,ii);
Lcdwritedata(0x08);
SetRamAddr(y2,ii);
Lcdwritedata(0x08); //画横线
}
SetRamAddr(y1,x1);
Lcdwritedata(0xF0);
SetRamAddr(y1,x2);
Lcdwritedata(0xF0);
for(ii = y1+1;ii<y2;ii++)
{
SetRamAddr(ii,x1);
Lcdwritedata(0xff);
SetRamAddr(ii,x2);
Lcdwritedata(0xff); //画竖线
}
SetRamAddr(y2,x1);
Lcdwritedata(0x0F);
SetRamAddr(y2,x2);
Lcdwritedata(0x0F);
}
/*******************************************************************************
//函数名:void InitLcd(void)
//功能:lcd初始化
//输入:无
//输出:无
********************************************************************************/
void InitLcd(void)
{
LCD_CONFIG();
LCD_CS = 1;
LCD_RS = 1;
LCD_RST = 1;
Resetchip();
Lcdwritecom(0xAE);
Lcdwritecom(0xAD); //dc-dc off
Lcdwritecom(0x8a);
fdelay(2000);
Lcdwritecom(0x00);
Lcdwritecom(0x10);
Lcdwritecom(0x40);
Lcdwritecom(0x81);
Lcdwritecom(ContrastValue);
Lcdwritecom(0xA0);
Lcdwritecom(0xA4);
Lcdwritecom(0xA6);
Lcdwritecom(0xA8);
Lcdwritecom(0x3f);
Lcdwritecom(0xD3);
Lcdwritecom(0x00);
Lcdwritecom(0xD5);
Lcdwritecom(0x20);
Lcdwritecom(0xD8);
Lcdwritecom(0x00);
Lcdwritecom(0xDA);
Lcdwritecom(0x12);
Lcdwritecom(0xDB);
Lcdwritecom(0x00);
Lcdwritecom(0xD9);
Lcdwritecom(0x22);
Lcdwritecom(0xc8);
Lcdwritecom(0xAF);
ClearScreen();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -