51单片机的矩阵按键扫描的设计C语言程序.pdf
/-函数声明,变量定义- #include #define KEY P1 /-变量声明- void program_SCANkey(); /程序扫描键盘 , 供主程序调用void delay(unsigned int N) ;/延时子程序,实现 (16*N+24)us 的延时bit judge_hitkey(); /判断是否有键按下, 有返回 1,没有返回 0 unsigned char scan_key(); /扫描键盘,返回键值 (高四位代表行,低四位代表列 ) 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 处理程序/.每个按键对应一个处理程序,这里/- - / 函数名称: program_SCANkey / 函数功能:程序扫描键盘,/ 有键按下完成按键处理,无键按下直接返回/- void program_SCANkey() unsigned char key_code; if(judge_hitkey() /判断是否有键按下 delay(1000); /延时 20ms左右,消除抖动干扰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;iN;i+); /- / 函数名称: system_init() / 函数功能:初始化设置/ 设定 INT0、INT1 及 T0、T1 的工作方式/- /* void system_init(void ) TMOD=0 x55; / 定时器 1 和定时器 0 工作在方式 1,的计数模式 TR0=1; /定时器 1 和定时器 0 开始计数 TR1=1; ET0=1; /定时器 1 和定时器 0 中断允许 ET1=1; IT1=0; /选择 INT0 和 INT1 为电平触发方式 IT0=0; EX0=1; /外部中断允许 EX1=0; EA=1; /系统中断允许 /- / 函数名称: INT0_intrupt / 函数功能:外部中断 0 处理程序/- void INT0_intrupt() interrupt 0 using 1 EA=0; /系统中断禁止 delay(1000); /键盘消抖动 if(INT_0=0) /判断是否干扰 /的确有健按下 while(INT_0=0);/等待键盘释放 delay(1000); /键盘消抖动 manage_key1(); EA=1; */ /- / 函数名称: judge_hitkey / 函数功能: / 判断是否有键按下,有返回1,没有返回 0 /- bit judge_hitkey() /判断是否有键按下, 有返回 1,没有返回 0 unsigned char scancode,keycode; scancode=0 xff; /P1.4P1.7输出全 1 全 1 则无键闭合KEY=scancode; keycode=KEY; /读 P1.0P1.3 的状态if(keycode=0 xff) return(0); /全 1 则无键闭合else return(1); /否则有键闭合 /- / 函数名称: scan_key / 函数功能: / 扫描键盘,返回键值 (高四位代表行,低四位代表列) /- unsigned char scan_key() /扫描键盘,返回键值 ( 高四位代表行,低四位代表列 ) unsigned char scancode,keycode; scancode=0 xef; /键盘扫描码,采用逐行扫描的方法 while(scancode!=0 xff) KEY=scancode; /输入扫描码,扫描 P1.4 对应的行 keycode=KEY; /读出数据,看是否在此行上的某列键盘被按下 if(keycode&0 x0f)!=0 x0f) break; /扫描到按下的键,则退出 scancode=(keycode1)|0 x0f; /否则,更新扫描码继续扫描 keycode=keycode; return(keycode); /- / 函数名称: key_manage / 入口参数: keycode 扫描键盘返回的键值 (高四位代表行,低四位代表列) / 函数功能:键盘散转/- void key_manage(unsigned char keycode) switch(keycode) case 0 x11:manage_key1();break; case 0 x12: manage_key2();break; case 0 x14: manage_key3();break; case 0 x18: manage_key4();break; case 0 x21:manage_key5();break; case 0 x22: manage_key6();break; case 0 x24: manage_key7();break; case 0 x28: manage_key8();break; case 0 x41:manage_key9();break; case 0 x42: manage_key10();break; case 0 x44: manage_key11();break; case 0 x48: manage_key12();break; case 0 x81:manage_key13();break; case 0 x82: manage_key14();break; case 0 x84: manage_key15();break; case 0 x88: manage_key16();break; / default: /- / 函数名称: manage_key1 / 函数功能:按键 1 处理程序/- void manage_key1(void) 程序扫描键盘,有键按下完成按键处理,无键按下直接返回。初始化设置:设定INT0、INT1 及 T0、T1的工作方式, 判断是否有键按下, 有返回 1,没有返回 0。扫描键盘,返回键值 ( 高四位代表行,低四位代表列)。