[问答] 12864就会一直闪不停,是怎么回事呢?

[复制链接]
技术员
发表于 2017-6-12 19:09:46   734 查看 10 回复 只看该作者 倒序浏览
分享
在下愚笨,实在找不出哪里有问题,但是显示就是不正常,编译无错误无警告。另外,想请教一下,在下的中断有问题吗,为什么开了中断就会出现问题呢。还有,绿色标注的部分如果放进大循环里,12864就会一直闪不停啊,这也不是在下想要的结果啊。因程序稍长,但程序很简单,希望您花几分钟看一下,重点部分红色标注,其余都是一些简单的驱动,下面程序的加热功能区也不需要看。

简单说明一下,在下想要实现的功能。在下打算是用一个部分矩阵键盘和12864在模拟显示个简单太阳能控制器。按键不同,来实现不同的功能选择。用杜邦线引脚的原因是,想来模拟一下水位过低的情况,触发自动上水功能,用中断来模拟上水,每5s,增长一个百分点。大体情况就是这样,如有疑问,随时传唤在下。

代码不美且较长,望您能指点迷津,感激不尽!



#include<reg52.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define N 12
sbit col1=P1^7;   //列端口定义
sbit col2=P1^6;
sbit col3=P2^0;
sbit col4=P2^1;
sbit LCD_EN=P3^4;
sbit LCD_RS=P3^5;
sbit LCD_RW=P3^6;
sbit LCD_PSB=P3^7;
sbit _Speak=P3^2 ; //讯响器控制脚
sbit Low=P3^0; //模拟最低水位触发脚
uchar code dis0[]={"****智能控制****"};
uchar code dis1[]={"当前功能显示区"};
uchar code dis2[]={"当前水温: "};
uchar code dis3[]={"当前水位比: 60"};
uchar code dis4[]={"按S19 开始上水"};
uchar code dis5[]={"目标水位比: "};
uchar code dis6[]={"按 S7 停止上水"};
uchar code dis7[]={"上水中..."};
uchar code dis8[]={"按S20 开始加热"};
uchar code dis9[]={"目标水温:"};
uchar code dis10[]={"按 S8 停止加热"};
uchar code dis11[]={"加热中..."};
uchar code dis12[]={"目标水位比: 00"};
uchar code dis13[]={"当前水位比: "};
void delay1ms(uint);
void delay(uchar);                                          
void keyscan();
void write_cmd(uchar cmd);
void write_dat(uchar dat);
void lcd_pos(uchar X,uchar Y);
void write_sfm1(uchar add,uchar date);
void write_sfm2(uchar add,uchar date);
void lcd_init();
bit lcd_busy();
char filter();
uint num=0,i=0;
uint counter=0,a=0,counter1=0,b=0;
uint water0=0,water1=0,temp=0;
uint m=0;
uint LOW=0;
void main()//固定界面显示
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256; //50ms定时   
        ET0=1;
        EA=1;

        lcd_busy();
        delay1ms(10);
        lcd_init();

        lcd_pos(0,0);//智能控制
        i=0;
        while(dis0!='\0')
        {
                write_dat(dis0);
                i++;
        }


        lcd_pos(1,0);//当前水温
        i=0;
        while(dis2!='\0')
        {
                write_dat(dis2);
                i++;
        }


        lcd_pos(2,0);//当前水位比
        i=0;
        while(dis3!='\0')
        {
                write_dat(dis3);
                i++;
        }


        lcd_pos(3,0);//当前功能显示区
        i=0;
        while(dis1!='\0')
        {
                write_dat(dis1);
                i++;
        }

        delay1ms(10);
        while(1)
        {
                /*if(Low==1)
                {
                        LOW=1;
                }
                else if(Low==0)
                {
                        LOW=0;
                }
                else
                {
                        LOW=2;
                }*/
        
                if(Low==0)//触发模拟自动上水
                {
                        TR0=1;//开中断
                        write_cmd(0x01);
                        delay1ms(5);
               
                        delay(20);
                        lcd_pos(0,0);
                        i=0;
                        while(dis0!='\0')
                        {
                                write_dat(dis0);
                                i++;
                        }
               
                        delay(20);
                        lcd_pos(1,0);
                        i=0;
                        while(dis6!='\0')
                        {
                                write_dat(dis6);
                                i++;
                        }
                        
                        delay(20);
                        lcd_pos(2,0);
                        i=0;
                        while(dis13!='\0')
                        {
                                write_dat(dis13);
                                i++;
                        }                                          
                        if(water1<=water0)//判断是否上水完毕
                        {                        
                                lcd_pos(2,6);
                                write_sfm1(6,water1);                                                         
                                write_cmd(0x90);
                                m=0xfe;
                                P1=m;
                                delay1ms(500); //延时
                                m=_crol_(m,1);
                        }
                        else if(water1>water0)
                        {
                                TR0=0;//关中断
                                write_cmd(0x01);
                                delay1ms(5);
               
                                delay(20);
                                lcd_pos(0,0);
                                i=0;
                                while(dis0!='\0')
                                {
                                        write_dat(dis0);
                                        i++;
                                }
               
                                delay(20);
                                lcd_pos(1,0);
                                i=0;
                                while(dis4!='\0')
                                {
                                        write_dat(dis4);
                                        i++;
                                }
               
                                delay(20);
                                lcd_pos(2,0);
                                i=0;
                                while(dis13!='\0')
                                {
                                        write_dat(dis13);
                                        i++;
                                }                                          
                                lcd_pos(2,6);
                                write_sfm1(6,water0);                                                         
                                write_cmd(0x90);                        
               
                                delay(20);
                                lcd_pos(3,0);
                                i=0;
                                while(dis1!='\0')
                                {
                                        write_dat(dis1);
                                        i++;
                                }
                        }
               
                        delay(20);
                        lcd_pos(3,0);
                        i=0;
                        while(dis7!='\0')
                        {
                                write_dat(dis7);
                                i++;
                        }
                }
                else if(Low==1)//未触发
                {
                        write_cmd(0x01);
                        delay1ms(5);
               
                        delay(20);
                        lcd_pos(0,0);
                        i=0;
                        while(dis0!='\0')
                        {
                                write_dat(dis0);
                                i++;
                        }
               
                        delay(20);
                        lcd_pos(1,0);
                        i=0;
                        while(dis2!='\0')
                        {
                                write_dat(dis2);
                                i++;
                        }
               
                        delay(20);
                        lcd_pos(2,0);
                        i=0;
                        while(dis13!='\0')
                        {
                                write_dat(dis13);
                                i++;
                        }                                          
                        lcd_pos(2,6);
                        write_sfm1(6,water0);                                                         
                        write_cmd(0x90);
               
                        delay(20);
                        lcd_pos(3,0);
                        i=0;
                        while(dis1!='\0')
                        {
                                write_dat(dis1);
                                i++;
                        }
                }
                keyscan();
        }
}
void delay1ms(uint x)//延时
{
        uint i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}
void delay(uchar i)//延时
{
        uchar j,k;
        for(j=i;j>0;j--)
                for(k=125;k>0;k--);
}
void keyscan()
{
                col1=1;col2=1;col3=0;col4=1;//上水按键区
                temp=P2;
                temp=P2&0x3f;
                if(col3==0)         
                {                                                            
                        delay(80);
                        if(temp!=0x3f)
                        {        
                                temp=P2&0x3c;
                                switch(temp)
                                {
                                        case 0x1c:        //进入上水功能界面
                                        counter++;
                                        a=counter%2;
                                                switch(a)
                                                {
                                                        case 1:         //第一功能键,显示上水界面


                                                                write_cmd(0x01);
                                                                delay1ms(5);


                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }


                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis4!='\0')
                                                                {
                                                                        write_dat(dis4);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis12!='\0')
                                                                {                                                                           
                                                                        write_dat(dis12);
                                                                        i++;
                                                                }


                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis1!='\0')
                                                                {
                                                                        write_dat(dis1);
                                                                        i++;
                                                                }
                                                                break;


                                                        case 0:           //第二功能键,开始上水


                                                                TR0=1;
                                                                write_cmd(0x01);
                                                                delay1ms(5);


                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }


                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis6!='\0')
                                                                {
                                                                        write_dat(dis6);
                                                                        i++;
                                                                }
                                                                                         
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis13!='\0')
                                                                {
                                                                        write_dat(dis13);
                                                                        i++;
                                                                }                                          
                                                                lcd_pos(2,6);
                                                                write_sfm1(6,water1);                                                         
                                                                write_cmd(0x90);


                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis7!='\0')
                                                                {
                                                                        write_dat(dis7);
                                                                        i++;
                                                                }
                                                                if(water1<=water0)
                                                                {
                                                                        m=0xfe;
                                                                        P1=m;
                                                                        delay1ms(500); //延时
                                                                        m=_crol_(m,1);
                                                                }
                                                                else
                                                                {
                                                                        TR0=0;
                                                                }
                                                            break;
                                                }


                                                counter=0;
                                                write_cmd(0x01);
                                                delay1ms(5);


                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }


                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis2!='\0')
                                                {
                                                        write_dat(dis2);
                                                        i++;
                                                }


                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis13!='\0')
                                                {
                                                        write_dat(dis13);
                                                        i++;                                          
                                                }                                          
                                                lcd_pos(2,6);
                                                write_sfm1(6,water0);                                                         
                                                write_cmd(0x90);        


                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;
                                
                                        case 0x2c:        //增加水位比


                                                        _Speak=0;
                                                        delay1ms(40);
                                                        _Speak=1;


                                                        write_cmd(0x01);
                                                        delay1ms(5);                                         
        
                                                        delay(20);
                                                        lcd_pos(0,0);
                                                        i=0;
                                                        while(dis0!='\0')
                                                        {
                                                                write_dat(dis0);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(1,0);
                                                        i=0;
                                                        while(dis4!='\0')
                                                        {
                                                                write_dat(dis4);
                                                                i++;
                                                        }
        
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis12!='\0')
                                                        {
                                                                write_dat(dis12);
                                                                i++;
                                                        }                                          
                                                        lcd_pos(2,6);
                                                        water1++;
                                                        if(water1==100)
                                                        {
                                                                water1=99;
                                                                _Speak=0;
                                                                delay1ms(100);
                                                                _Speak=1;
                                                                P1=0x00;
                                                                delay1ms(100);
                                                                P1=0xff;
                                                        }
                                                        write_sfm1(6,water1);                                                         


                                                        delay(20);
                                                        lcd_pos(3,0);                                                                                
                                                        i=0;
                                                        while(dis1!='\0')
                                                        {
                                                                write_dat(dis1);
                                                                i++;
                                                        }
                                                        break;        


                                        case 0x34:  //降低水位比


                                                _Speak=0;
                                                delay1ms(40);
                                                _Speak=1;


                                                 write_cmd(0x01);
                                                delay1ms(5);                  


                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }


                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis4!='\0')
                                                {
                                                        write_dat(dis4);
                                                        i++;
                                                }


                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis12!='\0')
                                                {
                                                        write_dat(dis12);
                                                        i++;
                                                }                                          
                                                lcd_pos(2,6);
                                                water1--;
                                                if(water1==0)
                                                {
                                                        water1=1;
                                                        _Speak=0;
                                                        delay1ms(100);
                                                        _Speak=1;
                                                        P1=0x00;
                                                        delay1ms(100);
                                                        P1=0xff;
                                                }
                                                write_sfm1(6,water1);                                                         
                                                write_cmd(0x88);


                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;


                                        case 0x38: //退出键以及上水中止键


                                                TR0=0;
                                                counter=0;
                                                write_cmd(0x01);
                                                delay1ms(5);


                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }


                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis2!='\0')
                                                {
                                                        write_dat(dis2);
                                                        i++;
                                                }


                                                if(a==1)
                                                {
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis3!='\0')           
                                                        {
                                                                write_dat(dis3);
                                                                i++;
                                                        }
                                                }
                                                else if(a==0)
                                                {
                                                        delay(20);
                                                        lcd_pos(2,0);
                                                        i=0;
                                                        while(dis13!='\0')
                                                        {
                                                                write_dat(dis13);
                                                                i++;                                          
                                                        }                                          
                                                        lcd_pos(2,6);
                                                        write_sfm1(6,water1);                                                         
                                                        write_cmd(0x90);        
                                                }


                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                P1=0xff;
                                                break;
                                }
                        }
                }

                col1=1;col2=1;col3=1;col4=0; //加热按键区
                temp=P2;
                temp=P2&0x3f;
                if(col4==0)
                {                                 
                        delay(80);
                        if(temp!=0x3f)
                        {                                                                        
                                temp=P2&0x3c;
                                switch(temp)
                                {
                                        case 0x1c:        //进入加热功能界面
                                        counter1++;
                                        b=counter1%2;
                                                switch(b)
                                                {
                                                        case 1:         //第一功能键,显示加热界面

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis9!='\0')
                                                                {
                                                                        write_dat(dis9);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis8!='\0')
                                                                {
                                                                        write_dat(dis8);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis1!='\0')
                                                                {
                                                                        write_dat(dis1);
                                                                        i++;
                                                                }
                                                                break;

                                                        case 0:           //第二功能键,开始加热

                                                                write_cmd(0x01);
                                                                delay1ms(5);

                                                                delay(20);
                                                                lcd_pos(0,0);
                                                                i=0;
                                                                while(dis0!='\0')
                                                                {
                                                                        write_dat(dis0);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(1,0);
                                                                i=0;
                                                                while(dis2!='\0')
                                                                {
                                                                        write_dat(dis2);
                                                                        i++;
                                                                }
               
                                                                delay(20);
                                                                lcd_pos(2,0);
                                                                i=0;
                                                                while(dis10!='\0')
                                                                {
                                                                        write_dat(dis10);
                                                                        i++;
                                                                }

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis11!='\0')
                                                                {
                                                                        write_dat(dis11);
                                                                        i++;
                                                                }
                                                                break;
                                                }
                                                break;
                                
                                        case 0x2c:        //提高温度
                                
                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis9!='\0')
                                                {
                                                        write_dat(dis9);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis8!='\0')
                                                {
                                                        write_dat(dis8);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;

                                        case 0x34:  //降低温度

                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis9!='\0')
                                                {
                                                        write_dat(dis9);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis8!='\0')
                                                {
                                                        write_dat(dis8);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;

                                        case 0x38: //退出键以及加热中止键

                                                write_cmd(0x01);
                                                delay1ms(5);

                                                delay(20);
                                                lcd_pos(0,0);
                                                i=0;
                                                while(dis0!='\0')
                                                {
                                                        write_dat(dis0);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(1,0);
                                                i=0;
                                                while(dis2!='\0')
                                                {
                                                        write_dat(dis2);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(2,0);
                                                i=0;
                                                while(dis3!='\0')
                                                {
                                                        write_dat(dis3);
                                                        i++;
                                                }

                                                delay(20);
                                                lcd_pos(3,0);
                                                i=0;
                                                while(dis1!='\0')
                                                {
                                                        write_dat(dis1);
                                                        i++;
                                                }
                                                break;
                                }
                        }
                }
                while(temp!=0x3c)
                {
                        temp=P2;
                        temp=temp&0x3c;        
                }
}
bit lcd_busy()//检测忙状态
{                          
    bit result;
    LCD_RS = 0;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}

void write_cmd(uchar cmd)//写指令数据到LCD
{
         LCD_RS=0;
        LCD_RW=0;
        LCD_EN=0;
        P0=cmd;
        delay1ms(5);
        LCD_EN=1;
        delay1ms(5);
        LCD_EN=0;
}
void write_dat(uchar dat)//写显示数据到LCD
{
        LCD_RS=1;
        LCD_RW=0;
        LCD_EN=0;
        P0=dat;
        delay1ms(5);
        LCD_EN=1;
        delay1ms(5);
        LCD_EN=0;
}
void lcd_pos(uchar X,uchar Y)//设定显示位置
{
        uchar pos;
        if(X==0)
        {X=0x80;}
        else if(X==1)
        {X=0x90;}
        else if(X==2)
        {X=0x88;}
        else if(X==3)
        {X=0x98;}
        pos=X+Y;
        write_cmd(pos);
}
void write_sfm1(uchar add,uchar date)//显示数据1,中断外部使用
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;                                       

        write_cmd(0x88+add);

        write_dat(0x30+shi);
        write_dat(0x30+ge);
}
void lcd_init()//LCD初始化
{
        LCD_PSB=1;
        write_cmd(0x30);
        delay1ms(5);
        write_cmd(0x0c);
        delay1ms(5);
        write_cmd(0x01);
        delay1ms(5);
        write_cmd(0x38);
        delay1ms(5);
}
void Time0(void) interrupt 1 using 0
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        delay1ms(4950);
        water1++;
}


望您指点迷津,谢谢您了!

人中狼 2017-6-12 你还没明白while()和if()的运行过程,假设
while(1)
{
     if(条件1){}
     if(条件2){}
     等等
}
这里先执行条件1的if判断,再执行条件2的if判断,再执行等等,然后再执行条件1的判断,如此循环,如果条件1满足,则执行条件1的内容,执行完以后,退出条件1的判断,再执行条件2的if判断,再执行等等,然后再执行条件1的判断,如果条件1满足,就再执行条件1 的内容。
好好理解理解
标签:中断
举报
高级工程师
发表于 2017-6-12 19:09:47  
你还没明白while()和if()的运行过程,假设
while(1)
{
     if(条件1){}
     if(条件2){}
     等等
}
这里先执行条件1的if判断,再执行条件2的if判断,再执行等等,然后再执行条件1的判断,如此循环,如果条件1满足,则执行条件1的内容,执行完以后,退出条件1的判断,再执行条件2的if判断,再执行等等,然后再执行条件1的判断,如果条件1满足,就再执行条件1 的内容。
好好理解理解
回复 点赞 举报
高级工程师
发表于 2017-6-12 19:43:01  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
不闪就怪了,假设low=0,无按键操作,无其他操作,那么主程序的while()就等于在不停的执行low=0部分的程序。定时器初始化部分没有对tmod,tcon设置,定时器中断里不能有长的延时程序。

评分

参与人数 1积分 +5 收起 理由
ElecFans王岑 + 5
查看全部评分
回复 点赞 举报
技术员
发表于 2017-6-12 20:52:04    楼主|
人中狼 发表于 2017-6-12 19:43
不闪就怪了,假设low=0,无按键操作,无其他操作,那么主程序的while()就等于在不停的执行low=0部分的程序。定时器初始化部分没有对tmod,tcon设置,定时器中断里不能有长的延时程序。

谢谢您再次的帮助。
那个low的这个,我是想通过一根杜邦线,定义一个IO口,然后将这个IO口接地,显示一个,然后开中断,满足条件后,结束接地的这个程序(模拟自动上水,定时器中断每几秒就加一个水位比,加到设定值就跳出这个接地的程序,然后,正常显示初始页面),接VCC,显示另外一个。
有个地方不是很明白,看您的意思,也就是说low=0那部分程序被一直执行,实际需要执行完跳出来吗?
定时器这个明白了,谢谢您!
回复 点赞 举报
技术员
发表于 2017-6-13 10:57:36  
楼上的意思应该是
Low无论符合哪一条件,液晶都会一直刷,可不可以改下,Low变化的时候,液晶只显示一次,等下一次Low变化时才会再刷新
  1. void Time0(void) interrupt 1 using 0
  2. {
  3.         TH0=(65536-46080)/256;
  4.         TL0=(65536-46080)%256;
  5.         [color=Red]delay1ms(4950);[/color]
  6.         water1++;
  7. }
复制代码

定时器里将近5s的延时这个就不理解了,既然用了定时器,为什么还在这加这么长的延时

定时器里没有定时器和工作方式的选择,一般TMOD = 0x01; //定时器0,工作方式1

评分

参与人数 1积分 +5 收起 理由
ElecFans王岑 + 5
查看全部评分
回复 点赞 举报
助理工程师
发表于 2017-6-13 11:51:37  
你的程序框架不甚合理,操作LCD显示程序要尽量简短,不要随便整屏刷新,只对需更新的字符重写,不必整屏刷新,否则会降低运行效率,劣化显示效果。建议把基本显示内容放在主程序初始化时处理,需要更新的显示内容放在主循环里处理,并且要设置约束条件,只在需要更新显示内容有变化时才运行操作LCD显示程序,否则LCD会闪烁。

评分

参与人数 1积分 +5 收起 理由
ElecFans王岑 + 5
查看全部评分
回复 点赞 举报
技术员
发表于 2017-6-13 14:24:45    楼主|
人中狼 发表于 2017-6-12 21:34
你还没明白while()和if()的运行过程,假设
while(1)
{

好的,愚生明白了,谢谢您的帮助,愚生这几天在自身发现了好多问题,会努力去改正的,再次向您表达感谢!
回复 点赞 举报
技术员
发表于 2017-6-13 14:29:26    楼主|
觉jiào醒 发表于 2017-6-13 10:57
楼上的意思应该是
Low无论符合哪一条件,液晶都会一直刷,可不可以改下,Low变化的时候,液晶只显示一次,等下一次Low变化时才会再刷新

谢谢您,感谢您的帮助,愚生会继续努力的,谢谢您!
回复 点赞 举报
技术员
发表于 2017-6-13 14:31:50    楼主|
wulinwl 发表于 2017-6-13 11:51
你的程序框架不甚合理,操作LCD显示程序要尽量简短,不要随便整屏刷新,只对需更新的字符重写,不必整屏刷新,否则会降低运行效率,劣化显示效果。建议把基本显示内容放在主程序初始化时处理,需要更新的显示内容放在主循环里处理,并且要设置约束条件,只在需要更新显示内容有变化时才运行操作LCD显示程序,否则LCD会闪烁 ...

谢谢您的指点,愚生的代码结构性太差了,存在各种问题,愚生会努力改正的,谢谢您!
回复 点赞 举报
技术员
发表于 2017-6-13 14:33:35    楼主|
谢谢长辈们的指点,在下不胜感激,发现了自身的好多问题,愚生会努力去更正的,谢谢了!
回复 点赞 举报
发表于 2017-6-14 10:59:07  
如果问题解决了,希望尽快选择最佳答案哦,这也是对答题者的尊重
回复 点赞 举报
高级模式
您需要登录后才可以回帖 登录 | 注册
关闭

站长推荐 上一条 /9 下一条

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区