LCD1602驱动显示实验STM32
/*********************************************************************
*名 称:LCD_Writedata()
*功 能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(uchar dat)
{
while(LCD_busy());//等待LCD1602空闲
LCD_RS_1;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
DATAOUT = dat;
LCD_EN_1; //先拉高
delay_nus(300); //很重要的延时,经调试,延时300us以上才可以
LCD_EN_0; //下降沿,开始写入有效数据
}
/*********************************************************************
*名 称:LCD_pos()
*功 能:设定显示位置
*入口参数:pos:显示位置,值的范围如下:
* 0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)
* 0x40----------------0x4f 0x50-------0x67 第二行
*出口参数:无
*********************************************************************/
void LCD_pos(uchar pos)
{
LCD_Writecmd(pos | 0x80);
}
/*********************************************************************
*名 称:LCD_Setpos()
*功 能:根据习惯设定显示位置
*入口参数:row:行,row=1表示第一行,row=2表示第二行
* col:列,0~15,用于指定显示的列,范围可以是0~40
*出口参数:无
*********************************************************************/
void LCD_Setpos(uchar row,uchar col)
{
if(row==1) LCD_Writecmd(col | 0x80);
else LCD_Writecmd(col | 0xC0);
}
/*********************************************************************
*功 能:显示一个字符
*入 口:ch:待显示的字符
*********************************************************************/
void LCD_DispChar(char ch)
{
LCD_Writedata(ch);
}
/*********************************************************************
*功 能:在指定位置显示一个字符
*入 口:row:行 1或2 col:列,0~15
* ch:待显示的字符
*********************************************************************/
void LCD_Setpos_DispChar(uchar row,uchar col,char ch)
{
LCD_Setpos(row,col);
LCD_Writedata(ch);
}
/*********************************************************************
*名 称:LCD_DispString()
*功 能:使LCD1602显示一个字符串,显示位置需提前设定
*入口参数:str[]:待显示的字符串
*出口参数:无
*********************************************************************/
void LCD_DispString(char str[])
{
uchar i=0;
while(str[i] != )
{
LCD_Writedata(str[i]);
++i;
}
}
/*********************************************************************
*名 称:LCD_Setpos_DispString()
*功 能:使LCD1602从指定位置开始显示一个字符串
*入口参数:row:显示行,1或2
* col:显示列,0~15 (0~40)
* str[]:待显示的字符串
*出口参数:无
*说 明:指定位置是显示的初始位置,第一个字符显示的位置
*********************************************************************/
void LCD_Setpos_DispString(uchar row,uchar col,char str[])
{
LCD_Setpos(row,col);
LCD_DispString(str);
}
/*********************************************************************
*名 称:LCD_Dispnum()
*功 能:显示一个不超过8位的整数,显示位置需提前设置
*入口参数:num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_Dispnum(uint32_t num)
{
uint i=0,j,k=0,wei,q;
char str[9];
if(num>=10000000)wei=8;
else if(num>=1000000)wei=7;
else if(num>=100000)wei=6;
else if(num>=10000)wei=5;
else if(num>=1000) wei=4;
else if(num>=100)wei=3;
else if(num>=10) wei=2;
else wei=1;
for(i=wei;i>0;i--)
{ q=1;
j=1; //i=1时,q=1,得到个位
for(;j str[k++]=num/q +0;
num %= q;
}
str[k] = ; //添加字符串结束标志
LCD_DispString(str);//显示字符串
}
/*********************************************************************
*名 称:LCD_Setpos_Dispnum()
*功 能:在指定位置显示一个不超过8位的整数
*入口参数:num:待显示的整数,不超过8位
*出口参数:无
*********************************************************************/
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num)
{
LCD_Setpos(row,col);
LCD_Dispnum(num);
}
/*********************************************************************
*名 称:LCD_DispDecimal()
*功 能:显示一个有效位不超过8位的浮点数,显示位置需要提前设定
*入口参数:num:待显示的浮点数放大后得到的整数,不超过8位
* dot:小数点的位数
*出口参数:无
*********************************************************************/
void LCD_DispDecimal(uint32_t num,uchar dot)
{
uint i=0,j,k=0,wei,q;
char str[10];
if(num>=10000000)wei=8;
else if(num>=1000000)wei=7;
else if(num>=100000)wei=6;
else if(num>=10000)wei=5;
else if(num>=1000) wei=4;
else if(num>=100)wei=3;
else if(num>=10) wei=2;
else wei=1;
for(i=wei;i>0;i--)
{ q=1;
j=1; //i=1时,q=1,得到个位
for(;j str[k++]=num/q +0;
num %= q;
}
str[k] = ; //添加字符串结束标志
for(i=8;i>0;i--)
{ if((str[i]>=0)&&(str[i]<=9)) break;
}
str[i+2]= ; //添加字符串结束符
for(j=0;j {
str[i+1]=str[i];
}
str[i+1]=.; //插入小数点
LCD_DispString(str);//显示浮点小数
}
评论