?? 接收.asm
字號:
;* 主程序和中斷程序入口 *
CS1 BIT P2.3
CS2 BIT P2.4
D_I BIT P3.6 ;4
R_W BIT P2.5 ;5
E BIT P2.6 ;6
DB0_DB7 EQU P0
X EQU 22H ;頁地址
Y EQU 23H ;列地址
COM EQU 24H
DAT EQU 24H
COUNT EQU 25H ;代碼倒計數單元
CODE0 EQU 26H ;表格起始地址,賦0值后與DPTR合成查表指針地址
MUL_ EQU 26H ;顯示數字時,暫存單元(要顯示的數是幾就在里面存幾)
ORG 0000H ;程序開始地址
LJMP START ;跳至START執行
ORG 0003H ;外中斷0中斷入口
LJMP INTEX0 ;跳至INTEX0執行中斷服務程序
ORG 000BH ;定時器T0中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0013H ;外中斷1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 001BH ;定時器T1中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 0023H ;串行口中斷入口地址
RETI ;中斷返回(不開中斷)
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回(不開中斷)
;* 初始化程序 *
CLEARMEMIO:
ACALL INT
SETB CS1
SETB CS2
ACALL CLEAR
ACALL DELAY1
LCALL SY ;顯示開機狀態
ACALL DELAY1
SETB CS1
SETB CS2
ACALL CLEAR
MOV P2,#00H
CLR A ;
DEC A ;A為#0FFH
MOV P0,A ;P1-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
CLEARMEM: MOV IE,#00H ;關所有中斷
SETB EX0 ;開外中斷
SETB EA ;總中斷允許
RET ;子程序返回
;* 主程序 *
START: LCALL CLEARMEMIO ;上電初始化
;
MAIN: JB P3.0,MAIN ;50HZ交流電未過零轉MAIN
LCALL DLX ;過零點時調用延時子程序(延時可變)
CLR P2.7 ;發調光脈沖
LCALL DELAY ;持續512微秒
SETB P2.7 ;關調光脈沖
LJMP MAIN ;轉MAIN循環
NOP ;PC值出錯處理
NOP
LJMP START ;出錯時重新初始化
; 遙控接收程序
;采用中斷接收
INTEX0: CLR EX0 ;關外中斷
JNB P3.1,READ1 ;P3.1口為低電平轉READ1
READOUTT0: SETB EX0 ;P3.1口為高電平開中斷(系干擾)
RETI ;退出中斷
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P3.1,HARD11 ;P3.1變高電平轉HARD11
INC DPTR ;用DPTR對低電平計數
NOP ;1微秒延時
NOP
AJMP HARD1 ;轉HARD1循環(循環周期為8微秒)
HARD11: MOV A,DPH ;DPTR高8位放入A
JZ READOUTT0 ;為0(脈寬小于8*255=2毫秒)退出
CLR A ;不為0,說明是第一個寬脈沖(3毫秒)
READ11: INC A ;脈沖個數計1
READ12: JNB P3.1,READ12 ;低電平時等待
MOV R1,#06H ;高電平寬度判斷定時值
READ13: JNB P3.1,READ11 ;變低電平時轉READ11脈沖計數
LCALL DELAY ;延時(512微秒)
DJNZ R1,READ13 ;6次延時不到轉READ13再延時
DEC A ;超過3毫秒判為結束,減1
DEC A ;減1
JZ FUN0 ;為0執行FUN0(2個脈沖)
DEC A ;減1
JZ FUN1 ;為0執行FUN1(3個脈沖)
DEC A ;
JZ FUN2 ;為0執行FUN2(4個脈沖)
DEC A ;
JZ FUN3 ;為0執行FUN3(5個脈沖)
DEC A ;
JZ FUN4 ;為0執行FUN4(6個脈沖)
DEC A ;
JZ FUN5 ;為0執行FUN5(7個脈沖)
DEC A ;
JZ FUN6 ;為0執行FUN6(8個脈沖)
DEC A ;
JZ FUN7 ;為0執行FUN7(9個脈沖)
DEC A ;
JZ FUN8 ;為0執行FUN8(10個脈沖)
DEC A ;
JZ FUN9 ;為0執行FUN9(11個脈沖)
DEC A ;
JZ FUN10 ;為0執行FUN10(12個脈沖)
DEC A ;
JZ FUN11 ;為0執行FUN11(13個脈沖)
DEC A ;
JZ FUN12 ;為0執行FUN12(14個脈沖)
DEC A ;
JZ FUN13 ;為0執行FUN13(15個脈沖)
DEC A ;
JZ FUN14 ;為0執行FUN14(16個脈沖)
DEC A ;
JZ FUN15 ;為0執行FUN15(17個脈沖)
NOP ;
NOP ;
LJMP READOUTT0 ;出錯退出
;
FUN0: MOV MUL_,#00H ;P0口各端口開關輸出控制
ACALL DSPP
LJMP READOUTT0 ;轉中斷退出
FUN1: MOV MUL_,#01H
ACALL DSPP
LJMP READOUTT0 ;
FUN2: MOV MUL_,#02H
ACALL DSPP
LJMP READOUTT0 ;
FUN3: MOV MUL_,#03H
ACALL DSPP
LJMP READOUTT0 ;
FUN4: MOV MUL_,#04H
ACALL DSPP
LJMP READOUTT0 ;
FUN5: MOV MUL_,#05H
ACALL DSPP
LJMP READOUTT0 ;
FUN6: MOV MUL_,#06H
ACALL DSPP
LJMP READOUTT0 ;
FUN7: MOV MUL_,#07H
ACALL DSPP
LJMP READOUTT0 ;
FUN8: MOV MUL_,#08H
ACALL DSPP
LJMP READOUTT0 ;
FUN9: MOV MUL_,#09H
ACALL DSPP
LJMP READOUTT0 ;
FUN10: MOV MUL_,#0AH
ACALL DSPP
LJMP READOUTT0 ;
FUN11: MOV MUL_,#0BH
ACALL DSPP
LJMP READOUTT0 ;
FUN12: MOV MUL_,#0CH
ACALL DSPP
LJMP READOUTT0 ;
FUN13: MOV MUL_,#0DH
ACALL DSPP
LJMP READOUTT0 ;
FUN14: MOV MUL_,#0EH
ACALL DSPP
LJMP READOUTT0 ;
FUN15: MOV MUL_,#0FH
ACALL DSPP
LJMP READOUTT0 ;轉中斷退出
DSPP: SETB CS2
CLR CS1
MOV X,#0BAH
MOV Y,#40H
MOV DPTR,#DDB
ACALL TU
ACALL DISP_
RET
;***********************設置CODE0查表指針初值*********************
TU: MOV B,#10H ;要顯示的數是幾就用幾乘以16,得到基址起始地址
MOV A,MUL_
MUL AB
MOV CODE0,A
RET
;************************8位字寬顯示子程序: (CODE0待設)**********************
DISP_: MOV 39H,#02H
MOV COUNT,#08H
LP_: MOV COM,X ;設置頁地址
LCALL INST
MOV COM,Y ;設置列地址
LCALL INST
W_: MOV A,CODE0
MOVC A,@A+DPTR
MOV DAT,A
LCALL DATA_
INC CODE0
DJNZ COUNT,W_
DJNZ 39H,LP1_
RET
LP1_: INC X
MOV COUNT,#08H
AJMP LP_
;***************************16位字寬顯示子程序**********************
DISP: MOV 39H,#02H
MOV CODE0,#00H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -