OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5479|回复: 15

请教两个小问题,谢谢您了!

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
发表于 2017-6-10 16:42:08 | 显示全部楼层 |阅读模式
1金钱

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







再次向您表达感谢!


最佳答案

查看完整内容[请看2#楼]

我来与你解答一个简单的问题.. BREAK用法..这个单词是用来从一个循环里面逃跑的..这个循环一般是指FOR,,WHILE等指令..编译发现没有 BREAK 并不在任何一个FOR,WHILE里面时会报错.你现在这个局面应该用RETURN.或者GOTO来解决. 另外一个我告诉你.所有的芯片里面的程序都跑得飞快飞快的.你的检查杜绑线接地的程序不在大循环里面.只在初始化区域..只有上电前前你才有机会来选择..另外.你不要问我什么是大循环.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-10 16:42:09 | 显示全部楼层
我来与你解答一个简单的问题..
BREAK用法..这个单词是用来从一个循环里面逃跑的..这个循环一般是指FOR,,WHILE等指令..编译发现没有 BREAK 并不在任何一个FOR,WHILE里面时会报错.你现在这个局面应该用RETURN.或者GOTO来解决.

另外一个我告诉你.所有的芯片里面的程序都跑得飞快飞快的.你的检查杜绑线接地的程序不在大循环里面.只在初始化区域..只有上电前前你才有机会来选择..另外.你不要问我什么是大循环.
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 14:14:11 | 显示全部楼层
操作系统 发表于 2017-6-10 16:42
我来与你解答一个简单的问题..
BREAK用法..这个单词是用来从一个循环里面逃跑的..这个循环一般是指FOR,,WH ...

谢谢您,在下误把if当成for了。第二个问题,在下知道了,抱歉这么晚来表达对您的感谢!
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 16:33:03 | 显示全部楼层
操作系统 发表于 2017-6-10 16:42
我来与你解答一个简单的问题..
BREAK用法..这个单词是用来从一个循环里面逃跑的..这个循环一般是指FOR,,WH ...

呃,在下按照您的方法把其放到了大循环里面,可12864会出现一直闪一直闪的问题呢,就这样闪一会,然后屏幕就什么都没有了。也许是在下的程序改错了,希望您为在下指点一二。修改的程序如下,在下在他人的建议和意见下又做了些小改动,不知是否存在问题,烧写后,12864的按键都不能使用了。望您指点迷津,在下先谢过了!


#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_();};
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();
uint num=0,i=0;
uint counter=0,a=0,counter1=0,b=0;
uint water0=0,water1=0,temp=0;
uint m;
uint LOW;
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==1)//触发模拟自动上水
                {
                        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==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++;
                        }
                }
        keyscan();
        }
}
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 16:36:33 | 显示全部楼层
你这种做法,问题多多.. delay(20);这种函数尽量不要调用..除非在大循环之前..
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 16:38:28 | 显示全部楼层
操作系统 发表于 2017-6-11 16:36
你这种做法,问题多多.. delay(20);这种函数尽量不要调用..除非在大循环之前..

谢谢您,不调用的话,那怎么延时函数啊?在下不是太理解啊。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 16:39:38 | 显示全部楼层
不用延时..从来不用, 一定不要用它.
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 16:44:07 | 显示全部楼层
操作系统 发表于 2017-6-11 16:39
不用延时..从来不用, 一定不要用它.

啊,在下有点蒙了。如果有按键的话,那您怎么消抖呢?
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 16:44:23 | 显示全部楼层
实在要延时,,请用软件定时器..
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 16:45:31 | 显示全部楼层
我可以发一个 我的常用按钮程序.只是怕你也看不明白

void sweep(void)
{
uc key=0;
static uc lastKey=0;
static ui keyn=0;
if(me.hour>=24)return;
  if( get_KEY1()==0 ) key = 1;
  if( get_KEY2()==0 ) key |= 2;
  if( key != lastKey)
   {
        keyn = 0;
  lastKey = key;
   }
  else
   {
     if( keyn < 1000)
    {
     keyn++;
      if( keyn == 7 )
   {
                  switch(key)
                  {
                  case 0:
                    switch(me.longKey)
                    {
                    case 0:
                     // longKey = 0;
                      break;
                    case 1:

                       if(me.open)
                       {
                          me.open = 0;
                          me.mode = 0;
                          me.restore_led = 1;
                       }


                     break;
                    case 2:
                            stop_timer(delay_800);
                            me.restore_led = 0;
                            me.setting = 0;
                             if(me.mode == 3)
                           {
                           config.m3.blue = me.blue;
                           config.m3.green = me.green;
                           config.m3.red = me.red;
                           }
                           me.mode ++;
                            if(me.mode>3)me.mode = 1;
                            config.mode = me.mode;
                            me.saveEEP = 1;
                            loadMode();
                      break;
                    case 3:
                    case 4:
                         stop_timer(delay_800);
                         stop_timer(changeDir);
                         switch(me.mode)
                         {
                         case 1:
                           config.white = me.white;
                           config.yellow = me.yellow;
                           break;
                         case 2:
                           config.m2.blue = me.blue;
                           config.m2.green = me.green;
                           config.m2.red = me.red;
                         break;

                         }
                         me.setting = 0;
                         me.restore_led = 0;
                         me.light_en = 0;
                         me.saveEEP = 1;
                      break;
                    }

                      me.longKey = 0;
                    break;
                  case 1:
                           if(me.open == 0)
                           {
                              me.open = 1;
                              me.mode = config.mode;
                            me.setting = 0;
                            loadMode();
                           }
                           else
                             me.longKey = 1;
                    break;
                  case 2:
                     if(me.open)
                             me.longKey=2;
                    break;
                  }
   }
                      if( keyn == 300 )
                       if(key == 3)
                       {
                          me.longKey=0;
                          stop_timer(delay_800);
                          me.restore_led = 0;
                          me.setting = 0;
                         restore_eeprom();
                          me.mode = 1;
                          loadMode();
                       }
            if( keyn == 100 )
   {
                if( (me.restore_led == 0) &&  me.open && (me.mode > 0) && (me.mode < 3) )
                {
                    if(key)
                    {
                          switch(key)
                          {
                                case 1:
                                me.setting = 0;
                                stop_timer(delay_800);
                                stop_timer(changeDir);
                                me.longKey = 4;
                                me.light_en=1;
         me.restore_led = 0;
                                 if(me.mode==1)
                                 {
                                    config.Yellow = me.yellow;
                                    config.White = me.white;
                                   config.dir1 = 0xff;
                                   config.scale1 = 100;
                                   if(me.yellow==0)
                                     me.y0 = 0;
                                   else me.y0 = 1;

                                   if(me.white == 0)
                                     me.w0 = 0;
                                   else
                                     me.w0 = 1;
                                 }
                                 else
                                 {
                              
                                   config.Blue = me.blue;
                                   config.Green = me.green;
                                   config.Red = me.red;
                                   config.dir2 = 0xff;
                                   config.scale2 = 100;
                                   if(me.blue==0)
                                     me.b0 = 0;
                                   else me.b0 = 1;

                                   if(me.red == 0)
                                     me.r0 = 0;
                                   else
                                     me.r0 = 1;
                                    if(me.green == 0)
                                     me.g0 = 0;
                                   else
                                     me.g0 = 1;
                                  }
                              
                                break;
                                case 2:
                                  me.light_en=0;
                                  stop_timer(delay_800);
                                  stop_timer(changeDir);
                                  loadMode();
                                  me.setting = 1;
                                  me.longKey = 3;
                                
                                 break;
                          }
                    }

       }
                else me.longKey = 0;

   }
      }

   }

}

回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 16:47:23 | 显示全部楼层
本帖最后由 操作系统 于 2017-6-11 16:49 编辑

这具程序有长按,短按功能..可以完美解决什么消抖动的问题..但是他的调用方式很特别

const __callback tk[10]=
{
sweep,
0,
0,
process_light,
    0,
saveEEP,
0,
0,
0,
    testTime,
};

它是采用回调方式 调用的..
void main(void)
{
  EA0();
  delay_ms(50);
  init();
  EA1();
  read_eep();
  me_init();
while(1)
{
   if(tick_up)
    {
        tick_up=0;
        work_led();
  if( tk[tkn] )tk[tkn]();
  tkn++;
  if(tkn>=10)tkn=0;
       process_timer();
    }

}
}
我的大循环 就这么多的代码了.很简单..清晰.
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 16:57:24 | 显示全部楼层
操作系统 发表于 2017-6-11 16:45
我可以发一个 我的常用按钮程序.只是怕你也看不明白

void sweep(void)

的确,在下看起来挺吃力的。在下想问一下delay()这种延时函数,为什么您不推荐使用,而推荐用定时器呢?另外,您能帮在下看一下完整的程序吗,在下实在是不知道哪里有问题,可烧写到板子里,可就是不行呢。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 17:26:43 | 显示全部楼层
han001 发表于 2017-6-11 16:57
的确,在下看起来挺吃力的。在下想问一下delay()这种延时函数,为什么您不推荐使用,而推荐用定时器呢 ...


你的程序就是我刚刚开始学单片机的程序,.没有什么看头..
延时函数只会让CPU空跑.浪费时间.而定时器是事件触发,,占用CPU资源不多.
可以想象,,你会选择哪些结构来做程序了.延时函数只能做简单程序..教学性质的程序罢了..其它的都做不了..
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 17:54:31 | 显示全部楼层
操作系统 发表于 2017-6-11 17:26
你的程序就是我刚刚开始学单片机的程序,.没有什么看头..
延时函数只会让CPU空跑.浪费时间.而定时器是 ...

谢谢您,在下的程序在楼下,在下代码不美,希望您能指点一二,稍微有点长,红字部分不需要看,谢谢您了!
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-4-11
在线时间
5 小时
 楼主| 发表于 2017-6-11 17:55:34 | 显示全部楼层
#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_();};
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();
uint num=0,i=0;
uint counter=0,a=0,counter1=0,b=0;
uint water0=0,water1=0,temp=0;
uint m;
uint LOW;
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++;
        }

        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++;
                }
        }

        delay1ms(10);
        while(1)
        {
        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,water0);                                                         
                                                                write_cmd(0x90);

                                                                delay(20);
                                                                lcd_pos(3,0);
                                                                i=0;
                                                                while(dis7!='\0')
                                                                {
                                                                        write_dat(dis7);
                                                                        i++;
                                                                }
                                                                while(water1<=water0)
                                                                {
                                                                        m=0xfe;
                                                                        P1=m;
                                                                        delay1ms(500); //延时
                                                                        m=_crol_(m,1);
                                                                }
                                                                TR0=0;
                                                            break;
                                                }
                                                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++;
                                                }*/
                               
                                        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')           //a=0,1两种情况
                                                        {
                                                                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 write_sfmd1(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 write_sfm2(uchar add,uchar date)//显示数据2
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;                                       

        write_cmd(0x90+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++;
}


        /*if(water1==water0)
        {
                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_sfmd1(6,water0);                                                         
                write_cmd(0x90);

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



//TR0=1;              //启动中断
//TR0=0;              //关闭中断


/*        m=0xfe;
        while(exit==0)
        {
        P1=m;
        delay1ms(500); //延时
        m=_crol_(m,1);
        if(temp==0x38)
        {
                exit=1;
        }
        } */
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2013-6-5
在线时间
142 小时
发表于 2017-6-12 11:50:12 | 显示全部楼层
操作系统 发表于 2017-6-11 16:47
这具程序有长按,短按功能..可以完美解决什么消抖动的问题..但是他的调用方式很特别

const __callback tk ...

脱裤子放屁,为了形式而形式,
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 14:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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