?? jiaotongdeng.asm.txt
字號:
;實驗目的:了解8255與交通燈模塊
;實驗連線:dg1-dg4接pc0-pc3,dr1-dr4接pc4-pc7,cs接8400
z8279 equ 0ff82h
d8279 equ 0ff80h
ledmod equ 00h
ledfeq equ 20h
ledcls equ 0c1h
c8255 equ 8406h
p8255a equ 8400h
p8255b equ 8402h
p8255c equ 8404h
org 0000h
ajmp start
org 0040h
start:
mov sp, #60h
lcall init8279
mov dptr,#c8255
mov a,#90h
movx @dptr,a
mov dptr,#p8255c
mov a,#00000000b ;交通燈全黃
movx @dptr,a
WAIT:
LCALL peek ;讀鍵盤
CJNE A,#0FFH,peeka ;判斷是否有鍵輸入
sjmp wait
peeka: CJNE A,#0aH,peekb ;輸入鍵是'a',進正常狀態
sjmp auto_traffic
peekb: cjne a,#0bh,wait ;輸入鍵是'b',進緊急狀態
sjmp manual_traffic
auto_traffic:
mov r1,#60
loop1: LCALL start_traffic1
lcall disptime
dec r1
lcall delay
lcall delay
lcall delay
lcall delay
lcall delay
lcall peek
cjne a,#0bh,go_on1 ;輸入"b"鍵,轉manual_traffic緊急情況狀態,交通燈全紅
sjmp manual_traffic
go_on1: cjne r1,#0,loop1
mov r1,#60
loop2: lcall start_traffic2
lcall disptime
dec r1
lcall delay
lcall delay
lcall delay
lcall delay
lcall delay
lcall peek
cjne a,#0bh,go_on2 ;輸入"b"鍵,轉manual_traffic緊急情況狀態,交通燈全紅
sjmp manual_traffic
go_on2: cjne r1,#0,loop2
sjmp auto_traffic
manual_traffic:
mov dptr,#p8255c
mov a,#00001111b
movx @dptr,a
traffic:
lcall peek
traffic_c:
cjne a,#0ch,traffic_d
lcall start_traffic1
sjmp traffic
traffic_d:
cjne a,#0dh,traffic_e
lcall start_traffic2
sjmp traffic
traffic_e:
cjne a,#0eh, traffic
sjmp auto_traffic
nop
;************************************************
;
; 數據區
;
;************************************************
;LED顯示常數表
LED: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.'
DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.'
DB 6DH,02H,08H,00H,59H,0FH,76H ;'U,-,_, ,I,O,P, '
;鍵盤鍵碼表
KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H ;'1,2,Q,W,A,S,+,Z'
DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'3,4,E,R,D,F,X,C'
;********************************************************************
;所有子程序均在下面
start_traffic1:
PUSH DPH ;保存現場
PUSH DPL
PUSH acc
mov dptr,#p8255c
mov a,#01101001b ;東西綠,南北紅
movx @dptr,a
POP acc ;恢復現場
POP DPL
POP DPH
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -