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

1602液晶显示问题!

时间:10-02 整理:3721RD 点击:
具体问题就是我在液晶显示中想要加一个按键数值!就是按键一模式选择 按下后可以用按键二,三。来改变数值。在单独的程序完全可用!但是和我的主程序合在一起的时候程序被后半部程序所干扰!具体程序如下!#include <reg52.h>
#include <intrins.h>
#include <delay.h>
#include <bujin.h>
sbit sda=P2^3;
sbit scl=P2^4;  //乾三连 坤六断 震仰盂 艮覆碗  离中虚 坎中满 兑上缺 巽下断;
/************数值改变 按键*************/
sbit Key0=P1^4;
sbit Key1=P1^5;
sbit Key2=P1^6;


unsigned char code table[]="          00    ";  
unsigned char code table1[]={'0','1','2','3','4','5','6','7','8','9'};

signed char miao;
void write_dat(unsigned char dat)
{
lcdrs=1;                                       
lcdrw=0;
P0=dat;                                                               
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
void write_cmd(unsigned char cmd)
{
lcdrs=0;
lcdrw=0;
P0=cmd;  
delay_ms(1);  
lcden=1;  
delay_ms(1);  
lcden=0;
}

void lcd_init()
{
unsigned char num;
lcden=0;
write_cmd(0x38);             //液晶初始化
write_cmd(0x08);
write_cmd(0x0c);  
write_cmd(0x06);  
write_cmd(0x01);
// write_cmd(0x38);
// delay_ms(5);
// write_cmd(0x38);
// delay_ms(5);
// write_cmd(0x38);
// write_cmd(0x38);
// write_cmd(0x08);
// write_cmd(0x01);
// write_cmd(0x06);
// write_cmd(0x0c);
// write_cmd(0x80);
for(num=0;num<16;num++)
{
  write_dat(table[num]);
  delay_ms(10);
}
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;       
}
/******************按键检测******************/
void write_sfm(unsigned char add,unsigned char date)
{
unsigned char shi,ge;
shi=date/10;       
ge=date%10;
write_cmd(0x80+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}

void keyscansj()
{
unsigned char j;
if(Key0==0)      //按键一进入选择模式
{
  delay_ms(3);
  if(Key0==0)
  {       
   j++;
   while(!Key0);
   if(j==1)
   {
    TR0=0;
    write_cmd(0x80+11);       
    write_cmd(0x0f);
   }
   if(j==2)                                          //按两次 确认当前数值并退出
   {
    j=0;
        write_cmd(0x0c);
        TR0=1;
   }
  }
}
if(j!=0)
{
if(Key1==0)
  {  
   delay_ms(3);
   if(Key1==0)
   {
        while(!Key1);
        if(j==1)
        {
         miao++;
         {
          if(miao==100)
          {
           miao=0;
      }
          write_sfm(10,miao);
          write_cmd(0x80+11);
     }
    }
   }
  }
  if(Key2==0)
  {
   delay_ms(3);
   if(Key2==0)
   {
        while(!Key2);
        if(j==1)
        {
         miao--;
         if(miao==-1)
         {
          miao=99;
         }
         write_sfm(10,miao);
         write_cmd(0x80+11);
    }
   }
  }
}
}

这是第一行我所想要显示的!



void lcd_disp(long numdis)
{  
unsigned char wan,qian,bai,shi,ge;
                                  
long kk;
write_cmd(0x80+0x40);
write_dat(table1[numdis/100]);
write_dat(table1[numdis%100/10]);
write_dat(table1[numdis%10]);   
write_cmd(0x80+0x40+6);
kk=numdis*360*100/256;
wan=kk/10000;
qian=kk%10000/1000;
bai=kk%10000%1000/100;
shi=kk%10000%1000%100/10;
ge=kk%10000%1000%100%10;
write_dat(0x30+wan);
write_dat(0x30+qian);
write_dat(0x30+bai);
write_dat(0x2e);
write_dat(0x30+ge);
write_dat(0x30+shi);
write_dat(0x30+'V');
}
这个是第二行液晶显示的!
按键按下时出现的位置严重不符合位置!求大神们指点!

你的后半部 在哪调用的?

后半部调用的数据是我用PCF8591 通过I2C采集来的!

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

网站地图

Top