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

📄 跑马灯.c

📁 在51的P1口连接8个发光2级管
💻 C
字号:
#include<AT89X51.H>
//-----------------------函数声明, 变量定义---------------------
#define KEY P0
 
//----------------------变量声明----------------------------------

void program_SCANkey();       //程序扫描键盘,供主程序调用
void delay(unsigned int N);   //延时子程序,实现(16*N+24)us的延时
bit judge_hitkey();           //判断是否有键按下,有返回1,没有返回0
unsigned char scan_key();     //扫描键盘,返回键值(高4位代表行,低4位代表列)
void key_manage(unsigned char keycode);//键盘散转
void manage_key1(void);       //按键1处理程序
void manage_key2(void);       //按键2处理程序
void manage_key3(void);       //按键3处理程序
void manage_key4(void);       //按键4处理程序
void manage_key5(void); 
void manage_key6(void); 
void manage_key7(void); 
void manage_key8(void); 
void manage_key9(void); 
void manage_key10(void); 
void manage_key11(void); 
void manage_key12(void); 
void manage_key13(void); 
void manage_key14(void); 
void manage_key15(void); 
void manage_key16(void); 
//----------每个按键对应一个处理程序-----------------------------
//-----------------------------------------------
//函数名称:judge_hitkey
//函数功能:判断是否有键按下,有返回1,没有返回0
//-----------------------------------------------

bit judge_hitkey()          //判断是否有键按下,有返回1,没有返回0 
 {
   unsigned char scancode,keycode;
   scancode=0x0f;          //p2.0~p2.3输出全为1,全1则无键闭合
    KEY=scancode;
    keycode=KEY;          //读p2.0~p2.3的状态
    if(keycode==0x0f)
   return(0);             //全1则无键闭合
   else
   return(1);              //否则有键闭合
 }



//--------------------------------------------------------
//函数名称:scan_key
//函数功能:扫描键盘,返回键值(高4位代表行,低4位代表列)
//--------------------------------------------------------
unsigned char scan_key()
 {
   unsigned char scancode,keycode;
   scancode=0xef;     //键盘扫描码,采用逐行扫描的方法
   while(scancode!=0xff)
    {
       KEY=scancode;       //输入扫描码,扫描p2.4对应的行
       keycode=KEY;        //读出数据,看是否在此行上的某列键盘被按下
       if((keycode&0x0f)!=0x0f)
       break;
     scancode=(scancode<<1)|0x0f;//否则更新扫描码继续扫描
    }
  keycode=~keycode;
  return(keycode);
 }
//-----------------------------------------------------------



//函数名称:key_manage
//入口参数:keycode 扫描键盘返回的键值(高4位代表行,低4位代表列)
//函数功能:键盘散转
//--------------------------------------------------------------

void key_manage(unsigned char keycode)
   { 
     switch(keycode)
     {
    
      case 0x11:manage_key1(); break;    
      case 0x12:manage_key2(); break;  
      case 0x14:manage_key3(); break; 
      case 0x18:manage_key4(); break;  
      case 0x21:manage_key5(); break;  
      case 0x22:manage_key6(); break;  
      case 0x24:manage_key7(); break;  
      case 0x28:manage_key8(); break;    
      case 0x41:manage_key9(); break;  
      case 0x42:manage_key10(); break;  
      case 0x44:manage_key11(); break;  
      case 0x48:manage_key12(); break;  
      case 0x81:manage_key13(); break;  
      case 0x82:manage_key14(); break;  
      case 0x84:manage_key15(); break;  
      case 0x88:manage_key16(); break;  
     
      //default:
     }
  }
//--------------------------------------------------------
//函数名称:manage_key
//函数功能:按键处理程序     
//--------------------------------------------------------
 void manage_key1( void)    
   {
   
      P2=0X66;                 

    }

 void manage_key2( void)    
   {
    
   }
    
void manage_key3( void)     
   {
    

    }
void manage_key4( void)    
   {
    

    }
void manage_key5( void)
   {
   

    }
void manage_key6( void)
   {
    

    }
void manage_key7( void)
   {
    

    }
void manage_key8( void)
   {
     

    }
void manage_key9( void)
   {
    

    }
void manage_key10( void)
   {

    }
void manage_key11( void)
   {
    

    }
void manage_key12( void)
   {
   

    }
void manage_key13( void)
   {
    
    }
void manage_key14( void)
   {
  

    }
void manage_key15( void)
   {
    

    }

void manage_key16( void)
   {
    

    }




//---------------------------------------------------------------
//函数名称:program_SCANkey
//函数功能:程序扫描键盘
//   有键按下完成按键处理,无键按下直接返回
//----------------------------------------------------------------

void program_SCANkey()
  {
    unsigned char key_code;
   if(judge_hitkey())        //判断是否有键按下
  {
   delay(10);             //延时20us左右,消除抖动干扰
    if(judge_hitkey())      //判断是否有效按键
      {
       key_code=scan_key();
      while(judge_hitkey());//等待按键释放
    key_manage(key_code);    //键盘扫描、键盘散转、按键处理
     }
  }
 }

//-------------------------------------------------------------
//函数名称:delay
//入口参数:N
//函数功能:延时子程序,实现(16*N+24)us的延时
//系统采用11.0592MHz的时钟,延时满足要求,其他情况需要改动
//-------------------------------------------------------------

void delay(unsigned int N)
  {
   int i;
   for(i=0;i<N;i++) ;
  }


//函数名称:main
//入口参数:
//--------------------------------------------------------------
 void main()
 {  P2=0X00;
   while(1)
    {
     program_SCANkey();
    }
 }

⌨️ 快捷键说明

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