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

📄 de.lst

📁 本程序是按键程序,通过RS232串口显示按键值,按键扫描是用定时器T0来实现的,特别适合初学者学习学习
💻 LST
📖 第 1 页 / 共 2 页
字号:
 161   2                      break;
 162   2                      case 0x88:              return 16;//0x10
 163   2                      break;
 164   2                      default:                return 0x00;
 165   2                      break;
 166   2              }
 167   1      }
 168          
 169          /***********************************************************
 170          
 171          * 函数名称:getkey();
 172          
 173          * 函数功能描述:按键的扫描判断与取值  
 174                    
C51 COMPILER V8.04   DE                                                                    11/02/2007 13:39:47 PAGE 4   

 175          * 输入参数:none;
 176          *
 177          * 返回数据:none;
 178          *
 179          * 注    意:none;
 180                        
 181          **********************************************************/
 182          unsigned char getkey(void)
 183          {
 184   1        uchar h;                            //行扫描值
 185   1        uchar l;                        //列扫描值
 186   1        SFRPAGE=CONFIG_PAGE ;
 187   1        P5=0xF0;                            //P5.0~P5.3       发全0.准备读列的状态
 188   1       if((P5&0xF0)!=0xF0)              //如果P5.4~P5.7不全为1,可能有键按下
 189   1       {
 190   2         delay(100);  
 191   2         delay(100);                           //延时去抖动
 192   2      
 193   2         if((P5&0xF0) != 0xF0)         //重读高4位,如果还是不全为1,有按键按下
 194   2         {
 195   3           h=0xFE;                     //P5.0置0,开始行扫描
 196   3       while((h&0x10)!=0xF0)           //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
 197   3          {                                             //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
 198   4             P5=h;
 199   4             delay(100);                       
 200   4      
 201   4            if((P5&0xF0) != 0xF0)          //如果P5.4~P5.7不全为1,可能有键按下
 202   4              {
 203   5                l=((P5&0xF0)|0x0F);    //保留P5口高四位.低四位变为1,作为列值
 204   5                        delay(100);
 205   5                return ((~h)+(~l));    //按键值=行扫描值+列扫描值                        
 206   5                       
 207   5              }
 208   4            else                                      //如果该行无键按下,行扫描值左移.扫描下一行
 209   4              
 210   4                    h=(h<<1)|0x01;        //这样做保证每一次就只有一位为"0"
 211   4                  
 212   4          }
 213   3        }
 214   2       }
 215   1        return 0;                    //无键按下,返回0
 216   1        } 
 217          
 218          /*************************************************
 219          * 函数名称:keyup();
 220          
 221          * 函数功能描述:按键的释放;
 222                    
 223          * 输入参数:none;
 224          *
 225          * 返回数据:none;
 226          *
 227          * 注    意: none;
 228          **************************************************/
 229          
 230            
 231          uchar keyup(void)
 232          {
 233   1              unsigned char val=0xff;
 234   1              while(1)
 235   1              {
 236   2                      val=getkey();
C51 COMPILER V8.04   DE                                                                    11/02/2007 13:39:47 PAGE 5   

 237   2                      if(val != 0)
 238   2                      break;
 239   2              }
 240   1              while(1)
 241   1              {
 242   2                      if(val!=getkey())break;
 243   2              }
 244   1              return val;
 245   1      } 
 246          
 247           /**************************************************
 248           * TIMER0  
 249          
 250           *定时器0;
 251           ***************************************************/
 252          
 253          timer0() interrupt 1
 254          { 
 255   1        TH0=0xfa;
 256   1        TL0=0x00;                   //1ms的初始值
 257   1        time_1ms_flag=1;
 258   1        time_10ms++;
 259   1       if(time_10ms == 10)
 260   1        {
 261   2           time_50ms++;
 262   2               time_10ms=0;
 263   2               time_10ms_flag=1;
 264   2        }
 265   1      if(time_50ms == 5)           //设置50ms扫描一次键盘
 266   1       {
 267   2           time_100ms++;
 268   2           time_50ms = 0;
 269   2           time_50ms_flag = 1;          
 270   2           key=keyup();               //按键扫描
 271   2         if( key!= 0 )         //表示有按键按下      
 272   2          {
 273   3            send_flag = 1;
 274   3           }
 275   2        }       
 276   1       if(time_100ms == 2)
 277   1         {time_500ms++;time_100ms=0;time_100ms_flag=1;}
 278   1       if(time_500ms == 5)
 279   1         {time_1s++;time_500ms=0;time_500ms_flag=1;}
 280   1       if(time_1s == 2)
 281   1         {time_60s++;time_1s=0;time_1s_flag=1;}
 282   1       if(time_60s == 60)
 283   1         {time_60s=0;time_60s_flag=1;}                 
 284   1      }
 285          
 286          /************************************************************************
 287          
 288          //主循环程序
 289          
 290          *LED灯点亮表示等待按键.
 291          
 292          ************************************************************************/
 293          
 294          void main()
 295          {
 296   1        Init_Device(); 
 297   1        SFRPAGE=UART0_PAGE;
 298   1        P3_5=1;
C51 COMPILER V8.04   DE                                                                    11/02/2007 13:39:47 PAGE 6   

 299   1        P2_4=1;
 300   1        P2_5=1;
 301   1        P2_6=1;       
 302   1        while(1)
 303   1         {  
 304   2           if(send_flag== 1)     //表示有按键值,下一步的动作就是送串口显示
 305   2            { 
 306   3                   rs232_send_size=0;
 307   3                   temp=KeySPI(key); 
 308   3                       SFRPAGE=UART0_PAGE;
 309   3                       TI0=1;
 310   3                       send_flag= 0;
 311   3                       
 312   3                 }    
 313   2              }       
 314   1      }
 315          /***********************************************************************************/
 316          // 文件结束
 317          /***********************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    677    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     58    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      8    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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