⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pljsj.asm

📁 一个简单的频率计设计的源程序
💻 ASM
字号:
ORG 0000H
     LJMP MAIN
     ORG 000BH
     LJMP ZDZD
MAIN:MOV SP,#60H
     MOV 30H,#0FDH  ;
     MOV 31H,#0FDH  ;
     MOV 32H,#0FDH  ;
     MOV 33H,#0FDH  ;  
     LCALL XS4      ;
     LCALL XS4      ;
     LCALL XS4      ;
     LCALL XS4      ;以上程序为开机自检程序
     CLR A
     MOV 30H,A
     MOV 31H,A
     MOV 32H,A
     MOV 33H,A   ;所有缓存清零
     MOV TMOD,#51H	;置T1为计数方式,T0为定时方式
     MOV TCON,#02H
     MOV TL1,#00H
     MOV TH1,#00H	 ;置T1初值
     MOV TL0,#3CH
     MOV TH0,#0B0H	;置T0初值
     MOV IP,#02H	;置T0为高优先级中断
     MOV IE,#82H	;开T0中断和总中断
     SETB TR1
     SETB TR0	 	;开启T0和T1
     MOV R4,#20
LDIR:LCALL XSXS
	 SJMP LDIR	;调用显示程序并等待中断

		 ;分离数字子程序
FLFL:MOV R0,#30H	;置千位BCD码间址
 	   MOV A,30H	;置被除数
 	   MOV B,31H	;
 	   MOV R6,#03H	;置除数1000=03E8H
 	   MOV R5,#0E8H	;
 	   LCALL SUM	;除以1000,千位商存30H,余数存A B
 	   MOV R6,#0	;置除数100
 	   MOV R5,#100	;
 	   INC R0	;指向百位商间址(31H)
 	   LCALL SUM	;除以100,百位商存31H,作余数存B,(A=0)
 	   MOV A,#10	;置除数10
 	   XCH A,B	;
 	   DIV AB	;除以10
 	   INC R0	;指向十位商间址32H
 	   MOV @R0,A	;十位商存32H
 	   XCH A,B	;读个位数
 	   INC R0	;指向个位间址(33H)
 	   MOV @R0,A	;个位存33H
 	   RET

 	   ;16位除法子程序
SUM: MOV R7,#0	;商寄存器清零
SLP:  CLR C	;CY清零
 	   XCH A,B	;被除数低8位入A;被除数高8位入B
 	   SUBB A,R5	;被除数低8位减除数低8位
 	   XCH A,B	;低8位差入B,被除数高8位入A
 	   SUBB A,R6	;被除数高8位减除数高8位
 	   INC R7	;商预加1
       JNC SLP	;够减,转再减
 	   DEC R7	;不够减,商复原
 	   XCH A,B	;低8位差入A,高8位差入B
 	   ADD A,R5	;低8位差加减(除)数低8位等于被减(除)数低8位,入A
 	   XCH A,B	;被减(被除)数低8位入B,高8位差入A
 	   ADDC A,R6	;高8位差加减数(除数)高8位等于被减(被除)数高8位
 	   XCH A,R7	;被减(被除)数高8位入R7,商入A
 	   MOV @R0,A	;商存@R0
      XCH A,R7	; 被减(被除)数高8位入A
 	   RET	;返回

 	   ;转换显示字段码子程序
ZHZH:MOV DPTR,#TAB	;置共阳字段码表首址
     MOV R0,#30H	;置显示数据区首址
CGLP:MOV A,@R0  ;取显示数字
     MOVC A,@A+DPTR ;读相应显示字段码
     MOV @R0,A  ;指向下一位显示数字
 	   INC R0 ;判5个显示数字转换完否?未完继续
 	   CJNE R0,#35H,CGLP  ;转换完毕,结束
 	   RET  ;
TAB: DB 0EDH,088H,0B5H,0B9H,0D8H ;字段码表
 	   DB 79H,7DH,0A8H,0FDH,0F9H

 	   ;显示子程序
;---------------- 判0消隐部分 -----------------------
XSXS:CLR A  ;
     MOV A,30H  ;先判断千位字段码是否为0
     CJNE A,#0C0H,XS4 ;千位不为0,就从这位开显
     MOV A,31H ;千位为0,就判断百位
     CJNE A,#0C0H,XS3 ;百位不为0,就从这位开显
     MOV A,32H ;百位为0,就判断十位
     CJNE A,#0C0H,XS2 ;十位不为0,就从这位开显
     AJMP XS1 ;十位为0,不管个位是什么,都要显示

;-----------------动态显示部分------------------------
XS4: MOV P0,30H ;千位段码送P0口
     MOV P2,#08H ;千位位码送P2口
     LCALL DY2ms  ;显示2ms
     MOV P2,#0FFH ;关闭这一位
XS3: MOV P0,31H ;百位段码送P0口
     MOV P2,#06H  ;百位位码送P2口
     LCALL DY2ms ;显示2ms
     MOV P2,#0FFH ;关闭这一位
XS2: MOV P0,32H  ;十位段码送P1口
     MOV P2,#04H ;十位位码送P3口
     LCALL DY2ms  ;显示2ms
     MOV P2,#0FFH ;关闭这一位
XS1: MOV P0,33H ;个位段码送P1口
     MOV P2,#02H ;个位位码送P3口
     LCALL DY2ms ;显示2ms
     MOV P2,#0FFH ;关闭这一位
     RET

     ;2ms延时子程序
DY2ms:MOV R2,#4 ;外循环次数
DLP1:MOV R3,#250  ;内循环次数
DLP2:DJNZ R3,DLP2 ;2机周X250X1us/机周=500us=0.5ms
     DJNZ R2,DLP1 ;0.5msX4=2ms
     RET

     ;T0中断服务子程序
     ORG 200H ;T0中断服务程序首地址
ZDZD:PUSH Acc ;保护现场
 	 PUSH PSW ;
     MOV TH0,#3CH ;重置T0初值
     MOV TL0,#0B0H  ;
     DJNZ R4,GOGO ;判1S到否,未到转返回
     CLR TR1  ;1S到,停T1
     MOV 30H,TH1  ;转存T1内计的数
     MOV 31H,TL1  ;
     MOV TH1,#0 ;清T1
     MOV TL1,#0 ;
     SETB TR1 ;T1重新运行
     MOV R4,#20 ;50mm计数器重置
     LCALL FLFL ;调分离显示数字子程序
     LCALL ZHZH ;调数字转换为字段码子程序
GOGO:POP PSW  ;恢复现场
     POP Acc  ;
     RETI ;中断返回
     END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -