?? lcd128_64.c
字號:
#include "RF04EB.h"
#include "hal.h"
#include "Font.h"
#include "string.h"
#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 = 90;
INT8U BT_State;
void ClearScreen(void);
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;
temp = com;
for(i=0; i<8; i++)
{
if(temp & 0x80)
{
LCD_SDO = 1;
}
else LCD_SDO = 0;
temp <<= 1;
LCD_CLK = 1;
asm("nop");
asm("nop");
LCD_CLK = 0;
}
LCD_CS = 1;
}
/*******************************************************************************
//函數名:void Lcdwritedata(int8u dat)
//功能:lcd寫數據
//輸入:dat數據
//輸出:無
********************************************************************************/
void Lcdwritedata(INT8U dat)
{
INT8U i, temp;
LCD_CS = 0;
LCD_RS = 1;
temp = dat;
for(i=0; i<8; i++)
{
if(temp & 0x80)
{
LCD_SDO = 1;
}
else LCD_SDO = 0;
temp <<= 1;
LCD_CLK = 1;
asm("nop");
asm("nop");
LCD_CLK = 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 SetContrast(INT8U Gain, INT8U Step)
//功能:lcd對比度設定
//輸入:Gain 無實際意義 ,Step 對比度值
//輸出:無
********************************************************************************/
void SetContrast(INT8U Gain, INT8U Step)
{
Lcdwritecom(0x81);
Lcdwritecom(Step);
}
/*********************************************************************
//LCD 端口社初始化
*********************************************************************/
void LcdPortInit(void)
{
IO_DIR_PORT_PIN(0,6,IO_OUT); //
IO_DIR_PORT_PIN(0,1,IO_OUT); //
IO_DIR_PORT_PIN(0,7,IO_OUT); //
IO_DIR_PORT_PIN(1,4,IO_OUT); //
IO_DIR_PORT_PIN(1,5,IO_OUT);
IO_DIR_PORT_PIN(1,6,IO_OUT);
}
/*******************************************************************************
//函數名:void InitLcd(void)
//功能:lcd初始化
//輸入:無
//輸出:無
********************************************************************************/
void InitLcd(void)
{
LcdPortInit();
LCD_PWR = 0; //OLED POWER ON因為是PNP的管子,因此需要設置引腳為低
LCD_CS = 1;
LCD_RS = 1;
LCD_RST = 1;
LCD_CLK = 1;
LCD_SDO = 1;
Resetchip();
Lcdwritecom(0xAE);
Lcdwritecom(0xAD); //dc-dc off
Lcdwritecom(0x8a);
halWait(100);
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();
}
/*******************************************************************************
//函數名:void ClearScreen(void)
//功能:清屏
//輸入:無
//輸出:無
//說明:寫0X00則清除LCD顯示內容
********************************************************************************/
void ClearScreen(void)
{
INT8U i , j;
for (i = 0 ; i < 8 ; i++)
{
SetRamAddr(i,0);
for (j=0;j<132; j++) Lcdwritedata(0x00);
}
}
/*******************************************************************************
//函數名:void Printn(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
//功能:顯示一個6*8無符號數據
//輸入:xx , yy屏幕當中位置,no待顯示數據 yn=0正常顯示 yn=1反黑顯示 le有效位
//輸出:無
********************************************************************************/
void Printn(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
{
INT8U ch2[6];
INT8U ii;
for(ii = 1 ; ii <= le ;)
{
ch2[le - ii] = no % 10 + 0x30;
no /= 10;
ii += 1;
}
ch2[le] = '\0';
Print6(xx ,yy ,ch2 ,yn);
}
/*******************************************************************************
//函數名:void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
//功能:顯示8*8一個無符號數據
//輸入:xx , yy屏幕當中位置,no待顯示數據 yn=0正常顯示 yn=1反黑顯示 le有效位
//輸出:無
********************************************************************************/
void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
{
INT8U ch2[6];
INT8U ii;
for(ii = 1 ; ii <= le ;){
ch2[le - ii] = no % 10 + 0x30;
no /= 10;
ii += 1;
}
ch2[le] = '\0';
Print(xx ,yy ,ch2 ,yn);
}
/*******************************************************************************
//函數名: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 Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
//功能:顯示8*8字符串
//輸入:xx ,yy 坐標,ch1待顯示的字符串,yn是否反黑
//輸出:無
********************************************************************************/
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
while(ch[ii] != '\0')
{
adder = (ch[ii] - 0x20) * 16;
SetRamAddr(y , x);
for(wm = 0;wm < 8;wm++)
{
if(yn == 0)
{
Lcdwritedata(~Font8X8[adder]);
}
else
{
Lcdwritedata(Font8X8[adder]);
}
adder += 1;
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 8;wm++)
{
if(yn == 0)
{
Lcdwritedata(~Font8X8[adder]);
}
else
{
Lcdwritedata(Font8X8[adder]);
}
adder += 1;
}
ii += 1;
x += 8;
}
}
/*******************************************************************************
//函數名:void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
//功能:在屏幕上顯示漢字
//輸入:x ,y 坐標,ch[]待顯示的漢字,yn是否反黑
//輸出:無
********************************************************************************/
void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
wm = 0;
adder = 1;
while(FontNew8X16_Index[wm] > 100)
{
if(FontNew8X16_Index[wm] == ch[ii])
{
if(FontNew8X16_Index[wm + 1] == ch[ii + 1])
{
adder = wm * 14;
break;
}
}
wm += 2; //找到漢字在索引中的位置
}
SetRamAddr(y , x);
if(adder != 1) //找到漢字,顯示出來
{
SetRamAddr(y , x);
for(wm = 0;wm < 14;wm++)
{
if(yn == 0)
{
Lcdwritedata(~FontNew16X16[adder]);
}
else
{
Lcdwritedata(FontNew16X16[adder]);
}
adder += 1;
}
for(wm = 0;wm < 2;wm++)
{
if(yn == 0)
{
Lcdwritedata(0xff);
}
else
{
Lcdwritedata(0x00);
}
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 14;wm++)
{
if(yn == 0)
{
Lcdwritedata(~FontNew16X16[adder]);
}
else
{
Lcdwritedata(FontNew16X16[adder]);
}
adder += 1;
}
for(wm = 0;wm < 2;wm++)
{
if(yn == 0)
{
Lcdwritedata(0xff);
}
else
{
Lcdwritedata(0x00);
}
}
}
else //找不到字顯示空格
{
ii += 1;SetRamAddr(y , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
Lcdwritedata(0xff);
}
else
{
Lcdwritedata(0x00);
}
}
SetRamAddr(y + 1 , x);
for(wm = 0;wm < 16;wm++)
{
if(yn == 0)
{
Lcdwritedata(0xff);
}
else
{
Lcdwritedata(0x00);
}
}
}
}
/*******************************************************************************
//函數名:void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
//功能:實現漢字及字母混合顯示
//輸入:x ,y 坐標,ch[]待顯示的漢字或字母,yn是否反黑
//輸出:無
********************************************************************************/
void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
{
INT8U ch2[3];
INT8U ii;
ii = 0;
while(ch[ii] != '\0')
{
if(ch[ii] > 127)
{
ch2[0] = ch[ii];
ch2[1] = ch[ii + 1];
ch2[2] = '\0'; //漢字為兩個字節
Print16(y , x , ch2 , yn); //顯示漢字
x += 16;
ii += 2;
}
else
{
ch2[0] = ch[ii];
ch2[1] = '\0'; //字母占一個字節
Print8(y , x , ch2 , yn); //顯示字母
x += 8;
ii += 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);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -