📄 sji.asm
字号:
ORG 0000H
LJMP MAIN ;上电跳主程序
ORG 000BH ;T0中断入口
LJMP IT0P ; 跳T0中断服务入口
ORG 001BH ;T1中断入口
LJMP IT1P ;跳T1中断服务入口
ORG 0030H
MAIN:
MOV TMOD,#00010101B ;设T1为方式1定时,T0为方式1计数
MOV TH1,#3CH ;给T1装入定时初值
MOV TL1,#0B2H
MOV TH0,#0FEH ;给T0装入计数初值
MOV TL0,#0C8H
SETB ET1 ;允许T1申请中断
SETB TR1 ;启动T1
SETB ET0 ;允许T0申请中断
SETB PT0 ;计数器T0定义为高优先级中断
CLR PT1 ;定时器T1定义为低优先级中断
SETB EA ;CPU开中断
MOV 50H, #16H ;单价初始化
MOV 20H, #20 ;中断次数为20H单元
MOV 30H,#15H ;时钟显示单元初始化
MOV 31H,#00H
MOV 32H,#00H
MOV 40H, #00H ;总金额初始化
MOV 41H, 60H
AGAIN:
JB P1.1, BUTIAO ;判断是否S2键按下了,没按下,就转入BUTIAO
LCALL SHOW ;否则调显示
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
JB P1.1, BUTIAO ;再次判断S2是否按下了,否则就转入BUTIAO
CLR TR0 ;S2真的按下了,关计数器T0中断
MOV A, #01H ;单价加0.1
ADD A, 50H
DA A ;单价单元十进制调整
MOV 50H, A ;单价单元的BCD码存回单价单元
CJNE A, #99H, CHECK ;是否到9.9元,不到则转入键检查程序
MOV 50H, #00H ;计满9.9元,单价单元清零
CHECK: JB P1.1, CHECK ;S2没按下,则继续检查
LCALL SHOW ;S2按下,继续调用显示
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
LCALL SHOW
JB P1.1, CHECK ;S2没按下吗? 继续检查
SETB TR0 ;启动T0
LJMP BUTIAO ;跳到BUTIAO,判断S1是否按下
BUTIAO:
JB P1.0, CLOCK ;S1没按下,转入时钟子程序
SETB TR0 ;S1按下,启动T0中断
LCALL CHAI2 ;调用金额单价拆分子程序
LJMP GOON ;返回继续判键
CLOCK:
LCALL CHAI1 ;调用时钟拆分子程序
CLR TR0 ;停止T0计数
MOV 41H, #60H ;重新给总金额赋初值
MOV 40H, #00H
GOON:
LCALL SHOW ;调用显示子程序
LJMP AGAIN ;返回继续判键
CHAI2:
PUSH PSW ;保护现场
PUSH ACC
MOV A,41H ;41H赋给A
ANL A,#0F0H ;取41H单元的高位赋给A
SWAP A
MOV DPTR,#TAB ;查段码表
MOVC A,@A+DPTR ;取字形码
INC A ;加上小数点位
MOV 34H,A ;把累加器中的值赋给34H
MOV A,41H ;取41H的低位赋给35H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 35H,A
MOV A, 40H ;取40H的低位赋给33H
ANL A, #0FH
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV 33H, A
MOV 36H, #02H ;36H单元送一“-”
MOV A, 50H ;取50H单元的高位给累加器
ANL A, #0F0H
SWAP A
MOVC A, @A+DPTR
INC A ;累加器值加1,即加上小数点
MOV 37H, A ;带小数点的累加器的值赋给37H
MOV A, 50H ;将50H低位赋给38H
ANL A, #0FH
MOVC A, @A+DPTR
MOV 38H, A
POP ACC ;恢复现场,
POP PSW
RET ;单价金额拆分子程序返回
CHAI1:
PUSH PSW ;保护现场
PUSH ACC
MOV A,30H ;30H的高位赋给33H
ANL A,#0F0H
SWAP A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 33H,A
MOV A,30H ;30H的低位赋给34H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 34H,A
MOV A,31H ;31H的高位赋给35H
ANL A,#0F0H
SWAP A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 35H,A
MOV A,31H ;31H的低位赋给36H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 36H,A
MOV A,32H ;32H的高位赋给37H
ANL A,#0F0H
SWAP A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 37H,A
MOV A,32H ;32H的低位赋给38H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 38H,A
POP ACC ;恢复现场
POP PSW
RET ;时钟拆分子程序返回
IT1P:
PUSH PSW ;T1中断服务程序入口,保护现场
PUSH ACC
MOV TH1,#3CH ;重新给T1装入初值
MOV TL1,#0B0H
DJNZ 20H,RETURN ;1秒未到,返回
MOV 20H,#20 ;1秒时间到,重置中断次数
MOV A,#01H ;秒单元加1
ADD A,32H
DA A ;秒单元十进制调整
MOV 32H,A ;秒的BCD码存入秒单元
CJNE A,#60H,RETURN ;是否到60秒,未到则返回
MOV 32H,#00H ;计满60秒,妙单元清零
MOV A,#01H ;分单元加1
ADD A,31H
DA A ;分单元十进制调整
MOV 31H,A ;分的BCD码存入分单元
CJNE A,#60H,RETURN ;是否到60分,未到则返回
MOV 31H,#00H ;计满60分,分单元清0
MOV A,#01H ;小时单元加1
ADD A,#30H
DA A ;小时单元十进制调整
MOV 30H,A ;小时单元的BCD码存入小时单元
CJNE A,#24H,RETURN ;是否到24时,未到则返回
MOV 30H,#00H ;计满24时,小时单元清零
RETURN:
POP ACC ;恢复现场
POP PSW
RETI ;中断返回
IT0P: PUSH PSW ;T0中断服务程序入口
PUSH ACC
CLR TR0 ;停止T0计数
MOV TH0,#0FEH ;T0置初值
MOV TL0,#0B2H
MOV A, 50H ;把单价放入累加器
ADD A, 41H ;跟总金额相加
DA A ;总金额进行十进制调整
MOV 41H, A ;总金额的BCD码存入41H
JC JINWEI ;有进位则转入进位子程序
LJMP NO ;否则,返回继续
JINWEI:
MOV A, #01H ;40H单元加1
ADD A, 40H
DA A ;十进制调整
MOV 40H, A ;再存入40H单元
CJNE A, #10H, NO ;判断是否等于10,不等则恢复现场,中断返回
MOV 40H, #00H ;相等则清零
LJMP NO
NO:
POP ACC ;恢复现场
POP PSW
RETI ;中断返回
SHOW:
PUSH PSW ;保护现场
PUSH ACC
CLR P1.6 ;选择LED第一位
SETB P1.5
CLR P1.4
MOV DPTR, #0FD00H ;扫描模式置初值
MOV A, 38H ;取第一位显示收据
MOVX @DPTR, A ;段数据送P0口
LCALL DELAY ; 调用延时子程序
CLR P1.4
SETB P1.5
SETB P1.6
MOV A,37H ;取第二位显示数据
MOVX @DPTR,A ;段数据送P0 口
LCALL DELAY ;调用延时子程序
SETB P1.4
CLR P1.5
CLR P1.6
MOV A,36H ;取第三位显示数据
MOVX @DPTR,A ;段数据送P0口
LCALL DELAY ;调用延时子程序
SETB P1.4
CLR P1.5
SETB P1.6
MOV A,35H ;取第四位显示数据
MOVX @DPTR,A ;段数据送P0口
LCALL DELAY ;调用延时子程序
SETB P1.4
SETB P1.5
CLR P1.6
MOV A,34H ;取第五位显示数据
MOVX @DPTR,A ;段数据送P0口
LCALL DELAY ;调用延时子程序
SETB P1.4
SETB P1.5
SETB P1.6
MOV A,33H ;取第六位显示数据
MOVX @DPTR,A ;段数据送P0 口
LCALL DELAY ;调用延时子程序
POP ACC
POP PSW
RET
DELAY: MOV R3,#02H ;0.5MS延时子程序
DELAY2: MOV R4,#0FFH
DJNZ R4,$
DJNZ R3,DELAY2
RET
TAB: ;共阴极LED段码表
DB 0FCH,60H,0DAH,0F2H,66H
DB 0B6H,0BEH,0E0H,0FEH,0F6H
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -