1602显示
时间:10-02
整理:3721RD
点击:
我的1602不知为啥一直自动加1,本来是220,但变成了331,我并没有设置自动加1 main函数
a =ADC_ConvertedValueLocal*100.000; /ad采集过来的数/ ge=a%10;
shi=a%100/10;
bai=a/100;
d[0]=bai+0x30; /这一步正确,显示2/
d[1]=shi+0x30; /这一步正确,显示2/
d[2]=ge+0x30; /这一步正确,显示0/
for(num=0;num<4;num++)
{
Lcd1602WriteData(d[num]);
DelayMs(100);
} 经过for循环,却在显示屏上显示331
求大神指点!
1602.c文件
#include "lcd1602.h"
#include "delay.h"
void LcdIo1602(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
}
void Lcd1602Write(u8 data)
{
u8 i = 0;
u8 operation = 0;
for(i = 0; i < 8; i++)
{
if((data>>i) & 0x01)
operation = 1;
else
operation = 0;
switch(i)
{
case 0:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_10);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_10);
break;
case 1:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_1);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_1);
break;
case 2:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_2);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_2);
break;
case 3:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_3);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_3);
break;
case 4:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_4);
break;
case 5:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_5);
break;
case 6:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_6);
break;
case 7:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_7);
break;
default:
break;
}
}
}
void Lcd1602WriteData(u8 date)
{
LCD1602_EN_HIGH;
LCD1602_RS_HIGH;
LCD1602_RW_LOW;
Lcd1602Write(date);
DelayMs(100);
LCD1602_EN_LOW;
}
void Lcd1602WriteCommand(u8 com)
{
LCD1602_EN_HIGH;
LCD1602_RS_LOW;
LCD1602_RW_LOW;
Lcd1602Write(com);
DelayMs(100);
LCD1602_EN_LOW;
}
void Lcd1602Init(void)
{ Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x01);
Lcd1602WriteCommand(0x0c);
Lcd1602WriteCommand(0x06);
Lcd1602WriteCommand(0x80);
}
a =ADC_ConvertedValueLocal*100.000; /ad采集过来的数/ ge=a%10;
shi=a%100/10;
bai=a/100;
d[0]=bai+0x30; /这一步正确,显示2/
d[1]=shi+0x30; /这一步正确,显示2/
d[2]=ge+0x30; /这一步正确,显示0/
for(num=0;num<4;num++)
{
Lcd1602WriteData(d[num]);
DelayMs(100);
} 经过for循环,却在显示屏上显示331
求大神指点!
1602.c文件
#include "lcd1602.h"
#include "delay.h"
void LcdIo1602(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
}
void Lcd1602Write(u8 data)
{
u8 i = 0;
u8 operation = 0;
for(i = 0; i < 8; i++)
{
if((data>>i) & 0x01)
operation = 1;
else
operation = 0;
switch(i)
{
case 0:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_10);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_10);
break;
case 1:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_1);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_1);
break;
case 2:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_2);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_2);
break;
case 3:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_3);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_3);
break;
case 4:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_4);
break;
case 5:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_5);
break;
case 6:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_6);
break;
case 7:
if(operation)
GPIO_SetBits(GPIOPORT, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOPORT, GPIO_Pin_7);
break;
default:
break;
}
}
}
void Lcd1602WriteData(u8 date)
{
LCD1602_EN_HIGH;
LCD1602_RS_HIGH;
LCD1602_RW_LOW;
Lcd1602Write(date);
DelayMs(100);
LCD1602_EN_LOW;
}
void Lcd1602WriteCommand(u8 com)
{
LCD1602_EN_HIGH;
LCD1602_RS_LOW;
LCD1602_RW_LOW;
Lcd1602Write(com);
DelayMs(100);
LCD1602_EN_LOW;
}
void Lcd1602Init(void)
{ Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x38);
Lcd1602WriteCommand(0x01);
Lcd1602WriteCommand(0x0c);
Lcd1602WriteCommand(0x06);
Lcd1602WriteCommand(0x80);
}
又是stm32吧。
d[0]=bai+0x30; /这一步正确,显示2/
d[1]=shi+0x30; /这一步正确,显示2/
d[2]=ge+0x30; /这一步正确,显示0/
这里正确,你咋知道呢?
如果前面显示正确,1602.c文件不会错。
for(num=0;num<4;num++)
{
Lcd1602WriteData(d[num]);
DelayMs(100);
} 经过for循环,却在显示屏上显示331
这里第四个就是d[3]是电压符号吗?
在debug中仿真显示d【0】 d[1] d[2] ,d[3]是个点(0x2e),仿真是对的,但液晶显示是错的显示它的下一位‘/’(0x2f),真是奇怪