野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12124|回复: 3

1602显示屏

[复制链接]
发表于 2015-4-18 20:46:40 | 显示全部楼层 |阅读模式
本帖最后由 dyg 于 2015-4-18 21:09 编辑

    1602写进去的数自动加1,本来我要现实220,但是显示出来的是331,哪位大神遇到过这种问题?
          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);         
}


回复

使用道具 举报

发表于 2015-4-20 09:22:45 | 显示全部楼层
num是要设置成num<3吧?为什么要<4?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-20 13:56:07 | 显示全部楼层
1602写数据时位的移动,谢谢,问题已经解决了
回复 支持 反对

使用道具 举报

发表于 2017-1-1 19:16:11 | 显示全部楼层
dyg 发表于 2015-4-20 13:56
1602写数据时位的移动,谢谢,问题已经解决了

我想的写数据也是用这个方法,哪里有错呀?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 19:10 , Processed in 0.027924 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表