?? lcd.c
字號:
#include "Lcd.h"
#include "Flash.h"
#include "Timer.h"
#ifdef _USE_LCD
const char HexTbl[16] ={
'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'
};
uchar BackLight_Cnt = 0;
void Lcd_LightOn()
{
BackLight_Cnt = 0;
LCD_BKLIGHT_ON;
Start_TimerB();
}
/*************************************************************
LCD讀寫操作
*************************************************************/
void lcd_write_ctl(uchar txdata)
{
LCD_RD_DIS;
_NOP();
LCD_A0_CTL; //寫控制字
_NOP();
LCD_CS_EN; //片選使能
_NOP();
LCD_WR_EN; //寫使能
_NOP();
P4OUT = txdata; //送數(shù)據(jù)
_NOP();
LCD_WR_DIS; //寫無效
_NOP();
LCD_CS_DIS; //片選無效
_NOP();
LCD_A0_DATA;
}
void lcd_write_data(uchar txdata)
{
LCD_RD_DIS;
_NOP();
LCD_A0_DATA; //寫數(shù)據(jù)
_NOP();
LCD_CS_EN; //片選使能
_NOP();
LCD_WR_EN; //寫使能
_NOP();
P4OUT = txdata; //送數(shù)據(jù)
_NOP();
LCD_WR_DIS; //寫無效
_NOP();
LCD_CS_DIS; //片選無效
_NOP();
LCD_A0_CTL;
}
//字符為 16 x8, 顯示在row 和 row+1行
void Lcd_Char(uchar row, uchar col, uchar code)
{
uchar i;
ulong addr = ASCII_OFFSET + (((int)code)<<4);
lcd_write_ctl(0x10+(col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb1+row);
for(i=0;i<8;i++)
{
lcd_write_data(Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0x10+(col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb1+row);
for(i=0;i<8;i++)
{
lcd_write_data(Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0xAf); //display on(顯示開關(guān)的控制)
}
void Lcd_Hz(uchar row, uchar col, uint code)
{
uchar i;
ulong addr = ( (code>>8)-0xA1 )*94 + ( (code&0xFF)-0xA1 );
addr = HANZI_OFFSET + (addr<<5);
lcd_write_ctl(0x10 + (col>>4) ); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb0 + row);
for(i=0;i<16;i++)
{
lcd_write_data(Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0x10 + (col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb1 + row);
for(i=0;i<16;i++)
{
lcd_write_data(Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0xAf); //display on
}
void Lcd_Show(uchar row, uchar col, uchar *str)
{
uchar rw=row,cl=col;
uchar *pStr=str;
while (*pStr)
{
if ((*pStr)&0x80)
{
if (cl>112) {rw+=2;cl=0;}//換行
if (rw>6) break;
//漢字
Lcd_Hz(rw,cl,((*pStr)<<8) + ((*(pStr+1))&0xFF) );
pStr+=2;
cl += 16;
}else{
if (cl>120) {rw+=2;cl=0;}//換行
if (rw>6) break;
Lcd_Char(rw,cl, *pStr);
++pStr;
cl += 8;
}
}
}
//字符為 16 x8, 顯示在row 和 row+1行
void Lcd_CharN(uchar row, uchar col, uchar code)
{
uchar i;
ulong addr = ASCII_OFFSET + (((int)code)<<4);
lcd_write_ctl(0x10+(col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb0+row);
for(i=0;i<8;i++)
{
lcd_write_data(~Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0x10+(col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb1+row);
for(i=0;i<8;i++)
{
lcd_write_data(~Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0xAf); //display on
}
void Lcd_HzN(uchar row, uchar col, uint code)
{
uchar i;
ulong addr = ( (code>>8)-0xA1 )*94 + ( (code&0xFF)-0xA1 );
addr = HANZI_OFFSET + (addr<<5);
lcd_write_ctl(0x10 + (col>>4) ); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb0 + row);
for(i=0;i<16;i++)
{
lcd_write_data(~Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0x10 + (col>>4)); //配置高4字節(jié)
lcd_write_ctl(col & 0x0f); //配置低4字節(jié)
lcd_write_ctl(0xb1 + row);
for(i=0;i<16;i++)
{
lcd_write_data(~Spi_Read(addr++)); //寫數(shù)據(jù)
}
lcd_write_ctl(0xAf); //display on
}
void Lcd_ShowN(uchar row, uchar col, uchar *str)
{
uchar rw=row,cl=col;
uchar *pStr=str;
while (*pStr)
{
if ((*pStr)&0x80)
{
if (cl>112) {rw+=2;cl=0;}//換行
if (rw>6) break;
//漢字
Lcd_HzN(rw,cl,((*pStr)<<8) + ((*(pStr+1))&0xFF) );
pStr+=2;
cl += 16;
}else{
if (cl>120) {rw+=2;cl=0;}//換行
if (rw>6) break;
Lcd_CharN(rw,cl, *pStr);
++pStr;
cl += 8;
}
}
}
//初始化LCD
void Init_LCD(void)
{
P4DIR = 0XFF; // LCD 輸出
P5DIR |= 0X3F; // P5.4 背光
// P5.5 復(fù)位
P5OUT |= BIT5; //結(jié)束復(fù)位
lcd_write_ctl(0xa3); //lcd bias set (1/7)
lcd_write_ctl(0xa0); //ADC normal
lcd_write_ctl(0xc8); //output scan normal direction(COM正向顯示)
//lcd_write_ctl(0x2c); //VC ON
//lcd_write_ctl(0x2e); //VR ON
lcd_write_ctl(0X2f); //VF ON
lcd_write_ctl(0xa6); //Display normal
lcd_write_ctl(0xf8); //Booster ratio set
lcd_write_ctl(0); //2x 3x 4x
Delay(5);
lcd_write_ctl(0x81);
Delay(5);
lcd_write_ctl(0x05); //對比度調(diào)整
Delay(5);
lcd_write_ctl(0x26); //設(shè)置電阻分壓
Delay(5);
lcd_write_ctl(0xaf); //display on
lcd_write_ctl(0x40); //first line = COM1
Delay(5);
}
void Lcd_Clear(uchar pattern)
{
uint i,j;
uchar tempdata=0xb0;
for(j=0;j<8;j++)
{
lcd_write_ctl(0x10);
lcd_write_ctl(0); //設(shè)置為第一列
lcd_write_ctl(tempdata++); //第一列
for(i=0;i<128;i++)
{
lcd_write_data(pattern);
}
}
}
void Lcd_ClearRow(uchar row ,uchar pattern)
{
uint i;
lcd_write_ctl(0x10);
lcd_write_ctl(0); //設(shè)置為第一列
lcd_write_ctl(0xB0 + row); //指定行
for(i=0;i<128;i++)
{
lcd_write_data(pattern);
}
}
void Lcd_Hex(uchar row, uchar col, uchar val)
{
Lcd_Char(row,col, HexTbl[(val>>4)&0xF] );
Lcd_Char(row,col+8, HexTbl[val&0xF] );
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -