📄 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 + -