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

📄 intctrl.lst

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.20   INTCTRL                                                               07/16/2005 13:42:39 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE INTCTRL
OBJECT MODULE PLACED IN ..\output\IntCtrl.obj
COMPILER INVOKED BY: C:\Keil51\C51\BIN\C51.EXE ..\source\KERNEL\IntCtrl.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(..\output
                    -\IntCtrl.lst) OBJECT(..\output\IntCtrl.obj)

line level    source

   1          #include "reg52.h"
   2          #include "intrins.h"
   3          #include "..\..\inc\globedef.h"
   4          #include "..\..\inc\intctrl.h"
   5          #include "..\..\inc\keyproc.h"
   6          #include        "..\..\inc\tuner.h"
   7          
   8          /*====================================================
   9          外部中断1, 用来接收遥控信号,和Timer0配合使用
  10          ====================================================*/
  11          void RemoteInt(void) interrupt 2
  12          {
  13   1              WORD IRTimeCount;
  14   1              BYTE temp1,temp2;
  15   1              IRTimeCount = (WORD)Timer0_CntH*256+(WORD)Timer0_CntL;
  16   1              Timer0_CntH =0;
  17   1              Timer0_CntL = 0;
  18   1              Start_Timer0;
  19   1              switch(IrState)
  20   1              {
  21   2                      case  IR_READY:
  22   2                              IRDataTemp=0;
  23   2                              IRDataCount=0;
  24   2                              IrState=IR_HEAD;
  25   2                              break;
  26   2                      case  IR_HEAD:
  27   2                              if((IRTimeCount<IR_HEAD_MAX)&&(IRTimeCount>IR_HEAD_MIN))
  28   2                              {
  29   3                                      IRDataCount=0;
  30   3                                      IrState=IR_OFFCODE;
  31   3                                      IRDataTemp=0;
  32   3                                      RepCount = 0;
  33   3                                      Current_Remote_In = 0;
  34   3                              }
  35   2                              else if((IRTimeCount>IR_REP_MIN) && (IRTimeCount<IR_REP_MAX))
  36   2                              {
  37   3                                      //是重复信号
  38   3      #ifdef  IRRepEnable
  39   3                                      if(1 == Current_Remote_In)
  40   3                                      {               
  41   4                                              if( (Remote_value == 18)     //FM/AM 和AUTO_SCAN_KEY复用
  42   4                                                          || (Remote_value == 7)   //STEPR和FB复用

  43   4                                                          || (Remote_value == 8))  //STEPF和FF复用

  44   4                                              {
  45   5                                                      FMAM_PRESSED = 1;
  46   5                                                      RepCount++;
  47   5                                              }
  48   4                                              if( (Remote_value  == 19)                       //IR_KEY_TBL[2] = VOLUME_UP_KEY;
  49   4                                                 ||(Remote_value == 2)                        //IR_KEY_TBL[6] = VOLUME_DOWN_KEY;
  50   4                                                 ||(Remote_value == 12)                       //IR_KEY_TBL[5] = BASS_PLUS_KEY;
  51   4                                                 ||(Remote_value == 14))                      //IR_KEY_TBL[9] = CENTER_MINUS_KEY;
  52   4                                                 //||(Remote_value == 0x7) )          //IR_KEY_TBL[7] = CENTER_PLUS_KEY;
  53   4                                              {
  54   5                                                              //当遥控输入是以上按键时,才有重复功能                                  
C51 COMPILER V7.20   INTCTRL                                                               07/16/2005 13:42:39 PAGE 2   

  55   5                                                      RepCount++;     
  56   5                                                      if(RepCount > 3)
  57   5                                                              IR_KeyAct = 1;  //当重复计数值超过设定值时,重复有效
  58   5                                              }
  59   4                                      }
  60   3      #endif
  61   3                                      IrState = IR_READY;
  62   3                              }
  63   2                              else
  64   2                              {
  65   3                                      //是杂波
  66   3                                      IR_KeyAct = 0;
  67   3                                      IrState = IR_READY;
  68   3                                      Current_Remote_In = 0;
  69   3                              }
  70   2                              break;
  71   2                      case  IR_OFFCODE:
  72   2                              //地址码检测
  73   2                              IRDataTemp<<=1;
  74   2                              if(((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
  75   2                                      || ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
  76   2                              {
  77   3                                      IRDataCount++;
  78   3                                      if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
  79   3                                              IRDataTemp |= 0x1;//检测"1
  80   3                                      if(IRDataCount >= 16)
  81   3                                      {
  82   4                                              IRDataCount=0;
  83   4                                              if((IRDataTemp==IR_SYSTEM_CODE))
  84   4                                              {
  85   5                                                      //是正确的地址码
  86   5                                                      IrState=IR_ADDRESS;
  87   5                                                      IRDataTemp=0;   
  88   5                                                      
  89   5                                                      
  90   5                                              }
  91   4      
  92   4                                              else
  93   4                                              {
  94   5                                                      //错误的地址码
  95   5                                                      IR_KeyAct=0;
  96   5                                                      Current_Remote_In = 0;
  97   5                                                      IrState=IR_READY;
  98   5                                              }
  99   4                                      }
 100   3                              }
 101   2                              else
 102   2                              {
 103   3                                      //是杂波
 104   3                                      IR_KeyAct = 0;
 105   3                                      Current_Remote_In = 0;
 106   3                                      IrState = IR_READY;
 107   3                              }
 108   2                              break;
 109   2                      case  IR_ADDRESS:
 110   2                              //数据码检测
 111   2                              IRDataTemp>>=1;
 112   2                              if(((IRTimeCount < CODE_1_MAX)&&(IRTimeCount > CODE_1_MIN)) 
 113   2                                      || ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
 114   2                              {
 115   3                                      IRDataCount++;
 116   3      
C51 COMPILER V7.20   INTCTRL                                                               07/16/2005 13:42:39 PAGE 3   

 117   3                                      if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
 118   3                                              IRDataTemp |= 0x8000;   //检测到“1”
 119   3                              
 120   3                                  if(IRDataCount >= 16)
 121   3                                      {
 122   4                                              //判断检测到的数据码是否正确
 123   4                                              IRDataCount=0;
 124   4                                              temp1 = (BYTE)(IRDataTemp%256);
 125   4                                              temp2 = (BYTE)(IRDataTemp/256);
 126   4                                              temp2 = ~temp2;
 127   4                                              if(temp1 == temp2)
 128   4                                              {                                       
 129   5                                                      Remote_value = temp1;
 130   5                                                      if(Remote_value > 0x1f)
 131   5                                                              Remote_value -= 0x20;
 132   5                                                      Current_Remote_In = 1;
 133   5                                                      if( (Remote_value == 18)     //FM/AM 和AUTO_SCAN_KEY复用
 134   5                                                          || (Remote_value == 7)   //STEPR和FB复用

 135   5                                                          || (Remote_value == 8))  //STEPF和FF复用

 136   5                                                              FMAM_PRESSED = 1;
 137   5                                                      else
 138   5                                                              IR_KeyAct = 1;
 139   5                                              }
 140   4                                              IrState = IR_READY;
 141   4                                              IRDataCount = 0;
 142   4                                      }
 143   3                          }
 144   2                              else
 145   2                              {
 146   3                                          //无效键
 147   3                                              IR_KeyAct = 0;
 148   3                                              Current_Remote_In = 0;
 149   3                                              IrState = IR_READY;
 150   3                      
 151   3                              }
 152   2                              break;  
 153   2              }
 154   1      }
 155          
 156          /*======================================================
 157          外部中断0, 用来判断CS49326是否有message发送给主控MCU
 158          =======================================================*/
 159          void CS49326Int(void) interrupt 0// using 1
 160          {
 161   1              //read CS49326 unsolicited messages
 162   1      }
 163          
 164          /*================================================================
 165          Timer0中断用于遥控按键输入中断的计时
 166          ================================================================*/
 167          void TIMER0Int(void) interrupt INT_Timer0
 168          {
 169   1              Stop_Timer0;
 170   1              IrState = IR_READY;
 171   1              Timer0_CntH = 0;
 172   1              Timer0_CntL = 0;
 173   1              ET0 = 1;
 174   1      }
 175          /*===================================================================
 176          设置TIMER1为定时中断,每次中断时间为20ms,中断1ms后开始测试滚轮按键,
 177          VFD显示时间长度计时
 178          ===================================================================*/
C51 COMPILER V7.20   INTCTRL                                                               07/16/2005 13:42:39 PAGE 4   

 179          void TIMER1Int(void) interrupt INT_Timer1
 180          {
 181   1              Timer1_CntL = 0xE0;
 182   1              Timer1_CntH = 0xB1;
 183   1              Start_Timer1;
 184   1              /*
 185   1              if(Volume_Interval > 0)
 186   1              {
 187   1                      Volume_Interval++;
 188   1                      if(Volume_Interval > 60)
 189   1                              Volume_Interval = 0;
 190   1              }       
 191   1              */
 192   1              if(FMAM_PRESSED > 0)
 193   1              {

 194   2                      FMAM_PRESSED++;
 195   2                      //证明已经没有FM/AM按下,如果按下FMAM_PRESSED=1,
 196   2                      //按下经过120ms,(NEC最长为108ms) 
 197   2                      if(FMAM_PRESSED > 8) 
 198   2                      {                       
 199   3                              if(RepCount > 5)
 200   3                              {
 201   4                                      if(Remote_value == 18)//FMAM_KEY
 202   4                                              Remote_value = 28;//AUTO_SCAN_KEY
 203   4                                      else if(Remote_value == 7) //CHANNEL_SETPR_KEY
 204   4                                              Remote_value = 20;//CHANNEL_FB_KEY
 205   4                                      else if(Remote_value == 8) //CHANNEL_SETPF_KEY
 206   4                                              Remote_value = 21;//CHANNEL_FF_KEY
 207   4                                              
 208   4                              }                       
 209   3                              IR_KeyAct    = 1;
 210   3                              FMAM_PRESSED = 0;
 211   3                      }
 212   2                              
 213   2                      
 214   2              }
 215   1              if(TO_MAIN_DISPLAY > 0)
 216   1              {
 217   2                      TO_MAIN_DISPLAY--;
 218   2                      if((TO_MAIN_DISPLAY % 15) == 0)
 219   2                      {
 220   3                              if(FLASH_TEMP == 0)
 221   3                                      FLASH_TEMP = 1;
 222   3                              else
 223   3                                      FLASH_TEMP = 0;
 224   3                      }
 225   2              }
 226   1              
 227   1              
 228   1              if(Key_Timer >= 1)
 229   1              {
 230   2                      Key_Timer++;    
 231   2                              

⌨️ 快捷键说明

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