📄 lcd.c
字号:
BCSCTL1 |= RSEL0+RSEL1+RSEL2; // 选择最高不标称频率
DCOCTL = 0xE0; //DCOCLK频率最高,不利用MOD进行调整
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for(i=0xFF;i>0;i--); // Time for flag to set
}
while((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
_NOP();
BCSCTL2 |= SELS+DIVS_2; //SMCLK SOURCE XT2/4=460.8KHz
}
void LcdDelay(U32 u32Duration)
{
U32 u32Delay;
for (u32Delay=0; u32Delay<u32Duration; u32Delay++);
}
void LcdInstructionWrite_L (U8 u8Instruction)
{
LCD_CSCTL |=LCD_CS1; //CS1=1 /* wait until LCD not busy */
LCD_CTL &= ~LCD_DI; /* Instruction mode */
LCD_CTL |=LCD_RW; /* Write mode */
do
{
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= 0xff;
LCD_CTL |= LCD_E; /* Strobe */
LCD_DATA_DIR=0x00;
Busy=LCD_DATA_IN;
LCD_CTL &= ~LCD_E; //LCD_DATA_IN& 0x7F == LCD_BUSY
}while(Busy&0x80==LCD_BUSY);
LCD_CTL &= ~LCD_RW; /* Write mode */
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= u8Instruction; /* outbyte */
LCD_CTL |= LCD_E;
LcdDelay(1);
_NOP();
LCD_CTL &= ~LCD_E;
LCD_CSCTL &= ~LCD_CS1;
LCD_CSCTL &= ~ LCD_CS2;
}
void LcdInstructionWrite_R (U8 u8Instruction)
{
LCD_CSCTL |=LCD_CS2; //CS1=1
LCD_CTL |=LCD_RW; /* Write mode */
LCD_CTL &= ~LCD_DI; /* Instruction mode */
do
{
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= 0xff;
LCD_CTL |= LCD_E; /* Strobe */
LCD_DATA_DIR=0x00;
Busy=LCD_DATA_IN;
LCD_CTL &= ~LCD_E;
}while(Busy&0x80==LCD_BUSY);
LCD_CTL &= ~LCD_RW; /* Write mode */
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= u8Instruction; /* outbyte */
LCD_CTL |= LCD_E;
LcdDelay(1);
_NOP();
LCD_CTL &= ~LCD_E;
LCD_CSCTL &= ~LCD_CS1;
LCD_CSCTL &= ~ LCD_CS2;
}
void LcdDataWrite_L (U8 u8Data)
{
LCD_CSCTL |=LCD_CS1; //CS1=1 /* wait until LCD not busy */
LCD_CTL &= ~LCD_DI; /* Instruction mode */
LCD_CTL |=LCD_RW; /* Write mode */
do
{
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= 0xff;
LCD_CTL |= LCD_E; /* Strobe */
LCD_DATA_DIR=0x00;
Busy=LCD_DATA_IN;
LCD_CTL &= ~LCD_E;
}while(Busy&0x80==LCD_BUSY);
LCD_CTL |=LCD_DI; /* Instruction mode */
LCD_CTL &= ~LCD_RW; /* write mode */
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= u8Data; /* outbyte */
LCD_CTL |= LCD_E;
LcdDelay(1);
_NOP();
LCD_CTL &= ~LCD_E;
LCD_CSCTL &= ~LCD_CS1;
LCD_CSCTL &= ~ LCD_CS2;
}
void LcdDataWrite_R (U8 u8Data)
{
LCD_CSCTL |=LCD_CS2; //CS1=2 /* wait until LCD not busy */
LCD_CTL &= ~LCD_DI; /* Instruction mode */
LCD_CTL |=LCD_RW; /* Read mode */
do
{
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= 0xff;
LCD_CTL |= LCD_E; /* Strobe */
LCD_DATA_DIR=0x00;
Busy=LCD_DATA_IN;
LCD_CTL &= ~LCD_E;
}while(Busy&0x80==LCD_BUSY);
LCD_CTL |=LCD_DI; /* Data mode */
LCD_CTL &= ~LCD_RW; /* write mode */
LCD_DATA_DIR=0xff;
LCD_DATA_OUT= u8Data; /* outbyte */
LCD_CTL |= LCD_E;
LcdDelay(1);
_NOP();
LCD_CTL &= ~LCD_E;
LCD_CSCTL &= ~LCD_CS1;
LCD_CSCTL &= ~ LCD_CS2;
}
void GLCD_ClearScreen (void)
{
U8 u8Page=0; //set page
U8 u8Column=0; //set colunm
/* process the 8 pages of the LCD Left*/
for (u8Page = 0; u8Page < 8; u8Page++)
{
LcdInstructionWrite_L(X_ADRESS | u8Page); /* Set the page number */
LcdInstructionWrite_L(Y_ADRESS); /* Set column to 0 */
/* process a page on both sides */
for (u8Column = 0; u8Column < 64; u8Column++) LcdDataWrite_L (0x00);
}
/* process the 8 pages of the LCD Right*/
for (u8Page = 0; u8Page < 8; u8Page++)
{
LcdInstructionWrite_R(X_ADRESS | u8Page); /* Set the page number */
LcdInstructionWrite_R(Y_ADRESS); /* Set column to 0 */
/* process a page on both sides */
for (u8Column = 0; u8Column < 64; u8Column++) LcdDataWrite_R (0x00);
}
}
void GLCD_LcdInit(void)
{
//LCD_DATA_OUT= 0xff;
//"片选
LCD_CSCTL &= ~LCD_CS1;
LCD_CSCTL &= ~ LCD_CS2;
LcdDelay(1000);
LcdInstructionWrite_L(DISPLAY_OFF);
LcdInstructionWrite_R(DISPLAY_OFF);
LcdInstructionWrite_L(START_LINE);
LcdInstructionWrite_R(START_LINE);
GLCD_ClearScreen ();
LcdInstructionWrite_L(DISPLAY_ON);
LcdInstructionWrite_R(DISPLAY_ON);
}
void GLCD_Write_Byte (U8 u8Byte)
{
if(Column<64)
{
LcdInstructionWrite_L(X_ADRESS | Page);
LcdInstructionWrite_L(Y_ADRESS | Column);
LcdDataWrite_L (u8Byte);
}
else if(Column<128)
{
LcdInstructionWrite_R(X_ADRESS | Page);
LcdInstructionWrite_R(Y_ADRESS | (Column-64));
LcdDataWrite_R (u8Byte);
}
}
void GLCD_Write_HZ(void)
{
U8 i,j;
U8 ColumnBuff;
ColumnBuff=Column;
//GLCD_LcdInit();
/*for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
//GLCD_Write_Byte (SungBold[8*i+32][j]);
Column++;
//if(Column==128) Column=0;
}
//page++;
}*/
for(i=0;i<3;i++)
{
for(j=0;j<126;j++)
{
GLCD_Write_Byte (Hanzi[j][i]) ;
Column++;
}
Page++;
Column=ColumnBuff;
}
}
void Wt_16_8()
{
uchar const *p=SungBold+80;
//"上半字
Page=2;
Column=0;
for(U8 i=0;i<8;i++)
{
GLCD_Write_Byte(*p++);
Column++;
}
//下半字
Page=3;
Column=0;
for(U8 i=0;i<8;i++)
{
GLCD_Write_Byte(*p++);
Column++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -