打印
[51单片机]

程序存在两个问题,求解答,谢谢您!

[复制链接]
2002|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
han001|  楼主 | 2017-6-10 16:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 han001 于 2017-6-10 16:38 编辑

感谢您抽出时间来帮我解决这个问题。因完整程序太长,并且我个人认为这两个问题与其他部分没有关联,因此没有附出完整程序。
步入正题。在下是想,来简单的模拟一个界面显示。定义一个引脚,用一根杜邦线,引脚接地时,显示需要模拟的那个界面,不接地时,是正常状态的界面。用的是12864来显示。

问题一、
程序如下:


void main()//固定界面显示
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
        TL0=0x00;      //50ms中断定时   
        ET0=1;
        EA=1;

        lcd_busy();  //LCD忙状态检测
        delay1ms(10);
        lcd_init(); //LCD初始化

        lcd_pos(0,0);//智能控制
        i=0;
        while(dis0!='\0')
        {                                            // LCD显示,下面三个均是
                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++;
        }

        if(Low==0)//触发模拟自动上水,其中Low是定义的IP脚
        {
                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(dis12!='\0')
                {
                        write_dat(dis12);
                        i++;
                }                                          
                lcd_pos(2,6);
                write_sfm1(6,water);                                                         
                write_cmd(0x90);
        
                delay(20);
                lcd_pos(3,0);
                i=0;
                while(dis7!='\0')
                {
                        write_dat(dis7);
                        i++;
                }
                P1=0x00; // 接地,显示一个界面
        }
        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(dis3!='\0')
                {
                        write_dat(dis3);
                        i++;
                }

                delay(20);
                lcd_pos(3,0);
                i=0;
                while(dis1!='\0')
                {
                        write_dat(dis1);
                        i++;
                }
                P1=0xff; //正常状态,未接地,显示原界面
        }

        delay1ms(10);
        while(1)
        {
                keyscan(); // 显示函数
        }
}



问题描述:
不知以上程序是否存在问题,个人认为无,但程序结果却有错误,无编译问题,未报错。具体表现如下:
1.当在下烧写完程序后,用杜邦线接Low引脚时,接地和接Vcc都没有正常显示。
2.当在下先用杜邦线接Low引脚再烧写程序时,如果接的是地,它会显示应该显示的界面,如果接的是Vcc,同样都会显示应该显示的界面。但是,当接地或者Vcc时,再把地换成Vcc或者把Vcc换成地,都不显示任何界面,只显示上一次地或Vcc显示的界面。
3.当不用杜邦线接Low引脚时,如果if里面是Low==0时,会一闪而过Low==1应当显示的界面,一闪而过后,显示初始状态界面(初始状态界面就是什么都不做时,也会显示的界面,如同手机桌面),相反的,不再赘述。


综上所述,想请教一下您们,怎么解决这个问题,怎么才能让它正常,接地显示一个,不接地显示一个。还有,接地为0,接Vcc时为1,如果什么都不接,默认为0吗?希望能得到您的帮助!




问题二、
程序如下(同问题一只增加了红色标出的语句):
void main()//固定界面显示
{
        TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;
    TL0=0x00;      //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++;
        }

        if(Low==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(dis6!='\0')
                {
                        write_dat(dis6);
                        i++;
                }
                                       
                delay(20);
                lcd_pos(2,0);
                i=0;
                while(dis12!='\0')
                {
                        write_dat(dis12);
                        i++;
                }                                          
                lcd_pos(2,6);
                write_sfm1(6,water);                                                         
                write_cmd(0x90);
        
                delay(20);
                lcd_pos(3,0);
                i=0;
                while(dis7!='\0')
                {
                        write_dat(dis7);
                        i++;
                }
                P1=0x00;
                break;
        }
        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(dis3!='\0')
                {
                        write_dat(dis3);
                        i++;
                }

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

        delay1ms(10);
        while(1)
        {
                keyscan();
        }
}


具体如下:
编译报错,如图。不解,求答,谢谢您!
文字版:

Build target 'Target 1'
compiling test1.c...
TEST1.C(136): error C171: 'break': missing enclosing loop
TEST1.C(179): error C171: 'break': missing enclosing loop
Target not created


捕获.PNG (38.8 KB )

捕获.PNG

相关帖子

沙发
han001|  楼主 | 2017-6-10 16:37 | 只看该作者
本帖最后由 han001 于 2017-6-10 16:38 编辑

谢谢您!

使用特权

评论回复
板凳
Lbsonggz| | 2017-6-10 17:42 | 只看该作者
1. Break 用于switch多支选择中的case 语句,
2.  界面用个I/O引脚控制即可

使用特权

评论回复
地板
xuyaqi| | 2017-6-10 17:52 | 只看该作者
break应用在循环里的退出,你放在了非循环里,所以错误。

使用特权

评论回复
5
han001|  楼主 | 2017-6-10 19:00 | 只看该作者
Lbsonggz 发表于 2017-6-10 17:42
1. Break 用于switch多支选择中的case 语句,
2.  界面用个I/O引脚控制即可

好,谢谢您的帮助。break用在for,while,switch循环语句中,我把我的if想成for了,抱歉了。在下太愚笨了。您的第二个回答不太明白啊,在下就是用的I/O口3.0啊,可能是我没有表达清楚吧。总之,感谢您能回答我的问题。

使用特权

评论回复
6
han001|  楼主 | 2017-6-10 19:02 | 只看该作者
xuyaqi 发表于 2017-6-10 17:52
break应用在循环里的退出,你放在了非循环里,所以错误。

对对对,在下不知为何,一直把我的if看成了for,惭愧。谢谢您的回答!那个,第一个问题您用什么意见或建议吗,望您能指点一二,谢谢!

使用特权

评论回复
7
linqing171| | 2017-6-10 21:18 | 只看该作者
哈哈,break 能否break for中的if,以前出面试题的时候很多人会答错。

使用特权

评论回复
8
han001|  楼主 | 2017-6-11 14:15 | 只看该作者
linqing171 发表于 2017-6-10 21:18
哈哈,break 能否break for中的if,以前出面试题的时候很多人会答错。

使用特权

评论回复
9
xuyaqi| | 2017-6-11 15:52 | 只看该作者
han001 发表于 2017-6-10 19:02
对对对,在下不知为何,一直把我的if看成了for,惭愧。谢谢您的回答!那个,第一个问题您用什么意见或建 ...

初步看了一下 while用的不对,应该if,如while(dis0!='\0' )应该换成 if(dis0!='\0')。

使用特权

评论回复
10
han001|  楼主 | 2017-6-11 16:28 | 只看该作者
xuyaqi 发表于 2017-6-11 15:52
初步看了一下 while用的不对,应该if,如while(dis0!='\0' )应该换成 if(dis0!='\0')。 ...

谢谢。
可在下觉得貌似不是这里的原因吧,while可以用的,以前我一直是这样写,一直正常,就是这次在以前的基础山河加了些新代码,结果出现问题了。

使用特权

评论回复
11
xuyaqi| | 2017-6-12 07:14 | 只看该作者
han001 发表于 2017-6-11 16:28
谢谢。
可在下觉得貌似不是这里的原因吧,while可以用的,以前我一直是这样写,一直正常,就是这次在以前 ...

用if条件成立执行一次就出去了,如果while条件成立永远循环,就不执行后面的,你需要哪种情况。

使用特权

评论回复
12
fengjumeng| | 2017-6-12 16:11 | 只看该作者
程序执行到这里,就一直死while里面了,其他语句不执行了, 把main函数所有语句都放到while里面(初始化除外)!
while(1)
        {
                keyscan(); // 显示函数
        }
另外,如果什么都不接,默认为1

使用特权

评论回复
13
fengjumeng| | 2017-6-12 16:12 | 只看该作者
12864写字符串用while(dis0!='\0' )没毛病

使用特权

评论回复
14
han001|  楼主 | 2017-6-12 16:26 | 只看该作者
xuyaqi 发表于 2017-6-12 07:14
用if条件成立执行一次就出去了,如果while条件成立永远循环,就不执行后面的,你需要哪种情况。 ...

好,谢谢您,对于在下的情况,这两个方法自我感觉都可以。

使用特权

评论回复
15
han001|  楼主 | 2017-6-12 19:22 | 只看该作者
fengjumeng 发表于 2017-6-12 16:11
程序执行到这里,就一直死while里面了,其他语句不执行了, 把main函数所有语句都放到while里面(初始化除 ...

谢谢您,呃,在下按照您的方法,把他们都放到while里面了,但是,12864一直在闪啊,这不是在下想要的结果啊。

使用特权

评论回复
16
fengjumeng| | 2017-6-13 08:44 | 只看该作者
呃呃 每执行一次 刷屏一次 所以一直在闪,可以尝试在外部状态有变化(1-0或0-1)后,而不是检测外部状态  再调用显示更新内容

或者刷新显示函数中不清屏,外在表现也就看不到闪烁(write_cmd(0x01);  这条应该是清屏函数吧)

使用特权

评论回复
17
fengjumeng| | 2017-6-13 08:46 | 只看该作者
补充一点:不清屏的话 最好整屏刷新数据  不然的话容易造成花屏。

使用特权

评论回复
18
han001|  楼主 | 2017-6-13 14:36 | 只看该作者
fengjumeng 发表于 2017-6-13 08:46
补充一点:不清屏的话 最好整屏刷新数据  不然的话容易造成花屏。

谢谢您的指点,愚生会努力去更正的,谢谢您!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

34

帖子

1

粉丝