首页>>科技 >>内容

矩阵键盘扫描原理汇编,矩阵键盘扫描程序

发布时间:2024-01-10 15:44:11编辑:温柔的背包来源:

矩阵键盘扫描原理汇编,矩阵键盘扫描程序

很多朋友对矩阵键盘扫描原理汇编,矩阵键盘扫描程序不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

矩阵键盘扫描仪

按键扫描(行反转) //-------------------------------- --------- - ------------------------------------------------- - ------//函数名称:program_SCANkey //函数功能:程序扫描键盘, //有按键按下则完成按键处理,无按键则直接返回//------- --- ---------------------------------------------------------- --- ----------------------------------------void program_SCANkey(){unsigned char关键代码; if(judge_hitkey ()) //判断是否有按键按下{delay(1000); //延时20ms左右,消除抖动干扰if(judge_hitkey()) //判断是否按下有效按键{ key_code=scan_key(); //获取键值while(judge_hitkey()); //等待按键释放{ } key_manage(key_code); //键盘扫描、键盘旋转、按键处理}}}

//------------------------------------------------ -------------------------------------------------- //函数名称:judge_hitkey //函数功能: //判断是否有按键按下,有则返回1,否则返回0 //列判断,也可以用行判断。 //------------------------------------------------ -------------------------------------------------- bit Judge_hitkey() //判断是否有按键按下,有则返回1,否则返回0{unsigned char scancode,keycode;scancode=0x0F; //开始设置P1.0~P1.3输出全1(初始值) 表示没有按键关闭KEY=scancode;keycode=KEY; //读取P1.0~P1.3的真实状态,判断是否有按键按下if(keycode==0x0F)return(0); //如果全为1,则没有按键关闭else return(1); //否则有键关闭}//-------------------------------- ------ -------------------------------------------------------- ------ ------------//函数名:scan_key//函数功能://扫描键盘,返回键值(高四位代表行,低四位代表列) //描述:scancode 扫描码,keycode 键值,keycode_line 行,keycode_row 列//流程:先扫描该行,确认该行的按键被按下。然后扫描该列,判断哪一列的键被按下,从而确定哪个键被按下。 //------------------------------------------------ -------------------------------------------------- unsigned char scan_key() //扫描键盘并返回键值(高四位代表行,低四位代表列){ unsigned char scancode,keycode,keycode_line,keycode_row;scancode=0xF0; //列置低,行置高KEY=scancode; //输入扫描码,扫描行keycode_line=KEY; //KEY的值为连接键盘的P的状态值。如果没有按下任何按钮,KEY 的值为0xF0。如果按下按钮,KEY 的值不是0xF0。扫描码=0x0F; //将列设置为高,将行设置为低KEY=scancode; //输入扫描码,扫描该列keycode_row=KEY ; //KEY的值为连接键盘的P的状态值。如果没有按下任何按钮,则KEY 的值为0x0F。如果按下按钮,KEY 的值不是0x0F keycode=((keycode_line0xF0)|(keycode_row0x0F));返回(键码);}

2、按键扫描(逐行扫描)

//------------------------------------------------ -------------------------------------------------- //函数名称:kbscan键盘扫描子程序//函数功能:判断是否有按键按下,返回按键值,如果没有则返回0 //p1的高四位为列,低四位为P1行。 7 P1。 6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0//Column 4 Column 3 Column 2 Column 1 Row 4 Row 3 Row 2 Row 1//流程:先根据按键判断是否有按键按下到column,如果不返回0,则逐行扫描确定key所在行,再确定key所在列//最终确定key。 //------------------------------------------------ -------------------------------------------------- uchar kbscan(void){uchar sccode,重新编码;P1=0xf0; //设置所有行为低电平,行扫描,列线输入(此时) if((P10xf0)!=0xf0) //判断是否有按键按下(读取该列的真实状态,如果有在第4列按下一个键,P1的值将变为0111 0000),然后执行{delays(); //延时去抖(10ms) if((( P10xf0)!=0xf0) //再次检查列内是否有干扰信号,如果没有则向下执行{ sccode=0xFE; //逐行扫描初始值(即先扫描第一行) while((sccode0x10)!=0 ) //行扫描完成时(即4行都扫描完毕) sccode为1110 1111 停止while程序{ P1=sccode; //输出行扫描码if ((P10xf0)!=0xf0) //这一行有key下一个(即P1(真实状态)高四位不全为1) { recode=(P10xf0)|0x0f; //列return(sccoderecode); //返回行列} else //扫描到的行没有按键按扫描下一行,直到4行全部扫描完毕,此时sccode值是1110 1111. 退出while 程序{ sccode=(sccode1)|0x01;//行扫描码左移一位} } }} else{ return 0 ; //没有按键按下,返回0}}

-------------------------------------------------- -------------------------------------------------- -----------------------

#include 'global.c'void SystemInit();void Timer1Init();void KickDog();void delay();unsigned int Judge_key();unsigned int scan_key();unsigned char numkey=0;无符号字符DATX,DATY;

主要的(){

系统初始化(); //系统初始化MCRA=MCRA0x80FF; //IOPB0-6设置为IO口模式PBDATDIR=0xBFC2; //所有LED=0,并设置IOPB6为输入端口Timer1Init(); //定时器初始化asm('CLRC INTM'); while(1) { //KeyLed();if(judge_key()==1)numkey++; }}

void SystemInit(){asm('SETC INTM'); asm(' CLRC SXM '); asm(' CLRC CNF '); asm(' CLRC OVM '); SCSR1=0x83FE; /*系统时钟CLKOUT=20*2=40M */WDCR=0x006F; KickDog(); IFR=0xFFFF; IMR=0x0002; }

无效Timer1Init(){

EVAIMRA=0x0080; //定时器1周期中断使能EVAIFRA=0xFFFF; //清除中断标志GPTCONA=0x0000;T1PR=2500; //定时器1初始值,定时0.4us*2500=1msT1CNT=0;T1CON=0x144E; //增加模式,TPS系数40M/16=2.5M,T1启用}

无符号整数Judge_key(){

MCRC=MCRC0x81FF; //PFDATDIR=PFDATDIR|0x0070;PFDATDIR=PFDATDIR0x8FFF; //设置456输入高电平

PFDATDIR=PFDATDIR0xFFF1;PFDATDIR=PFDATDIR|0x0E00; //设置123输出低电平

if((PFDATDIR0x0070)==0x0070) 返回(0);否则返回(1);}

无符号整数scan_key(){if(judge_key()==1) 延迟();if(judge_key()==1) { MCRC=MCRC0x81FF; //PFDATDIR=PFDATDIR|0x0070; PFDATDIR=PFDATDIR0x8FFF; //设置456输入高电平PFDATDIR=PFDATDIR0xFFF1; PFDATDIR=PFDATDIR|0x0E00; //设置123输出低电平延时(); numkey=((PFDATDIR0x0070)|(PFDATDIR0x000E));

//延迟(); //MCRC=MCRC0x81FF; //

PFDATDIR=PFDATDIR0xFF8F; //设置456输出低电平PFDATDIR=PFDATDIR|0xE000;

PFDATDIR=PFDATDIR|0x000E; //设置123输入高电平PFDATDIR=PFDATDIR0xF1FF;

延迟(); //numkey=((PFDATDIR0x0070)|(PFDATDIR0x000E)); numkey=numkey|(PFDATDIR0x000E);返回(numkey); }

}

void c_int2() {

if(PIVR!=0x27) { asm(' CLRC INTM ');返回; }扫描键();

EVAIFRA=EVAIFRA0x80;asm('CLRC INTM');}

无效延迟(){int i;for(i=0;i10000;i++);

}

void KickDog() {WDKEY=0x5555;WDKEY=0xAAAA;}

结束

更多矩阵键盘知识请访问http://www.elecfans.com/zhuanti/20111025226587.html

以上知识分享希望能够帮助到大家!