?? lcd162a.h
字號:
/*
lcd162顯示庫文件
接線方式:
/////////////////////////////////////////
STM8-------1602
/////////////////////////////////////
c1-----RS
c2-----RW
c3-----EN
B0-B7-------D0-D7
VSS,BLA ---電源地
VDD,BLK-----電源正
VL---- 接AD(滑動電阻)
B0-B7-------Do-D7
////////////////////////////////////////////
//如果第三個引腳VL接地時,VDD不接電源正時,顯示效果較好!
//如果VDD接電源正極,VL接AD,調節電阻,使效果好
*/
#ifndef __LCD162A_H
#define __LCD162A_H
#define LCDCONT GPIOC
#define LCD162A_RS GPIO_PIN_1
#define LCD162A_RW GPIO_PIN_2
#define LCD162A_E GPIO_PIN_3
#define PortDATA GPIOB
//PB0~7,作為數據線
//lcd162a控制用函數
void lcd162a_Reset(void); //復位lcd162a
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);//在指定位置顯1個字符//x:1-2 //y:1-16
void lcd162a_cls(void); //清屏
void lcd162a_Init(void); //初始化lcd162a
void lcd162a_LocateXY(u8 posx,u8 posy); //顯示光標位置
void lcd162a_WriteCommand(u8 CMD);
void lcd162a_WriteData(u8 dataW);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr); //顯示字符串
u8 LCD_BUSY(void); // 進行忙檢測
//大約1ms 每增加1,增加大約1ms,最大值為0xFFFF
void delay_ms(u16 aa)
{
int j;
while(aa--)
{
j=150;
while(j--);
}
}
//大約 20um,每增加1,增加大約3um,最大值為255(0xFF)
//10----------48um
//100---------315um
void delay_us(u8 aa) {while(aa--);}
//清屏
////
void lcd162a_cls(void)
{
lcd162a_WriteCommand(0x01); //
}
//顯示光標位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{
u8 temp;
if(posx==1)
{
temp=0x80+posy-1;
}
else
{
temp=0xC0+posy-1;
}
lcd162a_WriteCommand(temp);
/*
u8 temp;
temp=posx & 0xf;
posy &= 0x01;
if(posy) temp |=0x40;
temp |=0x80;
lcd162a_WriteCommand(temp);
*/
}
//在指定位置顯示一個字符
//x:0~15
//y:0~1
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata)
{
lcd162a_LocateXY(x,y);
lcd162a_WriteData(Wdata);
}
//顯示字符串
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr)
{
u8 i,l=0;
while (ptr[l] >31)
{
l++;
};
for (i=0;i<l;i++)
{
lcd162a_DispOneChar(x,y++,ptr[i]);
if ( y == 16 )
{
y = 0;
x ^= 1;
}
}
}
//復位
////
void lcd162a_Reset(void)
{
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
delay_ms(5);
lcd162a_WriteCommand(0x38); //
delay_ms(5);
lcd162a_WriteCommand(0x38); //
lcd162a_WriteCommand(0x08); //
lcd162a_cls(); //clear device
lcd162a_WriteCommand(0x06); //
lcd162a_WriteCommand(0x0c); //
}
//寫入控制字。
//RS=0,
//RW=0
//E=1
//
void lcd162a_WriteCommand(u8 CMD)
{
// delay_ms(2); //等待控制器完成指令
LCD_BUSY();
GPIO_WriteLow(LCDCONT ,LCD162A_RS);
GPIO_WriteLow(LCDCONT ,LCD162A_RW);
GPIO_WriteHigh(LCDCONT ,LCD162A_E);
GPIO_Write(GPIOB,CMD);
delay_us(5);
GPIO_WriteLow(LCDCONT ,LCD162A_E);
}
//寫入一個字節。
//dataW:要寫入的數據/命令
//RS=1
//RW=0
//E=1
//
void lcd162a_WriteData(u8 dataW)
{
//delay_ms(2); //等待控制器完成指令
LCD_BUSY();
GPIO_WriteLow(LCDCONT ,LCD162A_RW);
GPIO_WriteHigh(LCDCONT ,LCD162A_RS);
GPIO_WriteHigh(LCDCONT ,LCD162A_E);
GPIO_Write(GPIOB,dataW);
delay_us(1);
GPIO_WriteLow(LCDCONT ,LCD162A_E);
}
u8 LCD_BUSY(void)
{
u8 temp=0xff;
GPIO_Init(PortDATA, (GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 |GPIO_PIN_7 |GPIO_PIN_0), GPIO_MODE_IN_PU_NO_IT );
GPIO_WriteLow(LCDCONT,LCD162A_RS);
GPIO_WriteHigh(LCDCONT,LCD162A_RW);
GPIO_WriteHigh(LCDCONT,LCD162A_E);
delay_ms(1); //最少需要650um
temp=GPIO_ReadInputData(PortDATA);
GPIO_WriteLow(LCDCONT,LCD162A_E);
GPIO_Init(PortDATA, (GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 |GPIO_PIN_7 |GPIO_PIN_0), GPIO_MODE_OUT_PP_LOW_FAST );
if(temp&0x80)
return ( 1);
else
return ( 0);
}
/*
//初始化lcd162a
void lcd162a_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
RCC->APB2ENR|=1<<4; //使能PORTC時鐘
//RCC->APB2ENR|=1<<0; //開啟輔助時鐘
//JTAG_Set(SWD_ENABLE);
GPIOA->CRL=0X33333333; //pa0-pa7
GPIOA->ODR|=0X00FF; //全部輸出高電平
//pc6-pc9
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH|=0X00000033;//
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;
lcd162a_Reset();
lcd162a_cls();
}
*/
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -