📄 st7529.c
字号:
#include "DisConfig.h"
#include "st7529.h"
//OS_EVENT *St7529Mutex;
//uint8 err;
extern uint8 Dis_ScrBuf[84][20];
extern uint8 Dis_DatLineBuf[12][20];
uint8 Dis_HZK12Buf[24];
const uint8 Dis_DrvBuf[8][2]={ //显示查找表,用两个字节数据显示3个像素
{0xFF,0xFF},{0xFF,0xC0},{0xF8,0x1F},{0xF8,0x00},
{0x07,0xFF},{0x07,0xC0},{0x00,0x1F},{0x00,0x00}};
uint8 BackFlag; //反显标志,用于显示菜单项时反显所选项
void Dis_Drv2B3P(uint8 u8t) //送三个像素显示信息到显示模块,u8t底三位记录对应三个像素显示黑还是白
{
if(BackFlag) //需要反显,则查找方式改变
{WriteLcdData(Dis_DrvBuf[7-u8t][0]);WriteLcdData(Dis_DrvBuf[7-u8t][1]);}
else //不需要反显
{WriteLcdData(Dis_DrvBuf[u8t][0]);WriteLcdData(Dis_DrvBuf[u8t][1]);}
}
//************************************************************************
//LCD INTERFACE for SED1335 or compatable
//************************************************************************
#define ExtModeOff 0x30
#define ExtModeOn 0x31
#define DispOn 0xaf
#define DispOff 0xae
#define DispNor 0xa6
#define DispInv 0xa7
#define ComScan 0xbb
#define DispCtrl 0xca
#define SleepIn 0x95
#define SleepOut 0x94
#define LineAddSet 0x75
#define ColumnAddSet 0x15
#define DataScanDir 0xbc
#define MemWrite 0x5c
#define MemRead 0x5d
#define PartialIn 0xa8
#define PartialOut 0xa9
#define ReadModifyWriteOn 0xe0
#define ReadModifyWriteOff 0xee
#define AreaScrollSet 0xaa
#define ScrollStartAddSet 0xab
#define InternalOscOn 0xd1
#define InternalOscOff 0xd2
#define PowerCtrlSet 0x20
#define VolumnCtrl 0x81
#define IncVolumn 0xd6
#define DecVolumn 0xd7
#define ReadReg1 0x7c
#define ReadReg2 0x7d
#define NoOperation 0x25
#define ExitTestMode 0x25
//#define StatusRead
#define InitialCode 0x07
#define SetGray1 0x20
#define SetGray2 0x21
#define AnalogCircuitSet 0x32
#define SoftInit 0x34
#define EepromEn 0xcd
#define EepromDis 0xcc
#define EepromWrite 0xfc
#define EepromRead 0xfd
void Delay(int t)
{
while(t--);
}
/***********************LCM写数据***********************/
void write_bus(uint8 pdata)
{
uint32 tmp;
tmp=pdata<<20;
FIO1SET=RD;
//FIO1PIN=(FIO1PIN&~IO1)|tmp;
FIO1SET = tmp;
FIO1CLR = ((~tmp)&IO1);
Delay(100); //1~100或注释掉此语句
FIO1CLR=WR;
Delay(100); //1~100或注释掉此语句
FIO1SET=WR;
}
///////////////////LCD读数据/////////////////////////////
uint8 read_bus()
{
uint8 pdata;
uint32 tmp;
FIO1SET=WR;
IODIR1&=(~IO1);
FIO1CLR=RD;
OSTimeDly(1);
tmp = FIO1PIN & IO1;
FIO1SET=RD;
OSTimeDly(1);
IODIR1|=IO1;
pdata = tmp >> 20;
return pdata;
}
/**********************写命令*******************************/
void SetLcdReg(uint8 cdata) /* Command write routine */
{
//OS_ENTER_CRITICAL();
FIO1CLR=LCDCS0;
FIO1CLR=A0;
write_bus(cdata);
FIO1SET=A0;
FIO1SET=LCDCS0;
//OS_EXIT_CRITICAL();
}
/****************写入数据*************************************/
void WriteLcdData(uint8 pdata) /* Data write (1 byte) routine */
{
//OS_ENTER_CRITICAL();
FIO1CLR=LCDCS0;
FIO1SET=A0;
write_bus(pdata);
FIO1SET=LCDCS0;
//OS_EXIT_CRITICAL();
}
/*******************读取数据*********************************/
uint8 LCD_DataRead(void)
{
uint8 pdata;
FIO1CLR=LCDCS0;
FIO1SET=A0;
pdata=read_bus();
FIO1SET=LCDCS0;
return pdata;
}
/////////////////////LCD初始化//////////////////////////
void Lcd_Init(void)
{
SetLcdReg(ExtModeOff); // EXT=0
OSTimeDly(1);////////////////
SetLcdReg(SleepOut); // SLEEP OUT
SetLcdReg(InternalOscOn);// INTERNAL OSCILLATION ON
OSTimeDly(1);////////////////
SetLcdReg(PowerCtrlSet);// POWER CONTROL SET
WriteLcdData(0x08); // TURN ON BOOSTER first;
//Delay(100);
OSTimeDly(1);
SetLcdReg(PowerCtrlSet);// POWER CONTROL SET
WriteLcdData(0x0b); // TURN ON BOOSTER AND REFERENCE VOLTAGE GENERATION CIRCUIT ;0bh
OSTimeDly(1);////////////////
SetLcdReg(VolumnCtrl);// THREE COMMANDSET REFERENCE VOLTAGE SELECT MODE
WriteLcdData(0x0a);// REFERENCE VOLTAGE PARAMETER ;16
OSTimeDly(1);////////////////
WriteLcdData(0x05);// SET REFERENCE VOLTAGE PARAMETER ;04
OSTimeDly(1);////////////////
SetLcdReg(DispCtrl); // DISPLAY CONTROL
WriteLcdData(0x00);// CL DIVIDING RATIO ,F1 AND F2 DRIVE PATTERN
WriteLcdData(0x27);// DRIVER DUTY 1/160
WriteLcdData(0x00);// FR INVERSE-SET VALUE 16
OSTimeDly(1);////////////////
SetLcdReg(DispNor);// DISPLAY NORMAL
OSTimeDly(1);////////////////
SetLcdReg(ComScan); // C0M0-->COM79,C0M159-->COM81
WriteLcdData(0x02);
OSTimeDly(1);////////////////
SetLcdReg(DataScanDir); // data scan direction
//WriteLcdData(0x00); //inverse mode
//WriteLcdData(0x00); //p1p2p3p1p2p3...
//WriteLcdData(0x02); //3B3P
WriteLcdData(0x02); //inverse mode
WriteLcdData(0x01); //p3p2p1p3p2p1...
WriteLcdData(0x01); //2B3P WriteLcdData(0x02);
OSTimeDly(1);////////////////
SetLcdReg(LineAddSet); // line address set
WriteLcdData(0x00);
WriteLcdData(0x9F);
OSTimeDly(1);////////////////
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x00);// START COLUMN
WriteLcdData(0x35);// ENDCOLUMN
OSTimeDly(1);////////////////
SetLcdReg(ExtModeOn); // EXT=1
OSTimeDly(1);////////////////
//====================================================
SetLcdReg(SetGray1);// SET GRAY VALUE
WriteLcdData(0X00);// START PARA00
WriteLcdData(0X03);// START PARA03
WriteLcdData(0X06);// START PARA06
WriteLcdData(0X09);// START PARA09
WriteLcdData(0X0B);// START PARA
WriteLcdData(0X0D);// START PARA
WriteLcdData(0X0E);// START PARA
WriteLcdData(0X0F);// START PARA
WriteLcdData(0X10);// START PARA
WriteLcdData(0X11);// START PARA
WriteLcdData(0X12);// START PARA
WriteLcdData(0X14);// START PARA
WriteLcdData(0X16);// START PARA
WriteLcdData(0X18);// START PARA
WriteLcdData(0X1B);// START PARA
WriteLcdData(0X1F);// START PARA
OSTimeDly(1);////////////////
SetLcdReg(SetGray2);// SET GRAY VALUE
WriteLcdData(0X00);// START PARA00
WriteLcdData(0X03);// START PARA03
WriteLcdData(0X06);// START PARA06
WriteLcdData(0X09);// START PARA09
WriteLcdData(0X0B);// START PARA
WriteLcdData(0X0D);// START PARA
WriteLcdData(0X0E);// START PARA
WriteLcdData(0X0F);// START PARA
WriteLcdData(0X10);// START PARA
WriteLcdData(0X11);// START PARA
WriteLcdData(0X12);// START PARA
WriteLcdData(0X14);// START PARA
WriteLcdData(0X16);// START PARA
WriteLcdData(0X18);// START PARA
WriteLcdData(0X1B);// START PARA
WriteLcdData(0X1F);// START PARA
OSTimeDly(1);////////////////
SetLcdReg(AnalogCircuitSet);// ANALOG CIRCUIT SET
WriteLcdData(0x00);// OSC FREQUENCEY ADJUSTMENT
WriteLcdData(0x01);// BOOSTER EFFICIENCY SET
WriteLcdData(0x00);// BIAS SETTING 1/14
OSTimeDly(1);////////////////
SetLcdReg(SoftInit);// DITHERER OFF
OSTimeDly(1);////////////////
SetLcdReg(ExtModeOff); // EXT=0
OSTimeDly(1);////////////////
SetLcdReg(DispOn); // display on;
}
/***********************接口函数***************************/
void DrowLine(uint8 y) //画线,y表示线的纵坐标
{
int32 i;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+1);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<54;i++)
{ Dis_Drv2B3P(7);}
}
void Clear6(uint8 x,uint8 y) //清除(x,y)处开始的6*12的区域
{
uint16 j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+11);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+1);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<24;++j)
{
Dis_Drv2B3P(0);
}
}
void Clear(uint8 x,uint8 y,const uint8 *pic) //清除(x,y)处开始的6*12的区域,该函数用于显示状态栏
{
uint16 j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+11);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+3);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<48;++j)
{
Dis_Drv2B3P(0);
}
}
void Clear12(uint8 x,uint8 y) //清除(x,y)处开始的12*12的区域
{
uint16 j;
SetLcdReg(LineAddSet); // line address set
WriteLcdData(y);
WriteLcdData(y+11);
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(32+x/3);// START COLUMN
WriteLcdData(32+x/3+3);// ENDCOLUMN
SetLcdReg(MemWrite);//DATA WRITE
for(j=0;j<48;++j)
{
Dis_Drv2B3P(0);
}
}
void ScreenClear2() //清除整个屏幕,并画两条线
{
int32 i,j;
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
SetLcdReg(LineAddSet); // line address set
WriteLcdData(0);
WriteLcdData(159);
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<160;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
DrowLine(TITLEHIGH-5);
DrowLine(160-BOOMHIGH);
}
void ScreenClear() //清除状态拦以外的部分(除显示文字的12像素区域),并画屏幕上的两条线,
{
int32 i,j,h,k;
SetLcdReg(ColumnAddSet);// THIRDCOMMAND SET COLUMN ADDRESS
WriteLcdData(0x1f);// START COLUMN
WriteLcdData(0x54);// ENDCOLUMN
SetLcdReg(LineAddSet); // line address set
WriteLcdData(TITLEHIGH-5);
WriteLcdData(TITLEHIGH);
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<6;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
h=LINEHIGH-11;
for(k=0;k<MAXLINE-1;k++)
{
SetLcdReg(LineAddSet); // line address set
WriteLcdData(TITLEHIGH+k*LINEHIGH+12);
WriteLcdData(TITLEHIGH+(k+1)*LINEHIGH);
SetLcdReg(MemWrite);//DATA WRITE
for(i=0;i<h;i++)
{
for(j=0;j<54;j++) Dis_Drv2B3P(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -