- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-08-28 05:43:12
已绑定手机
注册会员
- 积分
- 93
|
发表于 2025-8-26 12:20:46
|
显示全部楼层
SMG1 EQU P1.0 ;数码管 1
SMG2 EQU P1.1 ;数码管 2
SMG3 EQU P1.3 ;数码管 3
SMG4 EQU P1.2 ;数码管 4
;数据 EQU P3.0 ;164
;时间 EQU P3.1 ;164
FMQ EQU P3.4 ;蜂鸣器
GNAN EQU P3.0 ;按下启动两只电机
ANB EQU P3.1 ;按钮B
ANA EQU P3.2 ;按钮A
JDQ EQU P3.5 ;送料电机
BJD EQU P1.6 ;数量到报警灯
P1K EQU 0EEH
P2K EQU 0EDH
P3K EQU 0ECH
DLA EQU 0EFH
ORG 00H
JMP QQ
;------FH1------程序运行一次无返回-----------
;;----程序开始-------------
QQ: CLR FMQ ;关闭蜂鸣器
MOV DPTR,#12345
CALL MAIN
;这四行的意思是把您分解出来的数 放到我显示的H里,我再调用显示程序,依次一位的显示
MOV 38H,30H
MOV 35H,31H
MOV 36H,32H
MOV 37H,33H
C1: CALL XS ;调用显示程序
JMP C1 ;回调用显示程序
;-------------------------------------------------------------------------
;=================您写的程序开始=====我复制的========================
MAIN: MOV R6, DPH ; 高8位示例值
MOV R7, DPL ; 低8位示例值
LCALL HEX2DEC ; 调用转换子程序
;STOP: SJMP STOP ; 程序暂停
RET
; 转换子程序:R6R7 -> 30H-34H
HEX2DEC:
MOV 30H, #0 ; 初始化5字节缓冲区(万位)
MOV 31H, #0 ; 千位
MOV 32H, #0 ; 百位
MOV 33H, #0 ; 十位
MOV 34H, #0 ; 个位
LCALL PROCESS_HIGH
RET ; 转换完成返回
; 十进位处理子程序
HANDLE_CARRY:
; 处理个位进位到十位
MOV A, 34H
MOV B, #10
DIV AB ; A=商(进位), B=余数(个位)
MOV 34H, B ; 保存个位
MOV R0, A ; 暂存进位值
; 处理十位进位到百位 - 累加进位
MOV A, 33H
ADD A, R0 ; 原有十位值 + 进位
MOV B, #10
DIV AB ; A=商(进位), B=余数(十位)
MOV 33H, B ; 保存十位
MOV R0, A ; 更新进位值
; 处理百位进位到千位 - 累加进位
MOV A, 32H
ADD A, R0 ; 原有百位值 + 进位
MOV B, #10
DIV AB ; A=商(进位), B=余数(百位)
MOV 32H, B ; 保存百位
MOV R0, A ; 更新进位值
; 处理千位进位到万位 - 累加进位
MOV A, 31H
ADD A, R0 ; 原有千位值 + 进位
MOV B, #10
DIV AB ; A=商(进位), B=余数(千位)
MOV 31H, B ; 保存千位
MOV R0, A ; 更新进位值
; 处理万位进位
MOV A, 30H
ADD A, R0 ; 原有万位值 + 进位
MOV 30H, A ; 保存万位(最多为65535,不会超过10)
RET
PROCESS_HIGH:
MOV A, R6
JZ PROCESS_LOW ; 高8位为0且低8位<10,处理最后一位
; 高8位减1,补充十位25和个位6
DEC R6
MOV A, #6
ADD A, 34H
MOV 34H, A
MOV A, #25
ADD A, 33H
MOV 33H, A
; 处理各数位进位
LCALL HANDLE_CARRY
SJMP PROCESS_HIGH ; 再次检查高8位
PROCESS_LOW:
; 低8位处理
MOV A, R7
MOV B, #10
DIV AB ; 仅对低8位使用DIV
MOV R7, A ; 保存商到低8位
MOV A, B ; 余数作为当前十进制位
; 将余数累加到结果缓冲区的个位
ADD A, 34H
MOV 34H, A
; 将商累加到结果缓冲区的十位
MOV A,R7
ADD A, 33H
MOV 33H, A
MOV R7,#0
; 处理各数位进位
LCALL HANDLE_CARRY
RET
;=================您写的程序结束=====我复制的==============================================================================================================
;----74164显示----过程是把放在35H.36H。37H.38H,里的数字一次一位的送去显示在数码管上-----------------
;目前显示只有四位,只要能显示1234或2345,我再自己加一位
XS: MOV A,36H ;把分解出来的放在36H里的数送到A里
CALL MB ;调用码表
CALL L164 ;调用164控制子程序
CLR SMG3 ;让控住脚接通负极,让这位数码管灯亮
CALL T2MS ;让数码管延时点亮20毫秒
SETB SMG3 ;让控住脚接通正极,让这位数码管灯灭
;--------------------下面依次;亮;灭。数码管---四位共阴数码管-----我就不依次备注了-
MOV A,37H
CALL MB
CALL L164
CLR SMG4
CALL T2MS
SETB SMG4
;-------------------------
MOV A,35H
CALL MB
XSD: CALL L164
CLR SMG2
CALL T2MS
SETB SMG2
;-----------------------------
MOV A,38H
CALL MB
XSD1: CALL L164
CLR SMG1
CALL T2MS
SETB SMG1
RET
;================L164=========================
L164: MOV 65H,#08
SETB P3.3
NOP
LOOP_0: CLR P3.3
NOP
RRC A
NOP
MOV P3.7,C
NOP
NOP
SETB P3.3
NOP
NOP
NOP
NOP
DJNZ 65H,LOOP_0
RET
;===========2MS延时===================
T2MS: MOV 60H,#03H ;08
D2MS_0: MOV 61H,#03H ;40
D2MS_1: NOP
DJNZ 61H,D2MS_1
DJNZ 60H,D2MS_0
NOP
RET
;=============段码表 ===========================
MB: INC A
MOVC A,@A+PC
RET
DB 0EEH,22H,0BCH,0B6H,72H,0D6H,0DEH,0A2H,0FEH,0F6H,0FAH,5EH,0CCH,3EH,0DCH,0D8H,0CEH,7AH,8H,2EH,7CH,4CH,9AH,1AH,1EH,0F8H,0F2H,18H,0D2H,5CH,6EH,70H,8EH,74H,76H,94H,00H,4H,14H,94H, ; 灯不亮是36 ;一点是37
RET ;二点是38 ;三点是39
;=================================================
;--------------传感器AD信号-------------------
STCAD:
MOV 0BCH,#11101100B ;P1.4做传感器AD
NOP
NOP
NOP
NOP
NOP
NOP
WAD5: MOV A,0BCH
JNB ACC.4,WAD5
MOV A,0BDH
MOV 10H,A
SETB P1.4
RET
;--------------延时AD信号-------------------
STCAD1:
MOV 0BCH,#11101101B ;P1.5做延时AD
NOP
NOP
NOP
NOP
NOP
NOP
WAF5: MOV A,0BCH
JNB ACC.4,WAF5
MOV A,0BDH
SUBB A,#85
JNC AF1
MOV A,#0
NOP
AF1: NOP
SETB P1.5
RET
;=============蜂鸣器响壹声===========================
FMQKJ: SETB FMQ
MOV R1,#255
Z1: CALL XS
DJNZ R1,Z1
CLR FMQ
MOV R1,#255
Z2: CALL XS
DJNZ R1,Z2
RET
;=========读第X扇区============
; MOV DPTR,#000H
DU: MOV 0C7H,#10000010B ;设置反映时间
MOV 0C5H,#1 ;1是读的指令
MOV 0C3H,DPH
MOV 0C4H,DPL
MOV 0C6H,#5AH ;0C6H必须做2个动作
MOV 0C6H,#0A5H ;0C6H必须做2个动作
NOP
MOV A,0C2H ;读出来的数据放在0C2H
NOP
RET
;=============擦除===========
; MOV DPTR,#000H
CHA: MOV 0C7H,#10000010B
MOV 0C5H,#3
MOV 0C3H,DPH
MOV 0C4H,DPL
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
RET
;=============写============
; MOV DPTR,#000H
XIE: MOV 0C7H,#10000010B
MOV 0C5H,#2
MOV 0C3H,DPH
MOV 0C4H,DPL
MOV 0C2H,A ;数据放在0C2H,写进去
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
CALL FZWCZ
RET
;=============================================
;===========单片机片内储存防止误抄作============
FZWCZ: MOV 07CH,#0
MOV 0C5H,#0
MOV 0C6H,#0
MOV 0C3H,#80H
MOV 0C4H,#0
RET
END
|
|