搜索
bottom↓
回复: 13

求论坛高手相助~一个关于KEIL里面的switch语句

[复制链接]

出0入0汤圆

发表于 2012-2-5 17:04:57 | 显示全部楼层 |阅读模式
其实就是一个按键的switch语句来的:如下,我只是在那个数码管的地方,换成了其它语句,出现的现象是:switch会不断地执行,比如,我在第一个case中有一个c++;的语句,只要我按了第一个键,那个c就会加到最大值,怎么这样呢,而且,我也不断地修改那个key的值,结果还是一样,只要你按了一个键,它就会在那个case语句里,重复地执行里面的语句。
void delay(uint i);
void main()
{
        uchar key;
        P2=0x00;        
        while(1)
        {
                key=keyscan();  //调用键盘扫描,
                switch(key)
                {
                          case 0x7e:P0=dofly[0];break;//0
                          case 0x7d:P0=dofly[1];break;//1
                          case 0x7b:P0=dofly[2];break;//2
                          case 0x77:P0=dofly[3];break;//3
                          case 0xbe:P0=dofly[4];break;//4
                          case 0xbd:P0=dofly[5];break;//5
                          case 0xbb:P0=dofly[6];break;//6
                          case 0xb7:P0=dofly[7];break;//7
                          case 0xde:P0=dofly[8];break;//8
                          case 0xdd:P0=dofly[9];break;//9
                          case 0xdb:P0=dofly[10];break;//a
                          case 0xd7:P0=dofly[11];break;//b
                          case 0xee:P0=dofly[12];break;//c
                          case 0xed:P0=dofly[13];break;//d
                          case 0xeb:P0=dofly[14];break;//e
                          case 0xe7:P0=dofly[15];break;//f
                }

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-2-5 17:47:35 | 显示全部楼层
按照你说的现象,应该是你的key值没有变化,你可以检查一下你调用键盘扫描后的key值是否有变化.

出0入0汤圆

 楼主| 发表于 2012-2-5 17:58:38 | 显示全部楼层
回复【1楼】zyyn123  
-----------------------------------------------------------------------
那个键值我也测试过。就让程序跑到后面的时候将它用其它值覆盖掉,没用~~~因为,它每扫一次,如果没有按下键,就会返回一个值,一个不是键的,所以
它里面已经包含了有修改KEY值的了。
unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
{
        unsigned char cord_h,cord_l;//行列值中间变量
        P3=0x0f;            //行线输出全为0
         cord_h=P3&0x0f;     //读入列线值
        if(cord_h!=0x0f)    //先检测有无按键按下
        {
                  delay(200);        //去抖
                  if(cord_h!=0x0f)
                  {
                           cord_h=P3&0x0f;  //读入列线值
                            P3=cord_h|0xf0;  //输出当前列线值
                           cord_l=P3&0xf0;  //读入行线值
                            return(cord_h+cord_l);//键盘最后组合码值
                   }
          }return(0xff);   
}
void delay(unsigned int i)
{
        while(i--);
我在百度上找到答案,有些网友说是程序跑飞了,我就觉得怪了,跑飞那也不会重复啊~~

出0入0汤圆

发表于 2012-2-5 18:10:48 | 显示全部楼层
程序跑飞的可能性不大,否则不会一直在switch循环的。检测一下从keyscan返回的key的值是否正确。
还有 LZ是否定义过 uchar,否则key不一定是unsigned char 格式,引起数值错误

出0入0汤圆

 楼主| 发表于 2012-2-5 18:25:19 | 显示全部楼层
回复【3楼】dragonflag  
-----------------------------------------------------------------------

嗯,我定义的都是unsigned char的,我觉得更郁闷的是,当我将那个:a++;放到其它case中时,a的值增加又正常哦!而有些又不正常,我玩单片机还没遇到过这么邪门的事情~~我彻底没辙了

出0入0汤圆

发表于 2012-2-5 20:00:58 | 显示全部楼层
回复【2楼】20114016039
-----------------------------------------------------------------------
试试下面的键盘扫描函数
unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
{
  unsigned char cord_h,cord_l;//行列值中间变量
  P3=0x0f;            //行线输出全为0
cord_h=P3&0x0f;     //读入列线值
  if(cord_h!=0x0f)    //先检测有无按键按下
  {
   delay(200);        //去抖
    P3=0x0f;            
   cord_h=P3&0x0f;
   if(cord_h!=0x0f)
   {  
     P3=cord_h|0xf0;  //输出当前列线值
    cord_l=P3&0xf0;  //读入行线值
     return(cord_h+cord_l);//键盘最后组合码值
    }
   }return(0xff);     
}

出0入0汤圆

 楼主| 发表于 2012-2-5 20:20:15 | 显示全部楼层
回复【6楼】xixia  
-----------------------------------------------------------------------

键盘扫描的原理都是一样的~结果还是一样,呵呵~~谢谢你哈!

出0入0汤圆

 楼主| 发表于 2012-2-5 20:39:24 | 显示全部楼层
哇~~解决啦~~高兴死了!
是里面有一些函数在作怪!由于这是工程项目,不方便贴出来!!所以有时候要慢慢去调试,不管是什么问题~~祝大家龙年快乐!

出0入0汤圆

发表于 2012-2-5 20:41:30 | 显示全部楼层
楼主,你再看一下,你的键盘扫描程序的逻辑运算是不是有点问题呀,那个cord_l的值有变化吗?

出0入0汤圆

 楼主| 发表于 2012-2-5 20:45:57 | 显示全部楼层
回复【9楼】zyyn123  
-----------------------------------------------------------------------

cord_l是读出行的值,呵呵,怎么会没有变化呢!如果你是按下去的,你的那个引脚是不会受软件影响的,是外加低电压,是会变化的!
问题,已经找到了~是里面有些函数在作怪呢,没办法,程序大了,找错误还真不容易

出0入0汤圆

发表于 2012-2-6 08:50:36 | 显示全部楼层
我觉得还是用示波器 卡比较好

出0入0汤圆

发表于 2012-2-16 22:45:05 | 显示全部楼层
switch语句里最好不要用++或者—— 很可能会飞掉

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-27 00:13

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

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