📄 000123.txt
字号:
ret
start_traffic2:
PUSH DPH ;保存现场
PUSH DPL
PUSH acc
mov dptr,#p8255c
mov a,#10010110b ;东西红,南北绿
movx @dptr,a
POP acc ;恢复现场
POP DPL
POP DPH
ret
;读取键盘子程序
PEEK: PUSH DPH ;保存现场
PUSH DPL
PUSH b
MOV DPTR,#Z8279
MOVX A,@DPTR ;读8279状态
ANL A,#0FH
JNZ PEEK1 ;判断是否有键输入
MOV A,#0FFH ;置标志(无键输入)
SJMP PEEKEND
PEEK1: MOV A,#40H ;读 FIFO RAM 命令
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;读键
MOV B,A
MOV A,#0C2H
KK: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#80H
JNZ KK
MOV A,B
PEEKEND:
POP b ;恢复现场
POP DPL
POP DPH
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;显示时间的子程序
;输入:A,输出:B,R1为进来的时间数
disptime:
push dph
push dpl
push acc
mov dptr,#z8279
mov a,#90h
movx @dptr,a
MOV A,R1
mov b,#10 ;显示秒低位
div ab
lcall disp
mov b,#10 ;显示秒高位
div ab
lcall disp
pop acc
pop dpl
pop dph
RET
; DISP子程序
;输入: ACC 要显示的字符ASCII码,B为进入显示的字符ASCII码
DISP: PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
mov a,b
MOV DPTR,#LED ;置显示常数表起始位置
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1: MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1 ;延时0.2秒左右
POP 1 ;恢复现场
POP 0
RET
end
POP DPH
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
disptime:
push dph
push dpl
push acc
mov dptr,#z8279
mov a,#90h
movx @dptr,a
mov a,r1
mov b,#10
div ab
lcall disp
mov b,#10
div ab
lcall disp
pop acc
pop dpl
pop dph
RET
; DISP子程序
;输入: ACC 要显示的字符ASCII码
DISP: PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
mov a,b
MOV DPTR,#LED ;置显示常数表起始位置
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1: MOV 1,#0b3H
DJNZ 1,$
DJNZ 0,DELAY1 ;延时100.02ms秒
POP 1 ;恢复现场
POP 0
RET
end
交通灯控制
路口分主干和支干道,主干道的绿灯时间(为25秒)长红灯时间短(为20秒),支干道的红灯时间
长(为30秒)绿灯时间短(为15秒),黄灯时间相等(为5秒)!
用P1口控制红绿灯,用P0和P2显示时间!
程序还没有优化,还望各位老师多多指点!
下面为汇编程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTT0
ORG 0013H
LJMP INTT1
ORG 001BH
LJMP TT1
ORG 0100H
TT1: MOV TH1,#0D8H ;定时器1,定时10us
MOV TL1,#0F0H
DJNZ R6,EXIT
MOV R6,#100 ;定时器定时100次
MOV R1,#0FFH
EXIT: RETI
INTT0:MOV P1,#0BEH ;外部中断0,
JB P3.4,$
RETI
INTT1:MOV P1,#0BBH ;外部中断1,
JB P3.4,$
RETI
ORG 1000H
MAIN: MOV R6,#100 ;主程序;
MOV R1,#00H
MOV TMOD,#10H ;初始化
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV IE,#8DH
MOV 20H,#25
MOV 21H,#5
MOV 22H,#15
MOV 23H,#30
MOV 24H,#20
SETB TR1
ST1: MOV P1,#0BBH ;第一个状态,主干道亮绿灯、支干道亮红灯;
CJNE R1,#0FFH,TZ1
MOV R1,#00H
DEC 20H
DEC 23H
TZ1: MOV R2,20H
MOV R3,23H
LCALL DISP ;调用显示子程序。
MOV A,20H
CJNE A,#00H,ST1
MOV 20H,#25
ST2: MOV P1,#0BDH ;第二个状态,主干道亮黄灯、支干道亮红灯;
CJNE R1,#0FFH,TZ2
MOV R1,#00H
DEC 21H
DEC 23H
TZ2: MOV R2,21H
MOV R3,23H
LCALL DISP ;调用显示子程序。
MOV A,21H
CJNE A,#00H,ST2
MOV 21H,#05
MOV 23H,#30
ST3: MOV P1,#0DEH ;第三个状态,主干道亮红灯、支干道亮绿灯;
CJNE R1,#0FFH,TZ3
MOV R1,#00H
DEC 24H
DEC 22H
TZ3: MOV R2,24H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#00H,ST3
MOV 22H,#15
ST4: MOV P1,#0EEH ;第四个状态,主干道亮红灯、支干道亮黄灯;
CJNE R1,#0FFH,TZ4
MOV R1,#00H
DEC 24H
DEC 21H
TZ4: MOV R2,24H
MOV R3,21H
LCALL DISP ;调用显示子程序。
MOV A,21H
CJNE A,#00H,ST4
MOV 21H,#05
MOV 24H,#20
LJMP ST1 ;跳转到第一个状态。
DISP: MOV A,R2 ;显示子程序。
MOV B,#10
DIV AB
MOV 60H,A
MOV 61H,B
MOV A,R3
MOV B,#10
DIV AB
MOV 62H,A
MOV 63H,B
MOV 40H,#04H
MOV R5,#0FEH
MOV R0,#60H
LLP: MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,R5
MOV P2,A
RL A
MOV R5,A
INC R0
LCALL DELAY1
DJNZ 40H,LLP
RET
DELAY1: ;延时子程序
MOV R4,#1
DL2: MOV R7,#1
DJNZ R7,$
DJNZ R4,DL2
RET
TABLEB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END
8255的交通灯
[code]
CODE SEGMENT
ASSUME CS:CODE
IOCONPT EQU 0073H
IOAPT EQU 0070H
IOBPT EQU 0071H
IOCPT EQU 0072H
IOBDATA EQU 0500H
CONTPORT EQU 00DFH
DATAPORT EQU 00DEH
DATA1 EQU 0640H
START: JMP IOLED
IOLED: CALL FORMAT
CALL LEDDISP
MOV AX,0H
MOV DS,AX
MOV AL,82H
MOV DX,IOCONPT
OUT DX,AL
MOV DX,IOBPT
IN AL,DX
MOV BYTE PTR DS:[0501H],AL
MOV DX,IOCONPT
MOV AL,80H ;置8255控制字80H,使各端口均为输出口,且工作于方式0
OUT DX,AL
MOV DX,IOBPT
MOV AL,DS:[0501H]
OR AL,0F0H ;置黄灯全灭
OUT DX,AL
MOV DX,IOCPT
MOV AL,0FH ;置红灯全亮且绿灯全灭,0FH=00001111B 即PC4-PC7为0,PC0-PC3为1
OUT DX,AL
CALL DELAY1
IOLED0: MOV AL,01011010B ;点亮1-3路口绿灯,即PC0、PC2置0所以1-3路口绿灯亮,PC1,PC3置1所以2-4路口绿灯灭,同理1-3路口红灯灭,2-4路口红灯亮
MOV DX,IOCPT
OUT DX,AL
CALL DELAY1
CALL DELAY1
OR AL,0FH ;熄灭1-3路口绿灯
OUT DX,AL
MOV CX,8H
IOLED1: MOV DX,IOBPT ;1-3路口黄灯闪烁8次
MOV AL,DS:[0501H]
AND AL,10101111B
OUT DX,AL
CALL DELAY2
OR AL,01010000B
OUT DX,AL
CALL DELAY2
LOOP IOLED1
MOV DX,IOCPT
MOV AL,0FH ;红灯全亮,绿灯全灭
OUT DX,AL
CALL DELAY2
MOV AL,01011010B ;点亮2-4路口绿灯,即PC1、PC3置0所以2-4路口绿灯亮,PC0、PC2置1所以1-3路口绿灯灭,同理1-3路口红灯亮,2-4路口红灯灭
OUT DX,AL
CALL DELAY1
CALL DELAY1
OR AL,0FH ;熄灭2-4路口绿灯
OUT DX,AL
MOV CX,8H
IOLED2: MOV DX,IOBPT ;2-4路口黄灯闪烁8次
MOV AL,DS:[0501H]
AND AL,01011111B
OUT DX,AL
CALL DELAY2
OR AL,10100000B
OUT DX,AL
CALL DELAY2
LOOP IOLED2
MOV DX,IOCPT
MOV AL,0F0H
OUT DX,AL
CALL DELAY2
JMP IOLED0
DELAY1: PUSH AX
PUSH CX
MOV CX,0030H
DELY2: CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2: PUSH CX
MOV CX,8000H
DELA1: LOOP DELA1
POP CX
RET
LEDDISP:MOV AL,90H
MOV DX,CONTPORT
OUT DX,AL
MOV BYTE PTR DS:[0600H],00
LED1: CMP BYTE PTR DS:[0600H],07H
JA LED2
MOV BL,DS:[0600H]
MOV BH,0H
MOV AL,CS:[BX+DATA1]
MOV DX,DATAPORT
OUT DX,AL
ADD BYTE PTR DS:[0600H],01H
JNZ LED1
LED2: RET
FORMAT: MOV BX,0
MOV WORD PTR DS:[BX+0640H],405BH
ADD BX,2
MOV WORD PTR DS:[BX+0640H],4040H
ADD BX,2
MOV WORD PTR DS:[BX+0640H],6D6DH
ADD BX,2
MOV WORD PTR DS:[BX+0640H],7F5BH
RET
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -