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');
}
这个是第二行液晶显示的!
按键按下时出现的位置严重不符合位置!求大神们指点!
#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采集来的!
