?? ir_uart.asm
字號(hào):
LED_WINK_LOOP: CPL f_LED2 ;
CALL INT_DELAY20MS ;
DJNZ g_SOFT_DOG,LED_WINK_LOOP ;
RET ;
;****************************************************
IROUT_DATA: CALL IROUT_DA_HEAD ; 發(fā)射紅外導(dǎo)引頭
MOV A,g_IR_HEAD1 ;
CALL IROUT_BYTE ;
MOV A,g_IR_HEAD2 ;
CALL IROUT_BYTE ;
MOV A,g_IR_HEAD3 ;
CALL IROUT_BYTE ;
MOV A,g_IR_HEAD3 ;
CPL A ;
CALL IROUT_BYTE ;
MOV R6,#17H ;
IROUT_DA_END: CALL IROUT_LOW ;
DJNZ R6,IROUT_DA_END ;
RET ;
;****************************************************
IROUT_BYTE: MOV R2,#8 ;
CLR C ;
IROUT_BYTE1: RRC A ; 低位在前
JC IROUT_DA_BIT1 ; 判斷是1還是0
MOV R6,#17H ;
IROUT_DA_BIT0: CALL IROUT_LOW ;
DJNZ R6,IROUT_DA_BIT0 ;
MOV R6,#14H ;
IROUT_DA_BIT01: CALL IROUT_HIGH ;
DJNZ R6,IROUT_DA_BIT01 ;
AJMP IROUT_BYTE_LOOP ;
IROUT_DA_BIT1: MOV R6,#17H ;
IROUT_DA_BIT11: CALL IROUT_LOW ;
DJNZ R6,IROUT_DA_BIT11 ;
MOV R6,#3FH ;
IROUT_DA_BIT12: CALL IROUT_HIGH ;
DJNZ R6,IROUT_DA_BIT12 ;
IROUT_BYTE_LOOP:DJNZ R2,IROUT_BYTE1 ;
RET ;
;****************************************************
IROUT_DA_HEAD: MOV R7,#2 ;
MOV R6,#05DH ;
IROUT_DA_HEAD1: CALL IROUT_LOW ;
DJNZ R6,IROUT_DA_HEAD1 ;
DJNZ R7,IROUT_DA_HEAD1 ;
MOV R6,#0AAH ;
IROUT_DA_HEAD2: CALL IROUT_HIGH ;
DJNZ R6,IROUT_DA_HEAD2 ;
RET ;
;****************************************************
IROUT_LOW: SETB f_IR_OUT ;
MOV R1,#3 ;
DJNZ R1,$ ;
CLR f_IR_OUT ;
MOV R1,#4 ;
DJNZ R1,$ ;
RET ;
IROUT_HIGH: CLR f_IR_OUT ;
MOV R1,#8 ;
DJNZ R1,$ ;
RET ;
;***************************************************;
;┌─────┬─────────────────-┐;
;│INT_TMER1 │定時(shí)器1中斷服務(wù)程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │定時(shí)器中斷 1 產(chǎn)生 │;
;├─────┼─────────────────-┤;
;│出口參數(shù): │ │;
;├─────┼─────────────────-┤;
;│影響資源: │g_IR_TIME、g_WINK_TMER │;
;└─────┴─────────────────-┘;
INT_TMER1: MOV TH0,#c_TMER0H+08H ; 定時(shí)器0 另外一個(gè)8位定時(shí)器 初值 用TMER1中斷 50US
JNB f_LED_WINK,IR_TIME ;
DJNZ g_WINK_TMER,IR_TIME ;
MOV g_WINK_TMER,#255 ;
CPL f_LED1 ;
DJNZ g_WINK_TMER1,IR_TIME ;
MOV g_WINK_TMER1,#4 ;
CLR f_LED_WINK ;
IR_TIME: DJNZ g_IR_TMER_DOG,TMER1_RETI ;
SETB f_IR_TIME_OVER ;
DJNZ g_IR_TMER_DOG1,TMER1_RETI ;
MOV g_IR_TMER_DOG1,#c_TMER_OVER ;
SETB f_TIME_OVER ; 定時(shí)器溢出標(biāo)志 溢出時(shí)間:122880us
TMER1_RETI: RETI ;
;***************************************************;
;┌─────┬─────────────────-┐;
;│INT_UART │串口接收中斷程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │串口接收中斷產(chǎn)生 RI=1 │;
;├─────┼─────────────────-┤;
;│出口參數(shù): │ACC=SBUF │;
;├─────┼─────────────────-┤;
;│影響資源: │ACC │;
;└─────┴─────────────────-┘;
;***************************************************;
;┌─────┬─────────────────-┐;
;│INT_MOUSE │鼠標(biāo)處理程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │TMER0 計(jì)數(shù)溢出中斷 產(chǎn)生 │;
;├─────┼─────────────────-┤;
;│出口參數(shù): │鼠標(biāo)數(shù)據(jù):g_MOUSE_HEAD1-3 │;
;├─────┼─────────────────-┤;
;│影響資源: │ACC,PSW,g_MOUSE_DATA,g_MOUSE_HEAD1 │;
;└─────┴─────────────────-┘;
;***************************************************;
;┌─────┬─────────────────-┐;
;│INT_KB │鍵盤(pán)處理程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │外部中斷 1 產(chǎn)生 鍵盤(pán)CLK中斷 │;
;├─────┼─────────────────-┤;
;│出口參數(shù): │鍵盤(pán)數(shù)據(jù):g_KB_HEAD1-3 │;
;├─────┼─────────────────-┤;
;│影響資源: │ACC,PSW,g_KB_DATA,g_KB_HEAD1-3 │;
;└─────┴─────────────────-┘;
;***************************************************;
;┌─────┬─────────────────-┐;
;│INT_IRDA │紅外中斷服務(wù)程序 │;
;├─────┼─────────────────-┤;
;│入口參數(shù): │外部中斷 0 產(chǎn)生 紅外CLK中斷 │;
;├─────┼─────────────────-┤;
;│出口參數(shù): │紅外數(shù)據(jù):g_IR_HEAD1-3 │;
;├─────┼─────────────────-┤;
;│影響資源: │ACC,PSW,g_IR_DATA,g_IR_HEAD1-3 │;
;└─────┴─────────────────-┘; 所有處理在CLK為低的時(shí)候
INT_IRDA: PUSH ACC ; ACC壓棧
MOV g_IR_TMER_DOG,#0 ; 計(jì)時(shí)看門(mén)狗清零
MOV g_IR_TMER_DOG1,#c_TMER_OVER ;
CLR f_IR_TIME_OVER ; 計(jì)時(shí)清零
ACALL IR_CLK ; 導(dǎo)引頭時(shí)鐘
JB F0,INT_IRDA_ERR ; 判斷導(dǎo)引頭的時(shí)鐘是否正確
ACALL IR_HEAD ; 判斷引導(dǎo)頭
JB F0,INT_IRDA_ERR ; 判斷導(dǎo)引頭數(shù)據(jù)是否正確
JB f_YKQ,IR_TASK1 ; 是遙控器嗎?
JB f_YKQ_ACK,IR_TASK2 ; 是遙控器應(yīng)答嗎?
JB f_IR_KB,IR_TASK3 ; 是遙控鍵盤(pán)普通鍵嗎?
JB f_IR_EKB,IR_TASK4 ; 是遙控鍵盤(pán)擴(kuò)展鍵嗎?
JB f_IR_MOUSE,IR_TASK5 ; 是遙控鼠標(biāo)嗎?
INT_IRDA_ERR: ACALL INT_DELAY20MS ; 要延時(shí)到干擾過(guò)去 都不是 肯定有問(wèn)題?或者是干擾 錯(cuò)誤處理中繼站
CLR F0 ; 清除錯(cuò)誤標(biāo)志 錯(cuò)誤標(biāo)志只在本身自己的模塊中起作用 不要對(duì)其他模塊造成影響
IRDA_RETI: SETB f_IR_CLK ;
MOV TL0,#c_TMER0L ; 送0FFH 確保下次還能中斷
CLR TF0 ; 清除鼠標(biāo)中斷
CLR IE1 ; 清除鍵盤(pán)中斷標(biāo)志位
CLR IE0 ; 清除紅外中斷
POP ACC ; ACC出棧
RETI ; 中斷返回
;***************************************************;
IR_TASK1: AJMP YKQ ; 遙控器
IR_TASK2: AJMP YKQ_ACK ; 遙控器應(yīng)答
IR_TASK3: AJMP IR_KB ; 遙控鍵盤(pán)普通鍵
IR_TASK4: AJMP IR_EKB ; 遙控鍵盤(pán)擴(kuò)展鍵
IR_TASK5: AJMP IR_MOUSE ; 遙控鼠標(biāo)
;***************************************************;
;┌───────┬───────────────-┐;
;│YKQ │紅外遙控器處理 │; IR_TASK1
;└───────┴───────────────-┘;
YKQ: ACALL READ_YKQ_BYTE ; 遙控器處理 讀一個(gè)字節(jié)數(shù)據(jù)
JB F0,YKQ_ERR ; 接收一個(gè)字節(jié)是否正確
MOV g_IR_HEAD1,A ; 保存
ACALL READ_YKQ_BYTE ;
JB F0,YKQ_ERR ;
MOV g_IR_HEAD2,A ;
ACALL READ_YKQ_BYTE ;
JB F0,YKQ_ERR ;
MOV g_IR_HEAD3,A ;
ACALL READ_YKQ_BYTE ; 第3個(gè)字節(jié)的反碼
JB F0,YKQ_ERR ;
CPL A ; 取反
CJNE A,g_IR_HEAD3,YKQ_ERR ; 比較反碼是否正確
CLR f_TIME_OVER ; 時(shí)間溢出標(biāo)志 初始化
ACALL OUT_IR_DATA ; 送出數(shù)據(jù)
MOV g_YKQ_DELAY,#c_YKQKEY_delay ; 遙控器連健重碼連發(fā)個(gè)數(shù)初值
AJMP IRDA_RETI ;
YKQ_ERR: AJMP INT_IRDA_ERR ; 錯(cuò)誤處理中繼站
;┌───────┬───────────────-┐;
;│YKQ_ACK │處理應(yīng)答信號(hào) │; IR_TASK2
;└───────┴───────────────-┘;
YKQ_ACK: JB f_TIME_OVER,YKQ_ACK_RET ; 判斷是否時(shí)間有溢出過(guò) 時(shí)間溢出過(guò)是不處理應(yīng)答信號(hào)
DJNZ g_YKQ_DELAY,YKQ_ACK_RET ; 計(jì)數(shù)器還沒(méi)有為0
MOV g_YKQ_DELAY,#c_YKQKEY_again ; 遙控器重碼連發(fā)個(gè)數(shù)初值
ACALL OUT_IR_DATA ; 遙控器應(yīng)答處理 送出數(shù)據(jù)
YKQ_ACK_RET: AJMP IRDA_RETI ;
;┌───────┬───────────────-┐;
;│IR_KB │紅外鍵盤(pán)普通鍵處理 │; IR_TASK3
;└───────┴───────────────-┘;
IR_KB: ACALL IR_BIT4 ; 前面4bit的處理都一樣 為了節(jié)省代碼做成子程序的方式
JB F0,IR_KB_ERR ; 判斷時(shí)候處理成功
MOV g_BIT1_NUM,#0 ; 1的計(jì)數(shù)器清零
ACALL READ_IRKB_BYTE ; 讀取一個(gè)字節(jié)
JB F0,IR_KB_ERR ;
MOV g_IR_HEAD3,A ;
MOV g_IR_HEAD2,B ; 前4bit 放在第二個(gè)字節(jié)
JBC B.3,IR_KEY_DM ; B.3=0通碼 B.3=1 斷碼
JB f_TIME_OVER,IR_KEY_TM ; 通碼判斷是否第一鍵 立即發(fā) 通過(guò)判斷時(shí)間有沒(méi)有溢出 可知是否第一次按鍵
DJNZ g_IRKB_DELAY,IR_KB_RET ; 計(jì)數(shù)延時(shí)
MOV g_IRKB_DELAY,#c_IRKB_again ; 接下來(lái)的 按鍵延時(shí)相對(duì)較短
AJMP IR_KB_DATA ;
IR_KEY_TM: MOV g_IRKB_DELAY,#c_IRKB_delay ; 初始化 按鍵延時(shí) 放在斷碼發(fā)送之后 因?yàn)閿啻a發(fā)送之后肯定要接收通碼
CLR f_TIME_OVER ; 時(shí)間溢出標(biāo)志 初始化
AJMP IR_KB_DATA ;
IR_KEY_DM: SETB f_TIME_OVER ;
IR_KB_DATA: MOV A,g_BIT1_NUM ; 斷碼 立即發(fā)
CJNE A,B,IR_KB_ERR ; 計(jì)算1的個(gè)數(shù)是否正確
MOV g_IR_HEAD1,#c_IR_KB ; 紅外鍵盤(pán)擴(kuò)展鍵 導(dǎo)引頭
ACALL OUT_IR_DATA ; 送出數(shù)據(jù)
IR_KB_RET: AJMP IRDA_RETI ;
IR_KB_ERR: AJMP INT_IRDA_ERR ; 錯(cuò)誤處理中繼站
;┌───────┬───────────────-┐;
;│IR_EKB │紅外鍵盤(pán)擴(kuò)展鍵處理 │; IR_TASK4
;└───────┴───────────────-┘;
IR_EKB: ACALL IR_BIT4 ; 前面4bit的處理都一樣 為了節(jié)省代碼做成子程序的方式
JB F0,IR_EKB_ERR ;
MOV g_BIT1_NUM,#0 ; 1的計(jì)數(shù)器清零
ACALL READ_IRKB_BYTE ;
JB F0,IR_EKB_ERR ;
MOV g_IR_HEAD2,A ;
ACALL READ_IRKB_BYTE ;
JB F0,IR_EKB_ERR ;
MOV g_IR_HEAD3,A ;
MOV A,g_BIT1_NUM ;
CJNE A,B,IR_EKB_ERR ; 計(jì)算1的個(gè)數(shù)是否正確
MOV g_IR_HEAD1,#c_IR_EKB ; 紅外鍵盤(pán)擴(kuò)展鍵 導(dǎo)引頭
MOV A,g_IR_HEAD3 ;
IRKB_Alt: CJNE A,#c_IRKB_Alt,IRKB_Ctrl ; 判斷是 Alt
AJMP IRDA_RETI ;
IRKB_Ctrl: CJNE A,#c_IRKB_Ctrl,IRKB_Shift ; 判斷是 Ctrl
AJMP IRDA_RETI ;
IRKB_Shift: CJNE A,#c_IRKB_Shift,IRKB_Shift_R; 判斷是 Shift
AJMP IRDA_RETI ;
IRKB_Shift_R: CJNE A,#c_IRKB_Shift_R,IRKB_Win ; 判斷是 Shift_R
AJMP IRDA_RETI ;
IRKB_Win: CJNE A,#c_IRKB_Win,IRKB_KEY ; 判斷是 Win
AJMP IRDA_RETI ;
IRKB_KEY: JB f_TIME_OVER,IR_EKEY_TM ; 通碼判斷是否第一鍵 立即發(fā) 通過(guò)判斷時(shí)間有沒(méi)有溢出 可知是否第一次按鍵
DJNZ g_IRKB_DELAY,IR_EKB_RET ; 計(jì)數(shù)延時(shí)
MOV g_IRKB_DELAY,#c_IRKB_again ; 接下來(lái)的 按鍵延時(shí)相對(duì)較短
AJMP IR_EKB_DATA ;
IR_EKEY_TM: MOV g_IRKB_DELAY,#c_IRKB_delay ; 初始化 按鍵延時(shí) 放在斷碼發(fā)送之后 因?yàn)閿啻a發(fā)送之后肯定要接收通碼
CLR f_TIME_OVER ; 時(shí)間溢出標(biāo)志 初始化
IR_EKB_DATA: ACALL OUT_IR_DATA ; 送出數(shù)據(jù)
IR_EKB_RET: AJMP IRDA_RETI ;
IR_EKB_ERR: AJMP INT_IRDA_ERR ; 錯(cuò)誤處理中繼站
;┌───────┬───────────────-┐;
;│IR_MOUSE │紅外鼠標(biāo)處理 │; IR_TASK5
;└───────┴───────────────-┘;
IR_MOUSE: ACALL IR_BIT4 ; 前面4bit的處理都一樣 為了節(jié)省代碼做成子程序的方式
JB F0,IR_MOUSE_ERR ;
MOV g_BIT1_NUM,#0 ; 1的計(jì)數(shù)器清零
ACALL READ_IRKB_BYTE ;
JB F0,IR_MOUSE_ERR ;
MOV g_IR_HEAD2,A ;
ACALL READ_IRKB_BYTE ;
JB F0,IR_MOUSE_ERR ;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -