📄 lcd128_64.c
字号:
#include "app_ex_main.h"
#include "app_ex_util.h"
#include "RF04EB.h"
#include "hal.h"
#include "Font.h"
//#include "mydefine.h"
#include "Font.h"
#define DATA 1
#define COMMAND 0
/****************************************************
* B) Command Table per device *
****************************************************/
#define DisplayOff 0xAE
#define DisplayOn 0xAF
#define DisplayStart 0x40
#define PageAddr 0xB0
#define ColAddrHi 0x10
#define ColAddrLo 0x00
#define SegRemapOff 0xA0
#define SegRemapOn 0xA1
#define NormalDisp 0xA6
#define ReverseDisp 0xA7
#define ExitEntireD 0xA4
#define EntEntireD 0xA5
#define EnterRMW 0xE0
#define ExitRMW 0xEE
#define SWRest 0xE2
#define ComRemapOff 0xC0
#define ComRemapOn 0xC8
#define PwrCtrlReg 0x28
#define OPampBuffer 0x01
#define IntReg 0x02
#define IntVolBstr 0x04
#define IntRegRatio 0x20
#define ContCtrlReg 0x81
#define CmdMuxRatio 0x48
#define CmdBiasRatio 0x50
#define DispOffset 0x44
#define IconModeOn 0xA3
#define IconModeOff 0xA2
#define NlineInver 0x4C
#define DCDCconver 0x64
#define PowersavStandby 0xA8
#define PowersavSleep 0xA9
#define PowersavOff 0xE1
#define InterOsc 0xAB
#define Device SSD1821 /* device under demo */
#define ColNo 132 /* number of Column/Seg on LCD glass*/
#define RowNo 64 /* number of Row/Com/Mux */
#define PS 1 /* fixed to Parallel mode */
#define PageNo 10 /* Total no of RAM pages */
#define IconPage 10 /* Icon Page number */
#define All0 6 /* 3 for all 0, 4 for all 1 */
#define All1 4
#define iIntRegValue 1 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValue 16 /* Contrast Control Register Value */
#define iIntRegValuea 20 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValuea 16 /* Contrast Control Register Value */
#define iIntRegValueb 1 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValueb 16 /* Contrast Control Register Value */
#define MSGNo 16
#define MSGLength 22
#define SSLNameNo 4
#define DevicePg 0 //RAM page for showing device name
#define FeaturePg 1 //RAM page for showing feature
#define GRAPHICNo 13
#define xlogo 38
#define ylogo 5
#define xsolomon 91
#define ysolomon 2
#define xsystech 81
#define ysystech 2
#define xlimited 70
#define ylimited 2
#define xcc 16
#define ycc 2
#define xpageq 128
#define ypageq 4
#define horizonal 0
#define d_time 60
////////////////////////////////////////////////////////////////////////////////////////////
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn);
INT8U ContrastValue = 80;//对比度
void delay1(INT8U jj)
{
INT8U i;
for(i=0; i<jj; i++);
}
void delay_us(INT16U s)
{
INT16U i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************
//函数名:void Write595(INT8U dat)
//输入:数据
//输出:无
//功能描述:595写数据,一次写入8位
//******************************************************************************
void Write595(INT8U dat)
{
INT8U ii;
for(ii = 0 ; ii < 8; ii++)
{
if(dat & 0x80) LCD_595_DAT = 1;
else LCD_595_DAT = 0;
dat <<= 1;
LCD_595_CK = 1;
LCD_595_CK = 0;
}
LCD_595_LD = 1;
LCD_595_LD = 0;
}
//*****************************************************************************
//*****************************************************************************
//函数名:WriteLCD(INT8U fs, INT8U da)
//功能描述:fs:1为命令,0为数据 da:待写数据
//*****************************************************************************
void WriteLCD(INT8U fs, INT8U da)
{
delay1(1);
LCD_CS1 = 0;
LCD_RW = 0; //写操作
delay1(1);
if(fs){
LCD_RS = 1;
}
else{
LCD_RS = 0;
}
delay1(1);
Write595(da);
LCD_E = 1;// = 1;
delay1(1);
LCD_E = 0;// = 0;
delay1(1);
LCD_CS1 = 1;
}
/*
INT8U ReadLCD(INT8U fs)
{
INT8U temp = 0;
LCD_CS1 = 0;
NOP;
NOP;
NOP;
NOP;
do{
LCD_RW = 1;
LCD_RS = 0;
LCD_E = 1;
NOP;
NOP;
temp = P1 & 0x80;
LCD_E = 0;
}while(temp != 0);
if(fs){
LCD_RS = 1;
}
else{
LCD_RS = 0;
}
LCD_E = 1;
NOP;
NOP;
NOP;
NOP;
temp = P1;
LCD_E = 0;
LCD_CS1 = 1;
return(temp);
}
*/
void SetRamAddr(INT8U x ,INT8U y)
{
INT8U temp;
temp = 0x0f & x;
WriteLCD(COMMAND , PageAddr|temp);
temp = 0x0f & (y >> 4);
WriteLCD(COMMAND , ColAddrHi|temp);
temp = 0x0f & y;
WriteLCD(COMMAND , ColAddrLo|temp);
}
/*******************************************************************************
//函数名:void SetContrast(INT8U Gain, INT8U Step)
//功能:lcd对比度设定
//输入:Gain,灰度 Step,对比度
//输出:无
********************************************************************************/
void SetContrast(INT8U Gain, INT8U Step)
{
WriteLCD(COMMAND , IntRegRatio | (0x0f & Gain)); //设定内部电阻
WriteLCD(COMMAND , ContCtrlReg); //设定内部对比控制器
WriteLCD(COMMAND , 0x3f & Step);
}
/*******************************************************************************
//函数名:void InitDisplay(void)
//功能:lcd设定为正常显示状态
//输入:无
//输出:无
********************************************************************************/
void InitDisplay(void)
{
WriteLCD(COMMAND , DisplayOff); //关显示
WriteLCD(COMMAND , SegRemapOn); //ks0713/ssd1815
WriteLCD(COMMAND , ComRemapOn); //ssd1815
SetContrast(iIntRegValue, iContCtrlRegValue); //设定缺省对比度
WriteLCD(COMMAND , PwrCtrlReg | IntVolBstr | IntReg | OPampBuffer); //turn on booster, regulator & divider
WriteLCD(COMMAND , DisplayOn); //开显示
}
/*******************************************************************************
//函数名:void contrastctrl(INT8U start,stop)
//功能:lcd对比度调整
//输入:无
//输出:无
********************************************************************************/
void contrastctrl(INT8U start, INT8U stop)
{
INT8U i;
if (start < stop)
{
for (i=start; i<stop; i+=1)
{
SetContrast(iIntRegValue, i); //slowly turn on display
delay_us(80);
}
}
else
{
for (i=start; i>stop; i-=1)
{
SetContrast(iIntRegValue, i); //slowly turn off display
delay_us(120);
}
}
}
void ClearScreen(void)
{
INT8U x,y;
for(x = 0;x < 8 ;x++){
for(y = 0 ; y < 128 ; y++){
SetRamAddr(x , y);
WriteLCD(DATA , 0x00);
}
}
}
void LCDInit(void)
{
P1DIR |= 0xFF;
P2DIR |= 0xFF;
P0DIR |= 0xFF;
P1_2 = 0;
delay_us(1000);
WriteLCD(COMMAND , 0xE2);//复位
delay_us(1000);
WriteLCD(COMMAND , 0xA3);
delay_us(1000);
WriteLCD(COMMAND , 0xA0);
delay_us(1000);
WriteLCD(COMMAND , 0xC8);
delay_us(1000);
WriteLCD(COMMAND , 0x24);
delay_us(1000);
WriteLCD(COMMAND , 0x81);
delay_us(1000);
WriteLCD(COMMAND , 0x14);
delay_us(1000);
WriteLCD(COMMAND , 0x2F);
delay_us(1000);
WriteLCD(COMMAND , 0x40);//从第一列开始显示
delay_us(1000);
WriteLCD(COMMAND , 0xB0);
delay_us(1000);
WriteLCD(COMMAND , 0x10);
delay_us(1000);
WriteLCD(COMMAND , 0x00);
delay_us(1000);
WriteLCD(COMMAND , 0xAF);
WriteLCD(COMMAND , 0x81);
WriteLCD(COMMAND , 0x1b);
ClearScreen();
SetContrast(20,80);
}
/*******************************************************************************
//函数名: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 ;
while(ch1[bb] != '\0')
{
index = (unsigned int)(ch1[bb] - 0x20);
index = (unsigned int)index*6;
for(ii=0;ii<6;ii++)
{
SetRamAddr(xx , yy);
if(yn == 0)
{
WriteLCD(DATA, ~FontSystem6x8[index]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -