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

📄 test51.lst

📁 单片机键盘输入扫描方式以及防抖处理,此方法为普遍输入方法.
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TEST51
OBJECT MODULE PLACED IN test51.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE test51.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          ****************************************************************************************************
   3          *               沈阳市万柳塘路56号
   4          *       (c)著作权2005,世信汇诚电子版权所有
   5          *     世信汇诚电子的源代码是不公开, 属于世信汇诚电子的企业机密文件, 任何未经允许使用
   6          * 或发表的行为都是违法行,任何个人或组织尝试或者参与修改源代码的行为,都应尽早得到世信
   7          * 汇诚电子设计组的同意.
   8          *             
   9          * 版本号:1.0
  10          * 作  者:linan4526
  11          * 日  期:2005-05-08
  12          *---------------------------------------------------------------------------------------------------
  13          * 描  述:SXHC-I型MCU51实验
  14          ****************************************************************************************************
  15          */
  16          #include <test51.h>
  17          /**********************************************************************
  18          函数功能:       定时器中断函数(扫描键盘)(10ms 16位定时)
  19          入口参数:       无
  20          出口参数:       无
  21          ***********************************************************************/
  22          void Time0_Func() interrupt 1
  23          {
  24   1              TH0=(0xffff-9259)/256;
  25   1              TL0=(0xffff-9259)%256;
  26   1              Key_Scan();
  27   1              Disp_Func();
  28   1      }
  29          /**********************************************************************
  30          函数功能:       显示刷新函数
  31          入口参数:       无
  32          出口参数:       无
  33          ***********************************************************************/
  34          void Disp_Func(void)
  35          {
  36   1              P0=0xff;        /*清除显示*/
  37   1              P0=g_bpDisp[g_bCurrent_Local];/*显示段码*/
  38   1              if (g_bCurrent_Local)/*刷新DS2*/
  39   1              {
  40   2                      Setb_Func(DS1_CS);
  41   2                      Clr_Func(DS2_CS);
  42   2                      g_bCurrent_Local=0;
  43   2              }
  44   1              else/*刷新DS1*/
  45   1              {
  46   2                      Setb_Func(DS2_CS);
  47   2                      Clr_Func(DS1_CS);
  48   2                      g_bCurrent_Local=1;
  49   2              }
  50   1              P2=g_bP2_Io;/*更新P2口状态*/
  51   1      }
  52          /**********************************************************************
  53          函数功能:       清相应IO口函数(仅限中断服务函数使用)
  54          入口参数:       bPort:相应IO口
  55          出口参数:       无
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 2   

  56          ***********************************************************************/
  57          void Clr_Func(byte bPort)
  58          {
  59   1              bit btEa_Bak;
  60   1      
  61   1              btEa_Bak=EA;
  62   1              EA=0;
  63   1              bPort =~ bPort;
  64   1              g_bP2_Io &= bPort;
  65   1              EA=btEa_Bak;
  66   1      }
  67          /**********************************************************************
  68          函数功能:       置相应IO口函数(仅限中断服务函数使用)
  69          入口参数:       bPort:相应IO口
  70          出口参数:       无
  71          ***********************************************************************/
  72          void Setb_Func(byte bPort)
  73          {
  74   1              bit btEa_Bak;
  75   1      
  76   1              btEa_Bak=EA;
  77   1              EA=0;
  78   1              g_bP2_Io |= bPort;
  79   1              EA=btEa_Bak;
  80   1      }
  81          /**********************************************************************
  82          函数功能:       判断行列键是否有键函数
  83          入口参数:       无
  84          出口参数:       0/1     无键/有键
  85          ***********************************************************************/
  86          byte Key_Func(void)
  87          {
  88   1              byte bI;
  89   1      
  90   1              Clr_Func(KEY_OUT1);
  91   1              Clr_Func(KEY_OUT2);
  92   1              P2 = g_bP2_Io;
  93   1              bI=P2;
  94   1              if ((bI&KEY_IN1) && (bI&KEY_IN2))
  95   1                      return 0;
  96   1              else
  97   1                      return 1;
  98   1      }
  99          /**********************************************************************
 100          函数功能:       行列键盘扫描函数
 101          入口参数:       无
 102          出口参数:       0/1     无键/有键
 103          ***********************************************************************/
 104          void Key_Scan(void)
 105          {
 106   1              byte bK,bKey,bLine,bRow;
 107   1      
 108   1              if (Key_Func())
 109   1              {
 110   2                      if (g_btKey_Press || g_btKey_Flag)
 111   2                      {       /*键盘未抬起或键值未处理则不扫描键盘*/
 112   3                              return;
 113   3                      }
 114   2                      Setb_Func(KEY_OUT2);
 115   2                      for (bRow=0; bRow<2; bRow++)
 116   2                      {
 117   3                              if (bRow)
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 3   

 118   3                              {
 119   4                                      Setb_Func(KEY_OUT1);
 120   4                                      Clr_Func(KEY_OUT2);
 121   4                              }
 122   3                              P2=g_bP2_Io;
 123   3                              bK=P2;
 124   3                              bK &=(KEY_IN1 | KEY_IN2);
 125   3                              bK>>=2;
 126   3                              switch (bK)
 127   3                              {
 128   4                                      case    1:
 129   4                                                      bLine=0;
 130   4                                                      break;
 131   4                                      case    2:
 132   4                                                      bLine=1;
 133   4                                                      break;
 134   4                                      default :
 135   4                                                      bLine=0xff;
 136   4                                                      break;
 137   4                              }
 138   3                              if (bLine!=0xff)
 139   3                              {
 140   4                                      bKey=bLine+bRow*2;/*扫描到键值*/
 141   4                                      break;
 142   4                              }
 143   3                      }
 144   2                      if (g_bKey_Bak != bKey)/*为去抖而备份当前按键*/
 145   2                      {
 146   3                              g_bKey_Time=0;
 147   3                              g_bKey_Bak=bKey;
 148   3                      }
 149   2                      else
 150   2                      {
 151   3                              if (g_bKey_Time==2)/*去抖有效*/
 152   3                              {
 153   4                                      g_bKey=g_bKey_Bak;
 154   4                                      g_bKey_Bak=0xff;
 155   4                                      g_btKey_Press=1;
 156   4                                      g_btKey_Flag=1;
 157   4                                      Clr_Func(BELL_ON);
 158   4                              }
 159   3                              else/*去抖*/
 160   3                                      g_bKey_Time++;
 161   3                      }
 162   2              }
 163   1              else/*按键抬起*/
 164   1              {
 165   2                      g_btKey_Press=0;
 166   2                      Setb_Func(BELL_ON);
 167   2              }
 168   1      }
 169          /**********************************************************************
 170          函数功能:       扫描键盘函数
 171          入口参数:       bFlag:0/1       死等/不死等     
 172          出口参数:       0/1     无键值/有键值
 173          ***********************************************************************/
 174          byte Wait_Key(byte bFlag)
 175          {
 176   1              if (bFlag)
 177   1              {
 178   2                      if (g_btKey_Flag)
 179   2                      {
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 4   

 180   3                              g_btKey_Flag=0;
 181   3                              return 1;
 182   3                      }
 183   2                      else
 184   2                              return 0;
 185   2              }
 186   1              else
 187   1              {
 188   2                      while (!g_btKey_Flag);
 189   2                      g_btKey_Flag=0;
 190   2                      return 1;
 191   2              }
 192   1      }
 193          /**********************************************************************
 194          函数功能:       转换显示数据函数
 195          入口参数:       bDisp_Data      显示数据0~99
 196          出口参数:       无
 197          ***********************************************************************/
 198          void Hex_To_Disp(byte bDisp_Data)
 199          {
 200   1              byte bI,bJ,bpDisp[2];
 201   1      
 202   1              if (bDisp_Data<100)
 203   1              {
 204   2                      bI=Bin_Bcd_Func((dword)bDisp_Data,bpDisp);/*二进制转十进制*/
 205   2                      for (bJ=0; bJ<bI; bJ++)/*查找显示段码*/
 206   2                      {
 207   3                              bpDisp[bJ]=g_bpDisp_Seg[bpDisp[bJ]];
 208   3                      }
 209   2                      if (bI==1)
 210   2                      {       /*如果转换十进制结果为一位,则将此位移到个位*/
 211   3                              Right_Move(bpDisp,1,1,g_bpDisp_Seg[0]);
 212   3                      }
 213   2                      while (g_bCurrent_Local);/*等待上次数据显示完*/
 214   2                      ET0=0;
 215   2                      Init_Array_Func(2,g_bpDisp,0xff);
 216   2                      for ( bJ=0; bJ<2; bJ++)/*更新显示数据*/
 217   2                              g_bpDisp[bJ]=bpDisp[bJ];
 218   2                      ET0=1;
 219   2              }
 220   1      }
 221          /**********************************************************************
 222          函数功能:       上电初始化函数
 223          入口参数:       无
 224          出口参数:       无
 225          ***********************************************************************/
 226          void Power_Up(void)
 227          {
 228   1              TMOD = 0x01;/*Time0为16位*/
 229   1              TH0=(0xffff-9259)/256;
 230   1              TL0=(0xffff-9259)%256;
 231   1              IE=0x82;        /*开启定时器中断0*/
 232   1              TR0=1;
 233   1              g_bP2_Io=0xff;
 234   1              g_bKey_Bak=0xff;
 235   1      }
 236          /**********************************************************************
 237          函数功能:       主函数
 238          入口参数:       无
 239          出口参数:       无
 240          ***********************************************************************/
 241          void main()
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 5   

 242          {
 243   1              Power_Up();
 244   1              while (1)
 245   1              {
 246   2                      if (Wait_Key(0))
 247   2                      {
 248   3                              Hex_To_Disp(g_bKey);/*显示当前键值*/
 249   3                      }
 250   2              }
 251   1      }
 252          
C51 COMPILER V7.50   TEST51                                                                12/02/2007 23:53:05 PAGE 6   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION Time0_Func (BEGIN)
0000 C0E0              PUSH    ACC
0002 C0F0              PUSH    B
0004 C083              PUSH    DPH
0006 C082              PUSH    DPL
0008 C0D0              PUSH    PSW
000A 75D000            MOV     PSW,#00H
000D C000              PUSH    AR0
000F C001              PUSH    AR1
0011 C002              PUSH    AR2

⌨️ 快捷键说明

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