在CSDN看了许多文章,也学到了不少偏门知识,这学期结束做了课设,就是题目所说,在这里分享一下我的经验。
代码学习,永无止境。因为疫情课程安排被改的面目全非,为了应对马上来的考试,顺便问一下偶尔点进来的大佬,Java和数据结构前期怎样进行简单的入门学习,在这里小弟不胜感激。
下面就进入正文。
正常运行
变灯
中断
具体功能下面代码已经展示了,如有不足请指出。
ORG 0000H
AJMP MAIN ;转主程序
ORG 0003H ;外部中断0入口地址
AJMP INTZ ;中断服务子程序
ORG 0013H
AJMP INTO
ORG 0030H
MAIN: MOV SP,#60H
MOV DPTR,#TAB ;表头
MOV R1,#0F0H
SETB IT0 ;外部中断0跳沿触发
SETB EX0 ;允许外部中断0中断
SETB IT1
SETB EX1
SETB EA ;CPU开总中断
LJMP LNS ;跳主运行程序
INTZ: MOV A,P1 ;保存红绿灯状态
MOV R7,A
MOV C,P3.4 ;保存人行道红绿灯状态
MOV 34H,C
MOV C,P3.5
MOV 35H,C
MOV C,P3.6
MOV 36H,C
MOV C,P3.7
MOV 37H,C
INZ: ;JB P3.2,IDZ
MOV P0,#7FH ;显示器置八
MOV P1,#11H ;南北红绿灯全红,东西特种车辆通行
MOV P2,#7FH
SETB P3.4
SETB P3.7
CLR P3.5
CLR P3.6
JNB P3.2,INZ ;判断中断是否停止,循环
IDZ: MOV A,R7 ;恢复状态
MOV P1,A
MOV C,34H
MOV P3.4,C
MOV C,35H
MOV P3.5,C
MOV C,36H
MOV P3.6,C
MOV C,37H
MOV P3.7,C
RETI ;返回中断处
INTO: MOV A,P1
MOV R7,A
MOV C,P3.4
MOV 34H,C
MOV C,P3.5
MOV 35H,C
MOV C,P3.6
MOV 36H,C
MOV C,P3.7
MOV 37H,C
INO: ;JB P3.2,IDO
MOV P0,#7FH
MOV P1,#0AH
MOV P2,#7FH
SETB P3.4
SETB P3.7
CLR P3.5
CLR P3.6
JNB P3.3,INO
IDO: MOV A,R7
MOV P1,A
MOV C,34H
MOV P3.4,C
MOV C,35H
MOV P3.5,C
MOV C,36H
MOV P3.6,C
MOV C,37H
MOV P3.7,C
RETI
LNS: MOV A,R1 ;设置R1,调用不同方向红绿灯后取反,以此循环亮起
CPL A
MOV R1,A
CJNE R1,#0F0H,LWE ;调用子程序,亮东西
LCALL SONO ;调用子程序,亮南北
AJMP LNS
LWE: LCALL EAWE
AJMP LNS
;东西红灯、南北绿灯
EAWE: MOV R4,#63 ;红灯时间
MOV R0,#10
MOV P1,#0AH ;东西红灯、南北绿灯
MOV P3,#5CH ;人行道:东西绿灯、南北红灯
EW: MOV R5,#10 ;循环次数,人眼余辉
LEW: MOV A,R4
MOV B,R0
DIV AB ;取东西亮起的数字
MOV R2,B
CLR P1.7 ;控制位选线1,左
MOVC A,@A+DPTR
MOV P2,A ;东西显示器
MOV A,R4
SUBB A,#04H
JNC L2 ;有进位顺序执行
MOV A,R4 ;3S内,南北黄灯和东西红灯剩余时间保持一样
AJMP L3
L2: ADD A,#01H
L3: MOV B,R0
DIV AB ;取南北亮起的数字
MOV R3,B
MOVC A,@A+DPTR
MOV P0,A ;南北显示器
LCALL DEL
SETB P1.7 ;关闭位选线,左
MOV A,R2 ;恢复东西显示器右侧数值
CLR P1.6 ;控制位选线2
MOVC A,@A+DPTR
MOV P2,A
MOV A,R3 ;恢复南北显示器右侧数值
MOVC A,@A+DPTR
MOV P0,A
LCALL DEL
SETB P1.6 ;关闭位选线,右
DJNZ R5,LEW ;循环次数判断
CJNE R4,#04H,L1 ;判断是否3S内,改变灯的状态
MOV P1,#0CH ;东西红灯、南北黄灯
L1: DEC R4 ;改变下一次显示的数字
CJNE R4,#00H,EW ;循环1~63的数值
RET ;返回调用
;南北红灯、东西绿灯
SONO: MOV R4,#83 ;以下逻辑同上
MOV R0,#10
MOV P1,#11H ;东西绿灯、南北红灯
MOV P3,#0ACH ;人行道:东西红灯、南北绿灯
SN: MOV R5,#10
LSN: MOV A,R4
MOV B,R0
DIV AB
MOV R2,B
CLR P1.7 ;控制位选线1
MOVC A,@A+DPTR
MOV P0,A
MOV A,R4
SUBB A,#04H
JNC L5
MOV A,R4
AJMP L6
L5: ADD A,#01H
L6: MOV B,R0
DIV AB
MOV R3,B
MOVC A,@A+DPTR
MOV P2,A
LCALL DEL
SETB P1.7
MOV A,R2
CLR P1.6 ;控制位选线2
MOVC A,@A+DPTR
MOV P0,A
MOV A,R3
MOVC A,@A+DPTR
MOV P2,A
LCALL DEL
SETB P1.6
DJNZ R5,LSN
CJNE R4,#04H,L4
MOV P1,#21H ;东西黄灯、南北红灯
L4: DEC R4
CJNE R4,#00H,SN
RET
;延时50ms,受调用延时次数和循环次数R5影响,S=200*(123*2++2+1+1)+1=50.001ms
DEL: MOV R6,#200 ;1us
DEL1: MOV R7,#123 ;1us
NOP ;1us
DEL2: DJNZ R7,DEL2 ;2us
DJNZ R6,DEL1 ;2us
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;存放0~9共阴极数字
END