?? led1sch2.asm
字號:
;使用LED1SCH實驗板制作搖控區碼測試儀,遙控器按下超過3秒(即有重復碼)后,8字管顯示00000000
;P0口4*4鍵碼測試,在P1口LED上顯示2進制,在8字管顯示16進制
;開機自檢,檢查8字管顯示是否正常,LED發光二極管是否正常
;2006/03/29
;==================
F_RRPT BIT 00H ;重復碼設置(可重復為"1")
F_CVOK BIT 01H ;遙控碼標志(正常為"1")
F_PRRPT BIT 02H ;重復碼標志(重復為"1")
F_SP BIT 03H
F_RPT BIT 04H
F_KSW BIT 05H
;---------------------
CODE1 EQU 60H ;用戶碼
CODE2 EQU 61H ;用戶碼反碼
CODE3 EQU 62H ;按鍵碼
CODE4 EQU 63H ;按鍵碼反碼
REPTIM EQU 40H ;重復次數
RPT_1S EQU 41H ;1秒定時常數
;---------------------
DISP01 EQU 30H
DISP02 EQU 31H
DISP03 EQU 32H
DISP04 EQU 33H
DISP05 EQU 34H
DISP06 EQU 35H
DISP07 EQU 36H
DISP08 EQU 37H
;==============================
ORg 0000H
AJMP START ;轉入主程序
ORG 000BH
RETI
ORG 001BH
RETI
ORG 0030H
;==============================
START:
CLR P3.3
MOV R0,#7FH
R_CLR:
MOV @R0,#00H
DJNZ R0,R_CLR
MOV PSW,#00
CLR CY
MOV SP,#070H
MOV TMOD,#01H
SETB ET0 ;開定時/計數器0允許
CLR TR0
CLR EA ;打開CPU總中斷請求
;========================
;開機自檢,檢查8字管顯示是否正常,LED發光二極管是否正常
MOV R3,#153
AUTOCAN:
MOV CODE1,R3
MOV CODE2,R3
MOV CODE3,R3
MOV CODE4,R3
LCALL DIS60H
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
CLR C
MOV A,R3
SUBB A,#17
MOV R3,A
JNC AUTOCAN
LCALL MUSIC
MOV P1,#0FEH
MOV R3,#8
RRP1:
MOV A,P1
RR A
MOV P1,A
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
DJNZ R3,RRP1
MOV P1,#00H
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV P1,#0FFH
SETB EA
;========================
MAIN:
JB P3.2,FEND
LCALL REMOPT
JNB F_CVOK,FEND
CLR F_CVOK
LCALL DIS60H
LCALL MUSIC
FEND:
LCALL KEY
JNB F_KSW,NEXT
CLR F_KSW
LCALL DISKEY
NEXT:
SJMP MAIN
;==============================
;鍵碼測試,在P1口LED上顯示
;==============================
KEY:
MOV A,#00H
MOV B,#00H
MOV P0,#0FH ;P0=0000 1111 用反轉法查鍵
MOV A,P0 ;A =0000 1111
ANL A,#0FH ;A =0000 1111
MOV B,A ;B =0000 1111
MOV P0,#0F0H ;P0=1111 0000
MOV A,P0 ;A =1111 0000
ANL A,#0F0H ;A =1111 0000
ORL A,B ;A =1111 1111
CJNE A,#0FFH,K1
RET
K1:
SETB F_KSW
CJNE A,#77H,K2
MOV P1,A
LCALL MUSIC
RET
K2:
CJNE A,#0B7H,K3
MOV P1,A
LCALL MUSIC
RET
K3:
CJNE A,#7BH,K4
MOV P1,A
LCALL MUSIC
RET
K4:
CJNE A,#0BBH,K5
MOV P1,A
LCALL MUSIC
RET
K5:
CJNE A,#7DH,K6
MOV P1,A
LCALL MUSIC
RET
K6:
CJNE A,#0BDH,K7
MOV P1,A
LCALL MUSIC
RET
K7:
CJNE A,#7EH,K8
MOV P1,A
LCALL MUSIC
RET
K8:
CJNE A,#0BEH,K9
MOV P1,A
LCALL MUSIC
RET
K9:
CJNE A,#0DEH,K10
MOV P1,A
LCALL MUSIC
RET
K10:
CJNE A,#0EEH,K11
MOV P1,A
LCALL MUSIC
RET
K11:
CJNE A,#0DDH,K12
MOV P1,A
LCALL MUSIC
RET
K12:
CJNE A,#0EDH,K13
MOV P1,A
LCALL MUSIC
RET
K13:
CJNE A,#0DBH,K14
MOV P1,A
LCALL MUSIC
RET
K14:
CJNE A,#0EBH,K15
MOV P1,A
LCALL MUSIC
RET
K15:
CJNE A,#0D7H,K16
MOV P1,A
LCALL MUSIC
RET
K16:
CJNE A,#0E7H,KEYRET
MOV P1,A
LCALL MUSIC
RET
KEYRET:
RET
;==============================
;檢測9ms低電平
REMOPT:
MOV TH0,#00H ;初始化計數器
MOV TL0,#00H ;初始化計數器
SETB TR0 ;開始計數
R9msA:
JB P3.2,R9msB ;9MS低電平,出現高電平退出
MOV A,TH0 ;存入低電平時間
CLR C ;清進位標示
SUBB A,#26H ;計算值與9.728ms比較,
JC R9msA ;如果<=9.728MS(進位C=1),則繼續檢旬高電平出現;
LJMP TOERR ;如果>=9.728ms(進位C=0),出錯
R9msB:
MOV A,TH0 ;存入(9MS)低電平時間
MOV TH0,#00H ;初始化計數器
MOV TL0,#00H ;初始化計數器
SUBB A,#20H ;低電平時間與8.192ms比較
JNC R4ms5A ;如果>=8.192MS(進位C=0),說明低電平在(8.192MS-9.728MS)內,正常
LJMP TOERR ;脈沖間隔<=8.192ms(進位C=1),出錯
;---------------------------
;檢測4.5ms高電平
R4ms5A:
JNB P3.2,R4ms5B ;4.5MS高電平,出現低電平退出
MOV A,TH0 ;存入低電平時間
CLR C ;清進位標示
SUBB A,#15H ;計算值與5.376ms比較
JC R4ms5A ;如果高電平<=5.376MS(進位C=1),則繼續檢旬高電平出現;
LJMP TOERR ;如果高電平>=5.376ms(進位C=0),出錯
R4ms5B:
MOV A,TH0 ;存入(4.5MS)低電平時間
MOV R1,A ;存入(4.5MS)低電平時間
MOV TH0,#00H ;初始化計數器
MOV TL0,#00H ;初始化計數器
CLR C ;清進位標示
SUBB A,#10H ;低電平時間與4.096ms比較
JNC RCV056ms ;如果>=4.096MS(進位C=0),說明高電平在(4.096MS-5.376MS)內,正常
LJMP TORRPT ;脈沖間隔<=4.096ms(進位C=1),看是否為重復碼?
;-----------------------------
;檢測0.56MS低電平寬度(0.4-0.768MS)
RCV056ms:
MOV REPTIM,#0 ;(重復碼清0)第一個重復碼必須計五次才啟作用
MOV R0,#CODE1 ;從CODE1開始,到CODE4結束共4*8=32位
MOV R2,#8 ;共8位
MOV R3,#4 ;4個8位
RCV056msA:
MOV TH0,#00 ;初始化計數器
MOV TL0,#00 ;初始化計數器
RCV056msB:
JB P3.2,RCV056msC ;出現高電平轉N1
MOV A,TH0 ;存入(0.56MS)低電平時間
CLR C ;清進位標示
SUBB A,#03H ;脈沖間隔<=0.768ms
JC RCV056msB ;如果低電平<=0.768MS(進位C=1),則繼續檢旬高電平出現;
LJMP TOERR ;脈沖間隔>=0.768ms
RCV056msC:
MOV A,TH0 ;存入(0.56MS)低電平時間
CLR C ;清進位標示
SUBB A,#01H ;脈沖間隔<=0.256ms
JNC RCV0768ms ;如果低電平>=0.256MS(進位C=0),說明高電平在(0.256MS-0.768MS)內,正常
LJMP TOERR ;脈沖間隔<=0.256ms
RCV0768ms:
MOV TH0,#00 ;初始化計數器
MOV TL0,#00 ;初始化計數器
;----------------
;檢測0.56MS或1.12MS高電平寬度,如果大于0.768MS為"1"
RCV0768msA:
JNB P3.2,RCV0768msB ;出現低電平轉RCV0768msB
MOV A,TH0 ;存入(0.56MS或1.12MS)高電平時間
CLR C ;清進位標示
SUBB A,#03H ;脈沖間隔<=0.768ms
JC RCV0768msA
JB P3.2,$ ;脈沖間隔>=0.768ms,等待高電平結束
SETB C ;C=1 (脈沖間隔>=0.768ms為"1")
SJMP RCVHIGH ;該位為"1"
RCV0768msB:
MOV A,TH0 ;存入(0.56MS)低電平時間
CLR C ;清進位標示
SUBB A,#01H ;脈沖間隔<=0.256ms
JNC RCVLOW ;如果低電平>=0.256MS(進位C=0),說明高電平在(0.256MS-0.768MS)內,正常
LJMP TOERR ;脈沖間隔<=0.256ms,出錯
RCVLOW:
CLR C ;C=0(脈沖間隔<=0.768ms為"0")
RCVHIGH:
MOV A,@R0 ;A<===@R0
RRC A ;A帶CY循環右移
MOV @R0,A ;@R0<===A
DJNZ R2,RCV056msA ;共8位未完繼續
MOV R2,#8 ;共8位
INC R0 ;指向下一個地止
DJNZ R3,RCV056msA ;4個8位未完繼續
MOV R3,#4 ;4個8位
CUSTOK:
MOV A,CODE4
CPL A
XRL A,CODE3
JNZ TOERR
CVSOK:
SETB F_CVOK
SETB F_RPT
RET
;-----------------------------
TORRPT: ;看是否為重復碼(2.5MS)?
MOV A,R1
CLR C ;清進位標示
SUBB A,#0CH ;低電平時間與3.072ms比較
JC RRPT1 ;如果<=3.072MS,OK
LJMP TOERR ;如果>=3.072MS(進位C=0),出錯
RRPT1:
MOV A,R1
CLR C ;清進位標示
SUBB A,#08H ;高電平時間與2.048ms比較
JC TOERR ;出錯
SETB F_PRRPT ;說明該脈沖為重復碼
RRPT2:
INC REPTIM ;重復次數加一
MOV A,REPTIM
CJNE A,#10H,TOERR ;重復次數未到5次繼續
MOV REPTIM,#0 ;
SJMP TOERR1
;------------------------------
TOERR1:
MOV CODE1,#00H
MOV CODE2,#00H
MOV CODE3,#00H
MOV CODE4,#00H
LCALL DIS60H
LCALL MUSIC1
TOERR:
CLR F_PRRPT ;清重復碼標志
CLR F_CVOK ;遙控出錯標志
RET
;==============================
DIS60H:
MOV A,CODE1 ;將存放在RAM\62H中的數據移入A中
ANL A,#0F0H ;取RAM\62H中的數據低位
SWAP A
MOV R0,#DISP08
LCALL DISNUMA
MOV A,CODE1 ;將存放在RAM\62H中的數據移入A中
ANL A,#0FH ;取RAM\62H中的數據高位
MOV R0,#DISP07
LCALL DISNUMB
DIS61H:
MOV A,CODE2 ;將存放在RAM\62H中的數據移入A中
ANL A,#0F0H ;取RAM\62H中的數據低位
SWAP A
MOV R0,#DISP06
LCALL DISNUMA
MOV A,CODE2 ;將存放在RAM\62H中的數據移入A中
ANL A,#0FH ;取RAM\62H中的數據高位
MOV R0,#DISP05
LCALL DISNUMB
IS62H:
MOV A,CODE3 ;將存放在RAM\62H中的數據移入A中
ANL A,#0F0H ;取RAM\62H中的數據低位
SWAP A
MOV R0,#DISP04
LCALL DISNUMA
MOV A,CODE3 ;將存放在RAM\62H中的數據移入A中
ANL A,#0FH ;取RAM\62H中的數據高位
MOV R0,#DISP03
LCALL DISNUMB
DIS63H:
MOV A,CODE4 ;將存放在RAM\62H中的數據移入A中
ANL A,#0F0H ;取RAM\62H中的數據低位
SWAP A
MOV R0,#DISP02
LCALL DISNUMA
MOV A,CODE4 ;將存放在RAM\62H中的數據移入A中
ANL A,#0FH ;取RAM\62H中的數據高位
MOV R0,#DISP01
LCALL DISNUMB
;==============================
;發送子程序
;==============================
LOOP_DISP:
MOV R2,#8 ;2個8字顯示
MOV R0,#DISP01 ;緩沖區首址入R0
MOV SCON,#00H ;UART方式0設定
SOUT: MOV A,@R0 ;發送數據入A中
CLR TI ;發送結束標志清零
MOV SBUF,A ;啟動發送
NOP
WAIO: JNB TI,WAIO ;發送等等
INC R0 ;指向下一個發送數據地址
DJNZ R2,SOUT ;N個字節發送完未完轉SOUT
DISRET:
RET
;==============================
DISKEY:
MOV DISP08,#11110111B ;前-
MOV DISP07,#11111110B ;后-
MOV DISP06,#10001000B ;前0
MOV A,P1 ;將存放在RAM\62H中的數據移入A中
ANL A,#0FH ;取RAM\62H中的數據高位
MOV R0,#DISP04
LCALL DISNUMA
MOV A,P1 ;將存放在RAM\62H中的數據移入A中
ANL A,#0F0H ;取RAM\62H中的數據低位
SWAP A
MOV R0,#DISP05
LCALL DISNUMB
MOV DISP03,#00110010B ;后H
MOV DISP02,#11110111B ;前-
MOV DISP01,#11111110B ;后-
SJMP LOOP_DISP
;==============================
;MOV @R0,#11110111B ;-
DISNUMA:
DIS0A: ;前0
CJNE A,#0,DIS1A
MOV @R0,#10001000B ;10001000B
RET
DIS1A: ;前1
CJNE A,#1,DIS2A
MOV @R0,#11101110B
RET
DIS2A: ;前2
CJNE A,#2,DIS3A
MOV @R0,#10010010B
RET
DIS3A: ;前3
CJNE A,#3,DIS4A
MOV @R0,#10100010B
RET
DIS4A: ;前4
CJNE A,#4,DIS5A
MOV @R0,#11100100B
RET
DIS5A: ;前5
CJNE A,#5,DIS6A
MOV @R0,#10100001B
RET
DIS6A: ;前6
CJNE A,#6,DIS7A
MOV @R0,#10000001B
RET
DIS7A: ;前7
CJNE A,#7,DIS8A
MOV @R0,#11101010B
RET
DIS8A: ;前8
CJNE A,#8,DIS9A
MOV @R0,#10000000B
RET
DIS9A: ;前9
CJNE A,#9,DISA
MOV @R0,#10100000B
RET
DISA: ;前a
CJNE A,#0AH,DISB
MOV @R0,#11000000B
RET
DISB: ;前b
CJNE A,#0BH,DISC
MOV @R0,#10000101B
RET
DISC: ;前c
CJNE A,#0CH,DISD
MOV @R0,#10010111B
RET
DISD: ;前d
CJNE A,#0DH,DISE
MOV @R0,#10000110B
RET
DISE: ;前e
CJNE A,#0EH,DISF
MOV @R0,#10010001b
RET
DISF: ;前f
CJNE A,#0FH,DISARET
MOV @R0,#11010001b
RET
DISARET:
RET
;==============================
;MOV @R0,#11111110B ;-
;MOV @R0,#00110010B ;H
DISNUMB:
DIS0B: ;后0
CJNE A,#0,DIS1B
MOV @R0,#00010001B ;#00010001B
RET
DIS1B: ;后1
CJNE A,#1,DIS2B
MOV @R0,#01110111B ;#01110111B
RET
DIS2B: ;后2
CJNE A,#2,DIS3B
MOV @R0,#10010100B
RET
DIS3B: ;后3
CJNE A,#3,DIS4B
MOV @R0,#01010100B
RET
DIS4B: ;后4
CJNE A,#4,DIS5B
MOV @R0,#01110010B
RET
DIS5B: ;后5
CJNE A,#5,DIS6B
MOV @R0,#01011000B
RET
DIS6B: ;后6
CJNE A,#6,DIS7B
MOV @R0,#00011000B
RET
DIS7B: ;后7
CJNE A,#7,DIS8B
MOV @R0,#01110101B
RET
DIS8B: ;后8
CJNE A,#8,DIS9B
MOV @R0,#00010000B
RET
DIS9B: ;后9
CJNE A,#9,DISBA
MOV @R0,#01010000B
RET
DISBA: ;后a
CJNE A,#0AH,DISBB
MOV @R0,#00110000B
RET
DISBB: ;后b
CJNE A,#0BH,DISBC
MOV @R0,#00011010B
RET
DISBC: ;后C
CJNE A,#0CH,DISBD
MOV @R0,#10011001B
RET
DISBD: ;后d
CJNE A,#0DH,DISBE
MOV @R0,#00010110B
RET
DISBE: ;后e
CJNE A,#0EH,DISBF
MOV @R0,#10011000b ;10011000B
RET
DISBF: ;后f
CJNE A,#0FH,DISBRET
MOV @R0,#10111000B
RET
DISBRET:
RET
;==============================
MUSIC:
CPL P3.3
LCALL DELAY
CPL P3.3
RET
;==============================
MUSIC1:
CPL P3.3
LCALL DELAY
CPL P3.3
LCALL DELAY
CPL P3.3
LCALL DELAY
CPL P3.3
RET
;==============================
DELAY:
MOV R2,#0FFH
DELAY1: MOV R1,#0FFH
DJNZ R1,$
DJNZ R2,DELAY1
RET
;==============================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -