找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1411|回复: 2
打印 上一主题 下一主题
收起左侧

Proteus仿真单片机C语言,按设置键while跳不出去

[复制链接]
跳转到指定楼层
楼主

  1. void SetFun(void) //进入设置参数子函数
  2. {      
  3.         if(SetKey==0)  //设置按键
  4.             {
  5.                   if(Set1<2)        Set1++;   //设置按键次数累计
  6.                   else Set1=0;                                                
  7.             }
  8.         switch(Set1) //根据设置按键次数,指向对应设置位置
  9.             {
  10.                  case 0:
  11.                                     wr_com(0x80);
  12.                                 wr_dat(' ');
  13.                                 wr_com(0x88);
  14.                                 wr_dat(' ');
  15.                                     break;//清除设置符号
  16.                  case 1:
  17.                                         wr_com(0x80);
  18.                                 wr_dat('>');
  19.                                         wr_com(0x88);
  20.                                 wr_dat(' ');
  21.                                         break;//指向设置下限
  22.                  case 2:
  23.                                         wr_com(0x80);
  24.                                 wr_dat(' ');
  25.                                         wr_com(0x88);
  26.                                 wr_dat('>');
  27.                                         break;//指向设置上限
  28.             }
  29.         while(SetKey==0);//等待按键松开
  30. }


  31. /*主函数*/
  32. uchar global_state = 0;
  33. uchar count_num = 0;  //输入的数字个数
  34. void main()
  35. {  
  36.     uchar i;
  37.     uchar passwd;  
  38.            uchar key_value = 0;
  39.         uchar temp_key_value = 0xff;
  40.         Lock = 1;  //刚上电 锁是需要保持闭合
  41.         Timer0_init();        //定时器初始化
  42.          lcd_init();        //LCD1602初始化

  43.         while(1)        //进入不断循环
  44.         {
  45.                    temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  46.                 if(temp_key_value != 0xff)
  47.                 {
  48.                         key_value = temp_key_value;
  49.                 }
  50.                 switch(global_state)
  51.                 {
  52.                         case 0:         //初始化状态
  53.                                 display1();         //显示欢迎语句        -- "welcome"

  54.                                 display5();  //显示Current T=
  55.                                 Read_Temperature(); //读取温度值
  56.                                 display7();  //显示温度

  57.                                 if(SetKey==0)        //设置键                          
  58.                   {   
  59.                                      if(SetKey==0)
  60.                                          {               
  61.                       while(1)
  62.                                           {
  63.                         display5();         //显示Current T=
  64.                         display6();         //显示上下限
  65.                         Read_Temperature(); //读取温度值
  66.                         display7();         //显示温度
  67.                         display8();         //显示上下限温度                          
  68.                         SetFun();           //指针>           
  69.                         if(SetKey==0)       //再次点击设置键                          
  70.                          {                           
  71.                                                   if(SetKey==0) break;                                                  
  72.                          }
  73.                        }
  74.                                           }                                                            
  75.                                    }
  76.                                                                                                                                                                                                                               
  77.                                 if(key_value == 13)  //存包按键被按下
  78.                                 {
  79.                                     key_value = 0xff;  //将按键值清除
  80.                                         Lock = 0;    //开锁
  81.                                         clear();                 //清屏,准备下一屏的显示
  82.                                         display3();    //显示关门提示语        -- "close door!"
  83.                                     delay(1900);    //等待关门 大约3秒
  84.                                         Lock = 1;   //关门
  85.                                         clear();                 //清屏,准备下一屏的显示
  86.                                         global_state = 1;   //切换运行状态
  87.                                         passwd = TL0;  //采用定时器寄存器的值作为密码
  88.                                         genPasswd[0] = passwd/100;                  //存储密码
  89.                                         genPasswd[1] = passwd%100/10;
  90.                                         genPasswd[2] = passwd%10;
  91.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
  92.                                 }
  93.                                 if(key_value == 14)  //取包按键被按下
  94.                                 {
  95.                                     key_value = 0xff;  //将按键值清除
  96.                                         clear();    //清屏,准备下一屏的显示
  97.                                         global_state = 2;  //切换运行状态
  98.                                         count_num = 0;   //清除数字按键变量
  99.                                         for(i = 0;i < 4;i++)  //清空输入的密码数组
  100.                                         inpPasswd[i] = ' '-0x30;
  101.                                 }
  102.                             break;

  103.                         case 1:                //密码生成状态
  104.                                    display2();         //显示密码生成界面
  105.                                 delay(1900);    //等待大约3秒
  106.                                 global_state = 0;  //返回到初始界面
  107.                                 clear();        //清屏,准备下一屏的显示                                
  108.                             break;

  109.                         case 2:          //输入密码状态
  110.                            display4();           //显示输入密码界面
  111.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  112.                            {                              
  113.                                 if(count_num <= 3)         //如果按键次数小于4次
  114.                                         {
  115.                                         inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
  116.                                                    count_num++;
  117.                                     }
  118.                                          key_value = 0xff;  //将按键值清除
  119.                            }
  120.                            if(key_value == 15) //清除按键被按下
  121.                            {
  122.                                 key_value = 0xff;  //将按键值清除
  123.                                            for(i = 0;i < 4;i++)
  124.                                         inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码
  125.                                         count_num=0;
  126.                            }
  127.                            if(key_value == 16) //确认按键被按下
  128.                            {
  129.                                 key_value = 0xff;  //将按键值清除
  130.                                            for(i = 0;i < 4;i++)
  131.                                         {
  132.                                                 if(inpPasswd[i] != genPasswd[i])
  133.                                                    break;
  134.                                         }
  135.                                         if(i == 4)          //密码输入正确
  136.                                         {
  137.                                                 LEDRED = 1;         //红灯熄灭
  138.                                                 LEDGREEN = 0;  //绿灯亮
  139.                                                 Lock = 1;  //开锁
  140.                                                 delay(1900);    //等待大约3秒
  141.                                                 Lock = 0;  //关锁
  142.                                                 LEDGREEN = 1;  //绿灯熄灭
  143.                                         }
  144.                                         else   //密码输入错误
  145.                                         {
  146.                                                 LEDRED = 0;         //红灯亮
  147.                                                 LEDGREEN = 1;  //绿灯熄灭
  148.                                                 Lock = 0;  //关锁
  149.                                                 delay(1900);    //等待大约3秒
  150.                                                 LEDRED = 1;  //红灯熄灭
  151.                                         }
  152.                                         clear();           //清屏,准备下一屏的显示
  153.                                         global_state = 0;  //返回到初始界面
  154.                            }
  155.                            break;                                                                           
  156.                 }               
  157.         }
  158. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-3-23 16:25 | 只看该作者
不要用while(1)套while(1)
回复

使用道具 举报

板凳
ID:1005707 发表于 2022-3-23 16:37 | 只看该作者
你这程序都不全,SetKey这个值在哪里改变?没有中断或者rtos的话怎么可能跳的出去?
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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