编号毕业论文(设计)(届本科)论文题目:学院:专业:班级:作者姓名:指导教师:职称:完成日期:年月日目录摘要..................................................................3前言..................................................................3课题设计................................................................3中断法行列式键盘摘要行列式键盘是它的按键均是每只键单独接在一根I/O口线上,构成所谓的独立式键盘。其特点是电路简单,易于编程,但占用的I/O口线较多,当需要较多按键时可能产生I/O资源紧张问题。为此,可采用行列式键盘方案,具体做法是,将I/O口分为行线和列线,按键设置在跨接行线和列线的交点上,列线通过上拉电阻接正电源。中断是指计算机在运行当前程序的过程中,若遇到紧急或突发事件,可以暂停当前程序的运行,转向处理该突发事件,处理完后再从当前程序的间断出接着运行。中断法行列式键盘是用中断法来控制行列式键盘的工作状态,即只有在有键按下时,才执行键盘扫描程序;如果无键按下,则将键盘视为不存在,从而降低CPU处理信息的时间,大大提高了CPU处理信息的效率和资源的利用率。同时,采用中断法能够实现分时操作、实时处理和故障处理。前言中断法行列式键盘主要用于电子产品,比如:计算机等,主要运用中断法控制按键,在有键按下时,才执行键盘扫描程序;如果无键按下,则将键盘视为不存在。这样,既减轻了CPU处理信息的压力,也节省了资源的利用率,符合电子信息行业的要求,从而在电子信息行业广泛应用。目前,电子信息行业发展迅速,前景广阔,该项技术在当前及未来的发展过程中有很大的市场,在电子信息行业的发展中能够起到推到作用。在本设计中,采用的是4x4的行列式键盘。课题设计1、硬件设计本课题中采用了一组7407集成电路芯片作为行线与单片机I/O口的驱动元件,采用4x4的行列式键盘作为输入设备。硬件原理设计图如下:2、软件设计行列式键盘的检测课采用软件扫描查询法进行,即根据按键压下前后,所在行线的端口电平是否出现反转,判断有无按键闭合动作。2.1分析需要考虑以下三个关键环节:2.1.1、获得按键的键值——检测流程图2.1.2、获得闭合按键的键模——查表比对2.1.3、获得闭合按键的字模——查表思路2.2键盘列扫描由P3口循环输出一键扫描码,使键盘的4行电平全为1,4列电平轮流有一列为0其余为1.2.3按键判断利用(P3&0x0f)算法判断有无按键按下。若行线低4位不全为1,说明至少有一个按键压下,此时P3口的读入值必为根据按键闭合规律确定的键模数组值之一。key_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};2.4键值计算若将行列式键盘中自左至右,自上至下的排列顺序号作为其键值,则通过逐一对比P3读入值与键模数组,可求得闭合按键的键值j,即for(j=0;j16;j++){if(key_buf[j]==P3)returnj;}Return-1;机械式按键在按下和释放瞬间常常因弹簧开关的变形而产生电压波动现象,按键抖动会造成按键状态不易确定的问题,需要采用措施消除抖动影响。当检测到有键按下时,先延时10ms,然后再检测按键的状态,若仍是闭合状态,则认为真正有键按下。当需要检测到按键释放时,也需做同样的处理。3、汇编程序如下:ORG0000HLJMPMAINORG0003HAJMPINTORG0030HMAIN:MOVP0,#0FFH;程序启动时灯灭MOVP1,#0F0HSETBTCON.0;外部中断为下降沿触发MOVIE,#81H;外部中断开中断SJMP$INT:CLREA;进入中断服务程序PUSHPSWLCALLDELAYLCALLKSJNZSAOMIAOLJMPINT0RSAOMIAO:MOVDPTR,#TAB;ACALLK1;调用键盘扫描程序MOVCA,@A+DPTR;查表后将值送入累加器MOVP0,A;在P0口显示键盘值K1:MOVR2,#0EFH;将扫描值送入R2暂存MOVR4,#00H;R4用于存放列值,并将00H暂存K3:MOVP1,R2;L6:JBP1^0,L1;P1^0等于1跳转到L1MOVA,#00H;将第一行的行值00H送入ACCAJMPLK;跳转到键值处理程序L1:JBP1^1,L2;P1.1等于1跳转到L2MOVA,#04H;将第二行的行值送入ACCAJMPLK;跳转到键值理程序进行键值处理L2:JBP1^2,L3;P1.2等于1跳转到L3MOVA,#08H;将第三行的行值送入ACCAJMPLK;跳转到键值处理程序L3:JBP1^3,NEXT;P1.3等于1跳转到NEXT处MOVA,#0cH;将第四行的行值送入ACCLK:ADDA,R4;行值与列值相加后的键值送入APUSHACC;将A中的值送入堆栈暂存K4:LCALLDELAY;调用延时去抖动程序LCALLKS;调用按键检测程序JNZK4;按键没有松开继续返回检测POPACC;将堆栈的值送入ACCRETNEXT:INCR4;将列值加一MOVA,R2;JNBACC.7,INT0R;未扫描出键值退出中断RLA;扫描未完成将A中的值右移一位进行下一列的扫描MOVR2,A;将ACC的值送入R2暂存AJMPK3;跳转到K3继续KS:MOVP1,#0FH;将P1口高四位置0低四位置1MOVA,P1;读P1口XRLA,#0FH;将A中的值与0FH相异或RETDELAY:;10ms延时去抖动子程序2*FA*2=10msMOVR5,#02HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETINT0R:POPPSWMOVP1,#0F0HSETBTCON.0;外部中断为下降沿触发MOVIE,#81H;外部中断开中断RETITAB:;采用共阳极LED显示器DB0C0H;0DB0F9H;1DB0A4H;2DB0B0H;3DB099H;4DB092H;5DB082H;6DB0F8H;7DB080H;8DB090H;9DB088H;ADB083H;bDB0C6H;CDB0A1H;dDB086H;EDB08EH;FEND