《单片机课程设计__简易计算器.doc》由会员分享,可在线阅读,更多相关《单片机课程设计__简易计算器.doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、44键盘的简易计算器和LED数码管的显示1、设计要求1、设计一个十六个按键的矩阵式计算器的模拟系统。2、该系统具有加减乘除等功能。3、用Proteus 7仿真工作的全过程。4、有相应的实物图5、掌握44矩阵式键盘程序识别原理,掌握44矩阵式键盘按键的设计方法。2、设计思想2.1 硬件设计思想用单片机的并行口P1连接44矩阵键盘,并以单片机的P1.0P1.7各管脚作输入线,以单片机的P2.0P2.7和P0.0P0.7各管脚作输出线,在数码管上显示每个按键 “09”的序号。键盘中对应按键的序号排列如图()所示。数字0、1、2、3接X0;4、5、6、7接X1;8、9、10、11接X2;12、13、1
2、4、15接X3。即16个按钮空接,即十六个键一端低电平,另一端接高电平;当按下任意一个按钮时显示对应数字。该系统可以实现四则运算,当分别按下2个数字,再按任意一个功能键即可实现相应的运算。2.2 软件设计思想整个程序可以实现十进制内的加减乘除,其中包含了延时子程序(去抖动),加法、减法、除法、乘法等子程序。(1)按键的识别判断键盘上有无按键闭合,先判断行线X0X3输出低电平“0”,然后判断列线Y0Y3的状态,若为全1,即列线全为高电平,说明键盘上没有按键闭合,若Y0Y3不全为1,说明有键按下。(2)消抖处理当判断有键按下后,需要进行消除抖动,这里使用了软件方法即程序中采用时间延时0.5秒,待信
3、号稳定后再判别键盘的状态,若有键按下,则再进行键号的计算。(3)判别键号先判断行线X0X3是否有输出低电平“0”,若有键按下,则相应的列线也为低电平“0”,例如行线X1输出为低电平“0”,且列线Y2为低电平,即X1与Y2相交的键被按下,进行键号=行号*4+列号 的计算。(4)显示结果显示器接高电频,左边显示器接P0,右边显示接P2,当按下一个数字时右显示器显示相应的数字,按第2个数字时左边显示器显示相应数字;当进行除法运算时,除的的数据要看接口P0.7接高还是低电频,低电频则结果为几点几,为高电频则几十几。其它运算直接看数据即可。3、电路原理与电路图3.1 电路原理单片机最小系统。一个AT89
4、C51单片机做为控制电路,运用其P0、P1口来控制数码管和键盘,通过P0和P2口来显示键值(09)。通过P1口来控制键盘。3.2 电路原理图图3.1 电路原理图4、流程图与算法描述4.1 流程图开始P1口高四位置一扫描键盘按下键?消除抖动计算键入的值十进制?送入P2口显示第一次键入的值消除抖动计算键入的值十进制?送入A按下键?NNYYYYNN送入P0显示第二次送入的值再按一次键加法?减法?乘法?除法?结束NNYYYYN把结果送入P0,P2口,P0存十位,P2存个位图4.1 主程序流程图开始R7送100R5送10R6送250R5减一为0?R6减一为0?R7减一为0?返回NNNYYY 图4.2 延
5、时子程序流程图 Y4.2 算法描述1、设计一个延时子程序,延时0.5s。本程序通过两个DJNZ的语句来实现。延时程序的代码段如下:DELAY: MOV R7,#100D DEL1: MOV R6,#250D DEL2: MOV R5,#10D DJNZ R5,$ DJNZ R6,DEL2 DJNZ R7,DEL1 RET2、仅实现十进制的加减乘除运算。CJNE是判断两个数是否相等,不想等则转移,代码段如下:M0: CJNE R1,#10D,M1 LJMP L1 M1: CJNE R1,#11D,M2 LJMP L1 M2: CJNE R1,#12D,M3 LJMP L1 M3: CJNE R1
6、,#13D,M4 LJMP L1 M4: CJNE R1,#14D,M5 LJMP L1 M5: CJNE R1,#15D,M6 LJMP L1 M6: RET ;返回重新按入新的键号5、仿真结果5.1 仿真结果1、加法仿真如下:(1加2)图5.1 加法仿真结果图图5.2 加法仿真结果图2、减法仿真如下:(2减3) 图5.3 减法仿真结果图 图5.4 减法仿真结果图3、乘法仿真如下:(3乘以2) 图5.5 乘法仿真结果图申图5.6 乘法仿真结果图4、除法仿真如下:(2除以4)图5.7 除法仿真结果图图5.8 除法仿真结果图5、复位仿真如下: 图5.10复位仿真结果图 6、源程序ORG 0000
7、H L1:LCALL SCAN MOV 40H,32H ;将键号保存在40H MOV R1,40H ;暂存在R1 LCALL M0 LCALL XY1 MOV P0,#0FFH ; 使P0口置1 LCALL SCAN MOV 41H,32H ;将键号保存在41H MOV R1,41H ;暂存在R1 LCALL M0 LCALL XY2 L2:LCALL SCAN MOV 42H,32H MOV R7,42H CJNE R7,#10D,L3 ;是否进行加法运算 MOV A,40H ADD A,41H MOV B,#10D DIV AB ; 商存在A中即十位,余数存在B中即个位 CJNE A,#0
8、0H,L8 ; 判断十位是否为0,不为0跳转 MOV P0,#0FFH ;置1不显示 LJMP L9 L8:MOV 32H,A LCALL XY2 ;商非0则调用显示十位数L9:MOV 32H,B LCALL XY1 ;调用显示个位数 LJMP L1 l3:CJNE R7,#11,l4 ;是否进行减法运算 MOV A,40H SUBB A,41H ;结果存在A JB ACC.7,N1 ;判断正负 MOV 32H,A MOV P0,#0FFH LCALL XY1 ;减法结果为正 LJMP L1 N1:MOV P0,#0BFH ;显示负号 MOV A,41H SUBB A,40H ADD A,#1
9、D MOV 32H,A LCALL XY1 ;显示结果 LJMP L1 l4:CJNE R7,#12,l5 ;是否进行乘法运算 MOV A,40H MOV B,41H MUL AB ;结果存在A中 MOV 50H,A MOV B,#10D DIV AB ;商存在A中即十位,余数存在B中即个位 CJNE A,#00H,L10 ;判断十位是否为0,不为0跳转 MOV P0,#0FFH ; 置1不显示 LJMP L11 L10:MOV 32H,A LCALL XY2 L11:MOV 32H,B LCALL XY1 LJMP L1 l5:CJNE R7,#13,l6 ;是否进行除法运算 MOV A,4
10、0H MOV B,41H DIV AB ;X/Y 除法 MOV R6,B CJNE R6,#00H,L12 ; 判断余数是否为0,不为0跳转 MOV P0,#0FFH ; 置1不显示十位 MOV 32H,A LCALL XY1 LJMP L13 L12:MOV 32H,A LCALL XY2 ; p0显示小数点前的数 CLR P0.7 ;有小数点 MOV A,B MOV B,#10D MUL AB ;余数的十倍 MOV B,41H DIV AB ;余数的十倍再除以除数 MOV 32H,A ;结果保留小数点后一位 LCALL XY1 ;p2显示小数点后的数L13:LJMP L1 l6:CJNE
11、R7,#0D,L7 CJNE R7,#1D,L7 ;屏蔽十进制,实现加减乘除 CJNE R7,#2D,L7 CJNE R7,#3D,L7 CJNE R7,#4D,L7 CJNE R7,#5D,L7 CJNE R7,#6D,L7 CJNE R7,#7D,L7 CJNE R7,#8D,L7 CJNE R7,#9D,L7 CJNE R7,#14D,L7 ;屏蔽E、F CJNE R7,#15D,L7 L7:LJMP L2 SCAN:MOV P1,#0F0H ; P1口高4位置1 JNB P1.4,Y0 ;判断Y0列是否有键按下,有就跳至Y0 JNB P1.5,Y1 JNB P1.6,Y2 JNB P1
12、.7,Y3 LJMP SCAN ;无键按下继续扫描 Y0:MOV 31H,#00H ; 列线Y0有键按下 MOV P1,#0FEH JNB P1.4,X0 ;判断X0横是否有键按下 MOV P1,#0FDH JNB P1.4,X1 ;判断X1横是否有键按下 MOV P1,#0FBH JNB P1.4,X2 ;判断X2横是否有键按下 MOV P1,#0F7H JNB P1.4,X3 ;判断X3横是否有键按下 LJMP Y0 ;返回继续判断 Y1:MOV 31H,#01H ;列线Y1有键按下 MOV P1,#0FEH JNB P1.5,X0 MOV P1,#0FDH JNB P1.5,X1 MOV
13、 P1,#0FBH JNB P1.5,X2 MOV P1,#0F7H JNB P1.5,X3 LJMP Y1 Y2:MOV 31H,#02H ;列线Y2有键按下 MOV P1,#0FEH JNB P1.6,X0 MOV P1,#0FDH JNB P1.6,X1 MOV P1,#0FBH JNB P1.6,X2 MOV P1,#0F7H JNB P1.6,X3 LJMP Y2 Y3:MOV 31H,#03H ;列线Y3有键按下 MOV P1,#0FEH JNB P1.7,X0 MOV P1,#0FDH JNB P1.7,X1 MOV P1,#0FBH JNB P1.7,X2 MOV P1,#0F
14、7H JNB P1.7,X3 LJMP Y3 X0:MOV 30H,#00H ;行线X0有键按下 LCALL DELAY ;0.5s延时消除抖动 LJMP JS ;跳转键值计算程序 X1:MOV 30H,#01H ;行线X1有键按下 LCALL DELAY LJMP JS X2:MOV 30H,#02H ;行线X2有键按下 LCALL DELAY LJMP JS X3:MOV 30H,#03H ;行线X3键按下 LCALL DELAY LJMP JS JS: MOV A,30H ;计算键入的值 MOV B,#04H MUL AB ADD A,31H MOV 32H,A RET XY1:MOV
15、A,32H MOV DPTR,#TAB MOVC A,A+DPTR MOV P2,A ;显示第一次按入的键号及结果的个位 RET XY2:MOV A,32H MOV DPTR,#TAB MOVC A,A+DPTR MOV P0,A ;显示第二次按入的键号及结果的十位 RET DELAY:MOV R7,#100D ;延时0.5s子程序DEL1:MOV R6,#250D DEL2:MOV R5,#10D DJNZR5,$ DJNZ R6,DEL2 DJNZ R7,DEL1 RET M0:CJNE R1,#10D,M1 ;仅实现十进制的加减乘除运算 LJMP L1 M1:CJNE R1,#11D,M2 LJMP L1 M2:CJNE R1,#12D,M3 LJMP L1 M3:CJNE R1,#13D,M4 LJMP L1 M4:CJNE R1,#14D,M5 LJMP L1 M5:CJNE R1,#15D,M6 LJMP L1 M6:RET ;返回重新按入新的键号TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H DB 0C6H,0A1H,86H,8EH,0FFH END
限制150内