导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→初学者:救命!!!很着急呀!![warmsmile]

 *第7911篇: 初学者:救命!!!很着急呀!!

  
楼 主:warmsmile 2003年1月24日10:49
 初学者:救命!!!很着急呀!!
各位DX,我编了一个键盘程序,很简单的,可是不知道为什么总是无法正确执行。请大家帮
帮忙。以下是我的程序:
               #include <reg51.h>
               unsigned char oldkey1, KeyVal=0,Key1,Key2,Key3,oldKey1, oldKey2,
       oldKey3,ch;
               unsigned int cn;
                unsigned char buffer[3];
                unsigner char table[41]={,,,,,}//显示数据
       void wait_free(uchar k){  
            uchar  t;             
           t=k;                 
            while(--t);
       } 
                
           void ShowKeyInit(void) {
           uchar i;
           scan=0;
           KeyVal=0;
           Key1=0;
       Key2=0;
       Key3=0;
           oldKey1=1;
           oldKey2=1;
       oldKey3=1;
           cn=0;
       ch=0;
           KeyCounter=0;                //键值计数器
          for(i=0;i<3;i++) 
              buffer[i]=i*10;            //显示缓冲区清
            fKey=0;
           }   
                     
          void HardwareInit(void){           
                 TMOD=0x21;               // 初始化Timer0模式1,Timer1模式2,
                 TH0=-TH0_HIGH;           //for 2.5ms,3个数码管
                 TL0=-TL0_LOW;    
                 ET0=1;
                 TR0=1;
                 EA=1;
         } 
         
                  
          #pragma disable
          void display(uint ShowData){
                uint tmp;                           // 计算显示结果
             uchar i;
             tmp=ShowData;
             for(i=0;i<3;i++){
                buffer[i]=(uchar)(tmp)%10+10*i;
                tmp=tmp/10;  
             }  
             if(buffer[2]==20){                          //屏蔽无效0
                buffer[2]=41;
                if(buffer[1]==10)
                   buffer[1]=41;
              }    
        }
        void KeyAlter(void){
              if(KeyVal==ADDKEY){               //增量键处理
                     cn++;
                      if(cn>=56)
                      cn=2;
               }       
              else {                              //减量键处理
                     cn--;
                      if(cn==0)
                          cn=56;    
                }
           display(cn);
              return ;
         
      }  
         void keyManage(void){
      
              if(fKey){       
                    fKey=0;                            
                  KeyAlter(); 
                  wait_free(50000);
                  wait_free(50000);
                  wait_free(50000);
              }
               else{            
                KeyCounter=0;
                KeyMark=0;
           }
        }
              
      timerint () interrupt 1 using 3{
           TR0=0; 
           TL0=-TL0_LOW;                    
           TH0=-TH0_HIGH;                   // for 2.5ms
           TR0=1;                                  
                     
           
data_display=0x00;                            //                                
                                                                 
         
                data_display=table[ch];   //依次显示6位                   
           
              
           if(scan==1&&!fKey) {            // 扫描减量键
              ScanAir=air_signal;
              Key1=(~ScanAir)&0x10;
              if(Key1==0x10&&oldKey1){ 
                   fKey=1; 
                   KeyVal=CUTKEY; 
              }
            } 
           
           if(scan==0&&!fKey){             // 扫描增量键
               ScanAir=air_signal;
               Key2=(~ScanAir)&0x10;
               if(Key2==0x10&&oldKey2){ 
                      fKey=1; 
                      KeyVal=ADDKEY; 
               }
           }
            oldKey1=Key1;
            oldKey2=Key2;
           scan++;
           if(scan==3)
              scan=0;
     }
                                                  
              int main(void){                                 
                   ShowKeyInit();
                   HardwareInit();
                   while(1){
                        keyManage();  
               }   
              return 0;
              }
        这是按键和显示程序,键盘扫描和显示都放在中断里,LED 是动态显示。我的原意
是要按键一次,做加1或减1,可是我在执行程序的时候总是按一次键,加或者减的得数总是
不一样,也就是加或者减的数据总是大于1,而且很不规则,我不知道问题出现在哪里,请
给位指点。
  
2楼:白莲 2003年1月24日10:57
 looking....
"unsigned char oldkey1, KeyVal=0,Key1,Key2,Key3,oldKey1, oldKey2, oldKey3,ch;"
我只看到这,其中有俩个“oldbey1"问题是不是在这。。。。。。。
               
  
3楼:tm1300 2003年1月24日16:19
 仔细检查
你的程序可读性有些问题,呵呵。不过,你应该注意的问题是,如果中断采样和驱动LED,
要注意:严格控制中断过程的时间(51未必能控制);另外,当你响应第一次中断的时候,
处理过程中可能又产生新的中断,这是一定要避免的。
另外,定义两次oldKey1,是没多少问题的。
  
4楼:a12345678 2003年1月24日21:13
 结构不好

>>>>>>对该主题发表你的看法

本主题贴数4,分页: [第1页]


[上一篇主题]:C51编程:52单片机高端RAM

[下一篇主题]:硬件:关于crc算法的硬件