搜索
bottom↓
回复: 9

被小小的问题卡住了[已解决]

[复制链接]

出0入0汤圆

发表于 2013-5-1 12:57:23 | 显示全部楼层 |阅读模式
本帖最后由 小德GD 于 2013-5-1 22:19 编辑

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa,i,temp;
void one();
void two ();
void three ();
void four ();
void delay (uint x)
{
        uint i,j;
                for( i=x; i>0; i-- )
                        for( j=110; j>0; j-- );
}
void keyscan()
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&P1;
                        if(temp!=0x0f)
                        {
                                delay(10);
                                temp=P1;
               
                                        switch( temp )
                                        {
                                                        case 0x77:
                                                        one();        
                                                        break;        
                                                               
                                                               
                                                                 case 0x7b:
                                                                two();
                                                                break;
                                                               
                                                               
                                                               
                                                                        case 0x7d:
                                                                        three();
                                                                break;


                                                                                case 0x7e:
                                                                                four();
                                                                                break;
                                                

                                                                                                while(temp!=0x0f)
                                                                                                {
                                                                                                        temp=P1;
                                                                                                        temp=temp&P1;
                                                                                                }
                                                                                                while(1);
                                        }
                                   
                        
                                }
        }
}
void one ()
{
  P0=0;
}
void two ()
{        
            delay(75);
                P0=~P0;
}
void three ()
{    aa=0xfe;
         for(i=8;i>0;i--)
         {
                  P0=aa;
                aa=_crol_(aa,1);
                delay(100);
         }
         aa=0x7f;
         for(i=8;i>0;i--)
         {
                  P0=aa;
                 aa=_cror_(aa,1);
                 delay(100);
          }
}
void four ()
{
        aa=0xfe;
        for(i=4;i>0;i--)
        {
                        P0=aa;
                        aa=_crol_(aa,2);
                        delay(500);
        }
        aa=0x7f;
        for(i=4;i>0;i--)
        {
                        P0=aa;
                        aa=_cror_(aa,2);
                        delay(500);
        }
}
void main ()
{

         keyscan();
         
}
问题:比如说按下第二个键,检测到了,所以单片机执行
void two()
{        
            delay(75);
                P0=~P0;
}
这个程序,但单片机只执行了一次,不会循环执行 void two这个程序,此时并没有按其他的键。


我要的是再没有按下其他键之前,它会一直执行这个程序,请问该怎么写?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-5-1 13:02:49 | 显示全部楼层
肯定不会一直执行void two,当你不按按键的时候,temp=P0.。。。。。。是没有对应的键值的

出0入0汤圆

发表于 2013-5-1 13:28:35 | 显示全部楼层
用状态机

出0入0汤圆

发表于 2013-5-1 15:31:36 | 显示全部楼层
通常按键处理程序只改一些标志后迅速返回,执行是其他函数根据标志来执行的,这样可以做的非常灵活。

出0入0汤圆

 楼主| 发表于 2013-5-1 19:04:09 | 显示全部楼层
lmserver 发表于 2013-5-1 15:31
通常按键处理程序只改一些标志后迅速返回,执行是其他函数根据标志来执行的,这样可以做的非常灵活。 ...

恩,可以了,谢谢

出0入0汤圆

发表于 2013-5-1 19:35:58 | 显示全部楼层
额,main函数里那个 keyscan();不需要放到while(1){}里面执行么?

出0入0汤圆

 楼主| 发表于 2013-5-1 22:16:58 | 显示全部楼层
zjk 发表于 2013-5-1 19:35
额,main函数里那个 keyscan();不需要放到while(1){}里面执行么?

对,我后来该也在main里面加上了while

出0入0汤圆

 楼主| 发表于 2013-5-1 22:17:57 | 显示全部楼层
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar aa,i,temp,key;
void one();
void two ();
void three ();
void four ();
void delay (uint x)
{
        uint i,j;
                for( i=x; i>0; i-- )
                        for( j=110; j>0; j-- );
}
void keyscan()
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
        if(temp!=0x0f)
        {
                delay(10);
                temp=P1;
                temp=temp&P1;
                        if(temp!=0x0f)
                        {
                                delay(10);
                                temp=P1;
               
                                        switch( temp )
                                        {
                                                        case 0x77:
                                                        key=1;       
                                                        break;       
                                                               
                                                               
                                                                 case 0x7b:
                                                                key=2;
                                                                break;
                                                               
                                                               
                                                               
                                                                        case 0x7d:
                                                                        key=3;
                                                                    break;


                                                                                case 0x7e:
                                                                                key=4;
                                                                                break;
                                               

                                                                                                while(temp!=0x0f)
                                                                                                {
                                                                                                        temp=P1;
                                                                                                        temp=temp&P1;
                                                                                                }
                                                                                                while(1);
                                        }
                                  
                       
                                }
        }
}
void one ()
{
  P0=0;
}
void two ()
{       
            delay(75);
                P0=~P0;
}
void three ()
{    aa=0xfe;
         for(i=8;i>0;i--)
         {
                  P0=aa;
                aa=_crol_(aa,1);
                delay(100);
         }
         aa=0x7f;
         for(i=8;i>0;i--)
         {
                  P0=aa;
                 aa=_cror_(aa,1);
                 delay(100);
          }
}
void four ()
{
        aa=0xfe;
        for(i=4;i>0;i--)
        {
                        P0=aa;
                        aa=_crol_(aa,2);
                        delay(500);
        }
        aa=0x7f;
        for(i=4;i>0;i--)
        {
                        P0=aa;
                        aa=_cror_(aa,2);
                        delay(500);
        }
}
void main ()
{
while(1){
         keyscan();
         
         if(key==1)
         {
                 one();
         }
                 if(key==2)
                 {
                    two();
                 }
                         if(key==3)
                         {
                                 three();
                         }
                                 if(key==4)
                                 {
                                         four();
                                 }
          
        }
}
改成这样就可以了

出0入0汤圆

发表于 2013-5-2 08:20:34 | 显示全部楼层
很简单的问题哦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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