微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602显示

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);         
}

又是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),真是奇怪

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top