?? ir_uart.asm
字號(hào):
MOV g_IR_HEAD3,A ;
MOV A,g_BIT1_NUM ;
CJNE A,B,IR_MOUSE_ERR ; 計(jì)算1的個(gè)數(shù)是否正確
MOV g_IR_HEAD1,#c_IR_MOUSE ; 紅外鼠標(biāo) 導(dǎo)引頭
ACALL OUT_IR_DATA ; 送出數(shù)據(jù)
AJMP IRDA_RETI ;
IR_MOUSE_ERR: AJMP INT_IRDA_ERR ; 錯(cuò)誤處理中繼站
;┌───────┬───────────────-┐;
;│IR_BIT4 │紅外鼠標(biāo)處理 │;
;└───────┴───────────────-┘;
IR_BIT4: MOV R3,#4 ; 紅外鍵盤普通鍵處理
MOV B,#0 ;
IR_BIT4_PAR: ACALL IR_CLK ; 產(chǎn)生一個(gè)CLK
JB F0,IR_BIT4_RET ;
ACALL READ_IRKB_BIT ;
JB F0,IR_BIT4_RET ;
MOV A,B ; 暫存B
RRC A ;
MOV B,A ; 暫存B
DJNZ R3,IR_BIT4_PAR ; 4個(gè)bit 1的個(gè)數(shù)
SWAP A ; 高低位互換 因?yàn)榻邮盏母咚奈徊攀?的個(gè)數(shù)
MOV B,A ; 暫存B
IR_BIT4_RET: RET ;
;┌───────┬───────────────-┐;
;│READ_YKQ_BYTE │讀取遙控器一個(gè)字節(jié)數(shù)據(jù) │;
;└───────┴───────────────-┘;
READ_YKQ_BYTE: MOV R4,#8 ; 接收一個(gè)字節(jié)8位
READ_YKQ_DATA: ACALL IR_CLK ; 產(chǎn)生一個(gè)CLK
JB F0,YKQ_DATA_ERR ;
ACALL READ_YKQ_BIT ; 讀取一個(gè)BIT
JB F0,YKQ_DATA_ERR ; 接收一個(gè)BIT是否正確 壓縮求值
MOV A,g_IR_DATA ;
RRC A ; 右移一位
MOV g_IR_DATA,A ;
DJNZ R4,READ_YKQ_DATA ;
YKQ_DATA_ERR: RET ; 返回時(shí)通過F0來表示正確與否
;┌───────┬───────────────-┐;
;│READ_IRKB_BYTE│讀取紅外鍵盤一個(gè)字節(jié)數(shù)據(jù) │;
;└───────┴───────────────-┘;
READ_IRKB_BYTE: MOV R4,#8 ; 接收一個(gè)字節(jié)8位
READ_IRKB_DATA: ACALL IR_CLK ; 產(chǎn)生一個(gè)CLK
JB F0,IRKB_DATA_ERR ;
ACALL READ_IRKB_BIT ; 讀取一個(gè)BIT
JB F0,IRKB_DATA_ERR ; 接收一個(gè)BIT是否正確 壓縮求值
MOV A,g_IR_DATA ;
RRC A ; 右移一位
MOV g_IR_DATA,A ;
DJNZ R4,READ_IRKB_DATA ;
IRKB_DATA_ERR: RET ; 錯(cuò)誤返回
;┌───────┬───────────────-┐;
;│READ_YKQ_BIT │讀取遙控器一個(gè)BIT │;
;└───────┴───────────────-┘;
READ_YKQ_BIT: SETB F0 ; 錯(cuò)誤標(biāo)志
CLR C ; 清除 C 防止以前留下的 C=1
MOV A,g_IR_TMER ; 和最小的比
SUBB A,#c_YKQ_BIT1_E ; 先要掐頭
JC YKQ_BIT_ERR ; C=1 說明 A<c_YKQ_BIT1_E 比最小的還要小 ERR
MOV A,g_IR_TMER ; 和最大的比
SUBB A,#c_YKQ_BIT0_S ; 去尾 增加一個(gè)一樣大的
JNC YKQ_BIT_ERR ; C=0 說明 A>c_YKQ_BIT0_E 比最大的還要大 ERR
MOV A,g_IR_TMER ; 和BIT1比較
SUBB A,#c_YKQ_BIT1_S ; 和c_YKQ_BIT1_S 比小
JC YKQ_BIT_1 ; C=1 說明 c_YKQ_BIT1_E<A<c_YKQ_BIT1_S 是BIT1
MOV A,g_IR_TMER ; C=0 說明 A>c_YKQ_BIT1_S 還要和BIT0比較
SUBB A,#c_YKQ_BIT0_E ; 和c_YKQ_BIT0_E 比大 包括一樣大
JNC YKQ_BIT_0 ; C=0 說明 c_YKQ_BIT0_E<A<c_YKQ_BIT0_S 是BIT0 C=1 說明 c_YKQ_BIT1_S<A<c_YKQ_BIT0_E ERR
RET ; 在 BIT1 和 BIT0 的之間的數(shù)值 可以濾掉 也可以保留 c_YKQ_BIT1_S<A<c_YKQ_BIT0_E
YKQ_BIT_1: SETB C ; BIT1通過C傳遞 C=1
YKQ_BIT_0: CLR F0 ; 處理正確 清除 錯(cuò)誤標(biāo)志 并且C=0 通過C傳遞 BIT0
YKQ_BIT_ERR: RET ; BIT0通過C傳遞 C=0 默認(rèn)
;┌───────┬───────────────-┐;
;│READ_IRKB_BIT │讀取紅外鍵盤一個(gè)BIT │;
;└───────┴───────────────-┘;
READ_IRKB_BIT: SETB F0 ; 錯(cuò)誤標(biāo)志
CLR C ; 清除 C 防止以前留下的 C=1
MOV A,g_IR_TMER ; 和最小的比
SUBB A,#c_IRKB_BIT1_E ; 先要掐頭
JC IRKB_BIT_ERR ; C=1 說明 比最小的還要小 ERR
MOV A,g_IR_TMER ; 和最大的比
SUBB A,#c_IRKB_BIT0_S ; 去尾 增加一個(gè)一樣大的
JNC IRKB_BIT_ERR ; C=0 說明 比最大的還要大 ERR 還有一個(gè)剛好夠減的情況
MOV A,g_IR_TMER ; 和BIT1比較
SUBB A,#c_IRKB_BIT1_S ; 和c_YKQ_BIT1_S 比小
JC IRKB_BIT_1 ; C=1 說明 c_YKQ_BIT1_E<A<c_YKQ_BIT1_S 是BIT1
MOV A,g_IR_TMER ; C=0 說明 A>c_YKQ_BIT1_S 還要和BIT0比較
SUBB A,#c_IRKB_BIT0_E ; 和c_YKQ_BIT1_E 比大 包括一樣大
JNC IRKB_BIT_0 ; C=0 說明 c_YKQ_BIT0_E<A<c_YKQ_BIT0_S 是BIT0 C=1 說明比c_YKQ_BIT1_E 小 ERR
RET ; 在 BIT1 和 BIT0 的之間的數(shù)值 可以濾掉 也可以保留
IRKB_BIT_1: SETB C ; BIT1通過C傳遞 C=1
INC g_BIT1_NUM ; 1 的個(gè)數(shù)計(jì)數(shù)器加一
IRKB_BIT_0: CLR F0 ; 處理正確 清除 錯(cuò)誤標(biāo)志 并且C=0 通過C傳遞 BIT0
IRKB_BIT_ERR: RET ; BIT0通過C傳遞 C=0 默認(rèn)
;┌───────┬───────────────-┐;
;│IR_HEAD │紅外導(dǎo)引頭判斷 │;
;└───────┴───────────────-┘;
IR_HEAD: SETB F0 ; 錯(cuò)誤標(biāo)志
CLR f_YKQ ;
CLR f_YKQ_ACK ;
CLR f_IR_KB ;
CLR f_IR_EKB ;
CLR f_IR_MOUSE ;
MOV A,g_IR_TMER ; 照樣掐頭去尾
SUBB A,#c_YKQ_HEAD_E ; 和最小的比 包含一個(gè)相等的
JC IR_HEAD_ERR ; C=1 說明 比最小的還要小 ERR
MOV A,g_IR_TMER ; 和最大的比
SUBB A,#c_IRMS_HEAD_S ; 去尾
JNC IR_HEAD_ERR ; C=0 說明 比最大的還要大 ERR 還有一個(gè)相等的
MOV A,g_IR_TMER ; 判斷是遙控器還是遙控鍵盤
SUBB A,#c_YKQ_ACK_S ;
JC YKQ_HEAD ; C=1 是遙控器 C=0還要判斷
MOV A,g_IR_TMER ;
SUBB A,#c_IREK_HEAD_E ; 先判斷錯(cuò)誤 會(huì)不會(huì)比最小的還要小
JC IR_HEAD_ERR ; C=1 說明不夠減 即比c_IRMS_HEAD_E小 不在遙控鍵盤范圍
MOV A,g_IR_TMER ;
SUBB A,#c_IREK_HEAD_S ; 判斷鍵盤還是鼠標(biāo)
JNC IRKB_HEAD ; C=0 是紅外鍵盤
SETB f_IR_EKB ; C=1 (包括剛好夠減) 紅外鼠標(biāo)
AJMP IR_HEAD_RET ; 置標(biāo)志位
IRKB_HEAD: MOV A,g_IR_TMER ; 判斷是擴(kuò)展鍵還是普通鍵
SUBB A,#c_IRKB_HEAD_S ;
JNC IREKB_HEAD ; C=0 比大的還大 ERR
SETB f_IR_KB ;
AJMP IR_HEAD_RET ;
IREKB_HEAD: MOV A,g_IR_TMER ;
SUBB A,#c_IRMS_HEAD_E ;
JC IR_HEAD_ERR ;
SETB f_IR_MOUSE ;
AJMP IR_HEAD_RET ;
YKQ_HEAD: MOV A,g_IR_TMER ; 遙控器頭判斷
SUBB A,#c_YKQ_HEAD_S ; 判斷遙控器
JNC YKQ_ACK_HEAD ; C=0 說明夠減 比c_YKQ_HEAD_S大 還有一種等于的 是 ACK
SETB f_YKQ ; C=1 說明是遙控器 不夠減 比c_YKQ_HEAD_S小
AJMP IR_HEAD_RET ;
YKQ_ACK_HEAD: MOV A,g_IR_TMER ;
SUBB A,#c_YKQ_ACK_E ; 和c_YKQ_ACK_E比大
JC IR_HEAD_ERR ; C=1 說明不夠減 比 c_YKQ_ACK_E小 err
SETB f_YKQ_ACK ; C=0 說明夠減 比 c_YKQ_ACK_E大
IR_HEAD_RET: CLR F0 ; 正確判斷 清除標(biāo)志位
IR_HEAD_ERR: RET ;
;┌───────┬───────────────-┐;
;│IR_CLK │等待一個(gè)紅外時(shí)鐘 │;
;└───────┴───────────────-┘;
IR_CLK: SETB F0 ; 錯(cuò)誤標(biāo)志
IR_CLK_UP: JB f_IR_CLK,IR_CLK_DOWN ; 等待時(shí)鐘為1
JNB f_IR_TIME_OVER,IR_CLK_UP ; 判斷 時(shí)間溢出
RET ; 時(shí)間溢出 F0=1 時(shí)間溢出
IR_CLK_DOWN: JNB f_IR_CLK,IR_CLK_RET ; 等待時(shí)鐘為0
JNB f_IR_TIME_OVER,IR_CLK_DOWN ; 判斷 時(shí)間溢出
RET ; 時(shí)間溢出 F0=1 時(shí)間溢出
IR_CLK_RET: MOV g_IR_TMER,g_IR_TMER_DOG ; 傳送本次計(jì)時(shí)數(shù)據(jù)
MOV g_IR_TMER_DOG,#0 ; 計(jì)時(shí)看門狗清零 進(jìn)行下一個(gè)CLK計(jì)時(shí)
CLR F0 ; 正確 清除錯(cuò)誤標(biāo)志
RET ; 處理結(jié)束 F0=1 時(shí)間溢出
;┌───────┬───────────────-┐;
;│OUT_IR_DATA │紅外數(shù)據(jù)壓入數(shù)據(jù)緩沖區(qū) │;
;└───────┴───────────────-┘;
OUT_IR_DATA: MOV R0,g_DATA_SP_E ; 取緩沖區(qū)指針
MOV @R0,g_IR_HEAD1 ; 送數(shù)據(jù)
INC R0 ; 緩沖區(qū)指針加一
MOV @R0,g_IR_HEAD2 ; 送數(shù)據(jù)
INC R0 ;
MOV @R0,g_IR_HEAD3 ;
INC R0 ;
MOV g_DATA_SP_E,R0 ; 保存指針
SETB f_DATA ; 申請(qǐng)輸出數(shù)據(jù)
RET ;
;***************************************************;
;┌─────┬─────────────────-┐;
;│IR_INI │遙控參數(shù)初始化程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │f_IR_IN=1 │;
;└─────┴─────────────────-┘;
IR_INI: CLR IE0 ; 清除紅外中斷
SETB TR1 ; 開定時(shí)器1
SETB ET1 ; 允許定時(shí)器1中斷
SETB EX0 ; 允許外部中斷0中斷
SETB f_IR_CLK ; 置一輸入
RET ;
;***************************************************;
;┌─────┬─────────────────-┐;
;│MYMCU │設(shè)置單片機(jī)的寄存器參數(shù)程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │上電初始化,電源控制 │;
;├─────┼─────────────────-┤;
;│影響資源: │SFR │;
;└─────┴─────────────────-┘;
MYMCU: MOV TMOD,#c_TMOD ; T1編程為方式2定時(shí)狀態(tài),T0編程為方式3定時(shí)狀態(tài)
MOV SCON,#c_SCON ; 串口方式 模式1 數(shù)據(jù)位8 停止位1
MOV PCON,#c_PCON ; 波特率加倍
MOV TL0,#c_TMER0L ; 定時(shí)器0 初值 工作在方式 3 計(jì)數(shù)方式
MOV TH0,#c_TMER0H ; 定時(shí)器0 另外一個(gè)8位定時(shí)器 初值 用TMER1中斷
MOV TL1,#c_TMER1L ; 賦初值
MOV TH1,#c_TMER1H ; 波特率=19200,誤差0( f =11.0592MHz)
SETB IT0 ; 選擇外部中斷 0 工作方式:負(fù)邊沿觸發(fā)方式
SETB IT1 ; 選擇外部中斷 1 工作方式:負(fù)邊沿觸發(fā)方式
CLR TR0 ; 關(guān)閉定時(shí)0
; CLR TR1 ; 開串口波特率
CLR EX0 ; 不允許 外部 0 中斷
CLR ET0 ; 不允許 定時(shí) 0 中斷
CLR EX1 ; 不允許 外部 1 中斷
; CLR ET1 ; 不允許 定時(shí) 1 中斷 串口波特率
; CLR ES ; 不允許 串口 中斷
; CLR PX0 ; 設(shè)置 INT0 中斷的優(yōu)先級(jí)別 最高 紅外
; CLR PT0 ; 設(shè)置 定時(shí)0中斷的優(yōu)先級(jí)別 最高 鼠標(biāo)
; CLR PX1 ; 設(shè)置 INT1 中斷的優(yōu)先級(jí)別 最高 鍵盤
SETB PT1 ; 設(shè)置 定時(shí)1中斷的優(yōu)先級(jí)別 最高 系統(tǒng)時(shí)鐘
; CLR PS ; 設(shè)置 串口 中斷的優(yōu)先級(jí)別 最高
CLR TF0 ; 清除鼠標(biāo)中斷
CLR TF1 ; 清除定時(shí)器1
CLR IE1 ; 清除鍵盤中斷標(biāo)志位
CLR IE0 ; 清除紅外中斷
CLR RI ; 串口接收中斷
SETB EA ; 開啟總中斷
RET ;
;***************************************************;
;┌─────┬─────────────────-┐;
;│ DELAY │軟件延時(shí)程序 │;
;├─────┼─────────────────-┤;
;│影響資源: │R5,R6,R7,g_INT_TMER_MS │;
;└─────┴─────────────────-┘;
INT_DELAY20MS: MOV R7,#20 ;
INT_DEL20MS: ACALL INT_DELAY1MS ;
DJNZ R7,INT_DEL20MS ;
RET ;
INI_DELAY3MS: MOV R6,#3 ;
INI_DEL3MS: ACALL INI_DELAY1MS ;
DJNZ R6,INI_DEL3MS ;
RET ;
INT_DELAY3MS: MOV R5,#3 ;
INT_DEL3MS: ACALL INT_DELAY1MS ;
DJNZ R5,INT_DEL3MS ;
RET ;
INT_DELAY1MS: MOV g_INT_TMER_MS,#0E5H ; 中斷中的延時(shí) 1ms 計(jì)數(shù)值 晶振 11.0592MHZ
NOP ;
NOP ;
DJNZ g_INT_TMER_MS,$-2 ; 延時(shí) 4.4uS
RET ; 用了一個(gè) R6 進(jìn)行參數(shù)傳遞
INI_DELAY1MS: MOV g_INI_TMER_MS,#0E5H ; 初始化主程序中的延時(shí) 1ms 計(jì)數(shù)值 晶振 11.0592MHZ
NOP ;
NOP ;
DJNZ g_INI_TMER_MS,$-2 ; 延時(shí) "R6"ms
RET ; 用了一個(gè) R6 進(jìn)行參數(shù)傳遞
DELAY100US: MOV g_TMER_US,#040H ; 延時(shí) 100Us 計(jì)數(shù)值 晶振 11.0592MHZ 指令周期 1.1US
DJNZ g_TMER_US,$ ; 延時(shí) "g_TMER_US"Us
RET ;
;***************************************************;
; ORG 7FDH ; 最后兩個(gè)字節(jié)
; LJMP MAIN ; 最后一條指令
END ; 代碼結(jié)束
;***************************************************;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -