;4X4按键实现计算器功能;当按0-9时显示数值;当按A-F时将其除以10;如商为0就是0-9数字输入;如商为1就是+,-,*,/,=;跟据余数转到相应的功能处;因为8位数最取值为255;可扩展到16位或32位; ok;硬件连接POUT EQU P2KPIN EQU P1PDIG1 EQU P3.0V AL DATA 30HKID DATA 31HKTMP DATA 32HPDIG EQU P3NO EQU 4 ;N位要显示的数;内部使用的变量DIG DATA 33H;DID DATA 34HKFH DATA 35HDA T1 DATA 36HDA T2 DATA 37HBUF DATA 38HMTM EQU 1000MTH EQU HIGH(65536-MTM) MTL EQU LOW(65536-MTM)MSYS BIT 2FH.0KEFL BIT 20H.0;**************************;主调度程序;每1MS中断一次,所有程序都在期间执行;主程序调度标志位:MSYS;************************** ORG 0000HSJMP MAINORG 0BHSJMP MTM0ORG 30HMAIN:ACALL MINITMLP:JNB MSYS,$CLR MSYSACALL KEYSACALL DISPSJMP MLPMINIT:;用户变量初始化CLR MSYSMOV R0,#30HMOV R2,#16CLR AMILP:MOV @R0,AINC R0DJNZ R2,MILPMOV DIG,#0FEHCLR KEFL;系统变量初始化,并开启定时器0 MOV SP,#60HMOV IE,#82HMOV TMOD,#01HMOV TH0,#MTHMOV TL0,#MTLSETB TR0RET;定时器0中断程序,置系统标志为1 MTM0:MOV TH0,#MTHMOV TL0,#MTLSETB MSYSRETI;************************;显示功能程序;****************DISP:MOV PDIG,#0FFHMOV A,#BUFADD A,DIDMOV R0,AMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRCPL AMOV POUT,AMOV A,DIGMOV PDIG,ARR AMOV DIG,AINC DIDMOV A,DIDCJNE A,#NO,DSEXTMOV DID,#0MOV DIG,#07FH DSEXT: RET;************************;*************************;按键扫描程序;;模块应用变量;硬件连接端口:KPIN;返回按键值:V AL;按键处理应用功能程序:KEYPFUN ;;***********************;内部使用变量定义:KID=0,KTMP=0 ;********************** KEYS:MOV DPTR,#KJMPMOV A,KIDRL AJMP @A+DPTRKJMP:AJMP KEYENAJMP KEYDELAJMP KEYSCANAJMP KEYUPAJMP KEYFUNMOV KID,#0RETKS: MOV KPIN,#0FHNOPNOPMOV A,KPINANL A,#0FHXRL A,#0FHRETKEYEN:ACALL KSJZ KENEXTMOV KTMP,#0INC KIDKENEXT: RET KEYDEL:INC KTMPMOV A,KTMPCJNE A,#30,KDEXTMOV KTMP,#0INC KIDKDEXT: RET;******************************* ;KPIN: D7 - D0 =0EFH; D7 D6 D5 D4 ; D0 3 2 1 0; D1 7 6 5 4; D2 B A 9 8; D3 F E D CKEYSCAN:ACALL KSJZ KSCEXTMOV R2,#0EFHMOV R3,#0KS1:MOV KPIN,R2NOPNOPJB KPIN.0,KSL1MOV A,#0SJMP KVALKSL1:JB KPIN.1,KSL2MOV A,#4SJMP KVALKSL2:JB KPIN.2,KSL3MOV A,#8SJMP KVALKSL3:JB KPIN.3,KS2MOV A,#12KV AL:ADD A,R3MOV V AL,AINC KIDRETKSCEXT:MOV KID,#0RETKS2:MOV A,R2JNB ACC.7,KSCEXTRL AINC R3MOV R2,ASJMP KS1KEYUP:ACALL KSJNZ KUPEXTINC KIDKUPEXT: RET;*************************; KEYFUN:MOV KID,#0MOV A,V ALMOV B,#10DIV ABJZ KNUMMOV A,BRL AMOV DPTR,#KFUNKFUN:AJMP KAFUNAJMP KBFUNAJMP KCFUNAJMP KDFUNAJMP KEFUNAJMP KFFUNMOV V AL,#0RETKNUM:MOV R0,#BUFMOV R2,#4 KNLP:MOV A,@R0MOV R4,AMOV A,BMOV @R0,AINC R0MOV A,@R0MOV B,AMOV A,R4MOV @R0,AINC R0DJNZ R2,KNLPSETB KEFLRETDTOH:MOV R1,#BUFMOV R2,#3MOV R5,#0MOV R4,#1 DHLP:MOV A,@R1MOV B,R4MUL ABADD A,R5MOV R5,AMOV A,R4MOV B,#10MUL ABMOV R4,AINC R1DJNZ R2,DHLPRETKAFUN:MOV KFH,#1 CLBUF:ACALL DTOHMOV R0,#BUFMOV R2,#3CLR ACLBUF1:MOV @R0,A INC R0DJNZ R2,CLBUF1CLR KEFLRETKBFUN:MOV KFH,#2SJMP CLBUFKCFUN:MOV KFH,#3SJMP CLBUFKDFUN:MOV KFH,#4SJMP CLBUF KEFUN:MOV R0,#35HMOV R6,#9CLR AKELP:MOV @R0,AINC R0DJNZ R6,KELPCLR KEFLRETKFFUN:JNB KEFL,KFEXTCLR KEFLACALL DTOHMOV DAT2,R5ACALL CLRBUFMOV A,KFHRL AMOV DPTR,#KEQUJMP @A+DPTR KEQU:AJMP KNULLAJMP KADDAJMP KSUBAJMP KMULAJMP KDIVMOV KFH,#0 KFEXT: RET KNULL:NOPRETHTOD:MOV R0,#BUF+2MOV B,#100DIV ABMOV @R0,ADEC R0MOV A,BMOV B,#10DIV ABMOV @R0,ADEC R0MOV A,BMOV @R0,ARETKADD:MOV A,DA T1ADD A,DA T2MOV DAT1,AACALL HTODRETKSUB:MOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFACALL HTODRETCLRBUF:MOV R0,#BUFMOV R2,#3CLR ACLB:MOV @R0,AINC R0DJNZ R2,CLBRETKMUL:MOV A,DA T1MOV B,DA T2MUL ABCLR CSUBB A,#255JC CLRBUFACALL HTODRETKDIV:MOV A,DA T2JZ CLRBUFMOV A,DA T1CLR CSUBB A,DAT2JC CLRBUFMOV A,DA T1MOV B,DA T2DIV ABACALL HTODRET;******************************TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFHEND。