⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.lst

📁 电话机的经典高效键盘扫描
💻 LST
📖 第 1 页 / 共 2 页
字号:
 226   3                                              switch(ch){
 227   4                                                         case 0x48: chTest = 'W';break;
 228   4                                                         case 0x28: chTest = '3';break;
 229   4                                                         case 0x18: chTest = '7';break;
 230   4                                                         case 0x0C: chTest = '*';break;
 231   4                                                         case 0x0A: chTest = '#';break;
 232   4                                                         default:break;       
 233   4                                                            }
 234   3                                               break;  }
 235   2                       case 0X6E:{ P1_4=1;delay(100);ch=P1;
 236   3                                              switch(ch){
 237   4                                                         case 0x50: chTest = 'X';break;
 238   4                                                         case 0x30: chTest = '4';break;
 239   4                                                         case 0x18: chTest = 'F';break;
 240   4                                                         case 0x14: chTest = 'M';break;
 241   4                                                         case 0x12: chTest = 'R';break;
C51 COMPILER V8.15   TEST                                                                  10/28/2008 11:00:32 PAGE 5   

 242   4                                                         default:break;       
 243   4                                                            } 
 244   3                                               break; }
 245   2                       case 0X5E: {P1_5=1;delay(100);ch=P1;
 246   3                                              switch(ch){
 247   4                                                         case 0x60: chTest = 'F';break;
 248   4                                                         case 0x30: chTest = 'F';break;
 249   4                                                         case 0x28: chTest = 'H';break;
 250   4                                                         case 0x24: chTest = 'I';break;
 251   4                                                         case 0x22: chTest = 'F';break;
 252   4                                                         default:break;       
 253   4                                                            } 
 254   3                                               break;}
 255   2                       case 0X3E:{ P1_6=1;delay(100);ch=P1; 
 256   3                                              switch(ch){
 257   4                                                         case 0x60: chTest = 'K';break;
 258   4                                                         case 0x50: chTest = 'L';break;
 259   4                                                         case 0x48: chTest = 'F';break;
 260   4                                                         case 0x44: chTest = 'F';break;
 261   4                                                         case 0x42: chTest = 'N';break;
 262   4                                                         default:break;
 263   4                                                            } 
 264   3                                               break; }        
 265   2              }        
 266   1      //      P1M0=p1m0;
 267   1      //      P1M1=0X00;
 268   1      //      delay(1000);  //must need 按键反应调试这个,delay 2ms
 269   1      //      ch=P1;
 270   1              P1M0=0x00;      //将P1口都置成双向口  这两句位置必须放这里,放scan里也会死机
 271   1              P1 = 0XFF;       //为下次中断作准备,放这里能确保P1     的1到6口置高
 272   1              if(ch!=0x02&&ch!=0x04&&ch!=0x08&&ch!=0x10&&ch!=0x20&&ch!=0x40)     //有键按下  
 273   1              {  
 274   2                      key_test = chTest ;
 275   2              }        
 276   1      
 277   1      }
 278          
 279          uchar scan(void)           //键盘扫描
 280          {
 281   1                       
 282   1                       key_test = 0;
 283   1               port(0X7C); 
 284   1                       port(0X7A); 
 285   1                       port(0X76); 
 286   1                       port(0X6E);
 287   1                       port(0X5E);
 288   1                       port(0X3E);    
 289   1                       return key_test; 
 290   1      }
 291          void clk_down(void)
 292          {
 293   1          P2_0=1;      
 294   1              P2_0=0;
 295   1      }
 296          void clk_up(void)
 297          {        
 298   1              P2_0=1;
 299   1      }
 300          
 301          void dial_all_num(void)
 302          {
 303   1              uchar n;
C51 COMPILER V8.15   TEST                                                                  10/28/2008 11:00:32 PAGE 6   

 304   1              
 305   1                for(n=0;n<SumNum;n++)
 306   1                {
 307   2                              dial( dialNum[n]);      //产生DTMF波形,但会一直存在,不会自动中止
 308   2                              delay(10000);   //有一定的延时,需要
 309   2                              dial_pause();            //dtmf波形中止
 310   2                        
 311   2                }     
 312   1      }
 313          
 314          void dial(uchar dial_num){
 315   1               P1_7=0;         //CE
 316   1               clk_up();
 317   1               switch(dial_num){
 318   2                     case '1':temp =0X01;dial_dtmf();break;   
 319   2                         case '2':temp =0X02;dial_dtmf();break;
 320   2                         case '3':temp =0X03;dial_dtmf();break;       
 321   2                         case '4':temp =0X04;dial_dtmf();break;
 322   2                         case '5':temp =0X05;dial_dtmf();break;
 323   2                         case '6':temp =0X06;dial_dtmf();break;
 324   2                         case '7':temp =0X07;dial_dtmf();break;
 325   2                         case '8':temp =0X08;dial_dtmf();break;
 326   2                         case '9':temp =0X09;dial_dtmf();break;       
 327   2                         case '0':temp =0X0A;dial_dtmf();break;
 328   2                         case '*':temp =0X0B;dial_dtmf();break;
 329   2                         case '#':temp =0X0C;dial_dtmf();break;
 330   2                         case 'A':temp =0X0D;dial_dtmf();break;       
 331   2                         case 'B':temp =0X0E;dial_dtmf();break;
 332   2                         case 'C':temp =0X0F;dial_dtmf();break;       
 333   2                         case 'D':temp =0X00;dial_dtmf();break;
 334   2                         default:     temp =0XFF;dial_dtmf();break;   
 335   2               }
 336   1      }
 337          
 338          void dial_dtmf(void){
 339   1              
 340   1              uchar TEMP;
 341   1              for(i=0;i<5;i++){
 342   2                      TEMP = temp & 0X01;
 343   2                      if(TEMP == 0X01){
 344   3                              switch(i){      
 345   4                               case 0:temp_0 =1;break;        
 346   4                           case 1:temp_1 =1;break;
 347   4                           case 2:temp_2 =1;break;
 348   4                           case 3:temp_3 =1;break;
 349   4                               case 4:temp_4 =1;break;        
 350   4                          }
 351   3                      } else {
 352   3                         switch(i){   
 353   4                               case 0:temp_0 =0;break;        
 354   4                           case 1:temp_1 =0;break;
 355   4                           case 2:temp_2 =0;break;
 356   4                           case 3:temp_3 =0;break;
 357   4                               case 4:temp_4 =0;break;        
 358   4                          }
 359   3                      }
 360   2                      temp = temp >> 1;
 361   2              }
 362   1              for(i=0;i<10;i++) {      //        缩短或延长所拨号码的时间间隔
 363   2                                       P2_1=temp_0;                                                                                                                                   ;
 364   2                                       clk_down();
 365   2                                       P2_1=temp_0;
C51 COMPILER V8.15   TEST                                                                  10/28/2008 11:00:32 PAGE 7   

 366   2                               P2_1=temp_1;
 367   2                                       clk_down();
 368   2                                       P2_1=temp_1;
 369   2                                       P2_1=temp_2;
 370   2                                       clk_down();
 371   2                                       P2_1=temp_2;
 372   2                                       P2_1=temp_3;
 373   2                                       clk_down();
 374   2                                       P2_1=temp_3;   
 375   2                                       P2_1=temp_4;
 376   2                                       clk_down();
 377   2                                       P2_1=temp_4;
 378   2                                       }
 379   1                                       clk_up();
 380   1                                       delay(100000);//缩短或延长拨号按键音
 381   1      }
 382          
 383          void dial_pause(void)           //中止DTMF波形
 384          {        for(i=0;i<10;i++) {
 385   2                P2_1=1;                                                                                                                                       ;
 386   2                clk_down();
 387   2                P2_1=1;                                                                                                                       
 388   2            P2_1=1;
 389   2                clk_down();
 390   2                P2_1=1;
 391   2                P2_1=1;
 392   2                clk_down();
 393   2                P2_1=1;
 394   2                P2_1=1;
 395   2                clk_down();
 396   2                P2_1=1;       
 397   2                P2_1=1;
 398   2                clk_down();
 399   2                P2_1=1;
 400   2                }
 401   1                clk_up();
 402   1                P1_7=1;       //CE                     
 403   1               delay(100000);
 404   1      }
 405          
 406          
 407          
 408          void main(void)
 409          {  
 410   1          init_serialcomm();
 411   1              init_interruptcomm();
 412   1          FREE_HAND=0;   //置低,前级电路运放
 413   1          PSTN_CIN=0;
 414   1          MAN_CIN=0;  
 415   1                
 416   1              P3M0=0X98;                //下面3句测试SM8200  P3M0=0X98;
 417   1              P3M1=0X00;              //P3_7,P3_4,P3_3为输入,P3_5I/O
 418   1              P3_5=0;         
 419   1      
 420   1              P1 = 0XFF;   //为响应中断作准备
 421   1              P2M0=0X10;        //P2_4及HOOK_OFF_IN为高阻输入
 422   1              P2M1=0X00;
 423   1      
 424   1         while(1)
 425   1              {
 426   2              
 427   2                      if(HOOK_OFF_IN==0){                             //0下1上
C51 COMPILER V8.15   TEST                                                                  10/28/2008 11:00:32 PAGE 8   

 428   3                              delay(4000000000);      
 429   3                              if(HOOK_OFF_IN==1){ send_char_com('I');  }               //话机弹起
 430   3                      }                
 431   2                      if(HOOK_OFF_IN==1){ 
 432   3                              
 433   3                              delay(4000000000);      
 434   3                              if(HOOK_OFF_IN==0){ send_char_com('H');}//话机按下
 435   3                      }  
 436   2              
 437   2               // scan();
 438   2              }  
 439   1                       
 440   1                
 441   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1247    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     28       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -