

再貼上程序
K1 bit P2.3 ;按鍵的I/O口 key_state EQU 20H ;消抖和防止一直觸發(fā)用的 key_step EQU 21H ;任務(wù)標(biāo)志 ORG 0000H SJMP STAR ORG 1BH LJMP Timer0_intrrupt ;裝T1中斷服務(wù)程序 star: mov key_state,#00H ;初始化 mov key_step,#00H mov P1,#0ffH mov IE,#88H ; mov TMOD,#10H mov TH1,#0D8H mov TL1,#0EFH setb TR1 ;啟動(dòng)T18 setb EA loop: key_switch: jb key_step.0, key_low_step1 ;查詢要執(zhí)行什么任務(wù) jb key_step.1, key_low_step2 jb key_step.2, key_low_step3 jb key_step.3, key_low_step4 jb key_step.4, key_low_step5 jb key_step.5, key_low_step6 jb key_step.6, key_low_step7 jb key_step.7, key_low_step8 key_low_step0: mov P1,#00H ; 上電就執(zhí)行的任務(wù)不一定是點(diǎn)LED燈 jmp loop key_low_step1: mov P1,#01H ;任務(wù)一 不一定是點(diǎn)LED燈 jmp loop key_low_step2: mov P1,#02H ;任務(wù)二 不一定是點(diǎn)LED燈 jmp loop key_low_step3: mov P1,#04H ;;任務(wù)三 不一定是點(diǎn)LED燈 jmp loop key_low_step4: mov P1,#08H ;任務(wù)四 不一定是點(diǎn)LED燈 jmp loop key_low_step5: mov P1,#10H ;任務(wù)五 不一定是點(diǎn)LED燈 jmp loop key_low_step6: mov P1,#20H ;任務(wù)六 不一定是點(diǎn)LED燈 jmp loop key_low_step7: mov P1,#40H ;任務(wù)七 不一定是點(diǎn)LED燈 jmp loop key_low_step8: mov P1,#80H ;任務(wù)八 不一定是點(diǎn)LED燈 jmp loop key_check: ;檢測按鍵 jb K1,key_high key_low: ;有按下可能是抖動(dòng) jb key_state.0,key_unchange setb key_state.0 ret key_high: ;沒按下 mov key_state,#00H mov a,key_step cjne a,#00H,exit mov P1,#00H exit: ret key_unchange: ;確定按下,是不是已經(jīng)觸發(fā) jb key_state.1,exit setb key_state.1 mov a,key_step jz key_unchange11 key_unchange1: ;確定按下 rl a mov key_step,a ret key_unchange11 : mov key_step,#01H ret Timer0_intrrupt: ;中斷服務(wù)函數(shù) clr EA mov TH1,#0D8H mov TL1,#0EFH acall key_check ;掃描按鍵 setb EA exit_interrupt: reti END
最后來介紹一下程序要實(shí)現(xiàn)什么功能
這個(gè)小程序主要是為了學(xué)習(xí)用定時(shí)器定時(shí)器來掃描按鍵
一上電就運(yùn)行
key_low_step0的任務(wù)
然后通過按鍵來切換任務(wù)(這里只是用每一個(gè)LED燈來表示一個(gè)任務(wù)當(dāng)然key_low_step0的任務(wù)全亮不是所有任務(wù)都執(zhí)行)
不是為了讓LED輪了點(diǎn)亮,如果是讓LED燈輪流點(diǎn)亮完全不用那么麻煩
shcp EQU P2.0 ; //數(shù)據(jù)在上升沿進(jìn)入移位寄存器 date1 EQU P2.1 ; //串行數(shù)據(jù)輸入端 clock EQU P2.2 ; //上升沿時(shí)將數(shù)據(jù)輸出到并行端口 send_data EQU 20H i EQU 30H ORG 0000H ljmp start start: mov i,#0 loop: clr clock mov dptr,#tab ;發(fā)送給第一片595 movc a,@a+dptr mov send_data,a lcall _74hc595_send_data mov dptr,#tab1 ;發(fā)送給第二片595 mov a,i movc a,@a+dptr mov send_data,a lcall _74hc595_send_data setb clock lcall delay_ms inc i mov a,i cjne a,#16,loop ljmp start _74hc595_send_data: ;74hc595發(fā)送數(shù)據(jù)子函數(shù) mov r0,#00H mov a,send_data loop_07_1: clr shcp rlc a mov date1,C setb shcp inc r0 cjne r0,#08H,loop_07_1 ret delay_ms : MOV R6,#0ffH DEL1: MOV R7,#250 DJNZ R7,$ DJNZ R6,DEL1 RET tab: DB 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff tab1: DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe end
這個(gè)程序就是傳說中的流水燈
今天不小心看到了74hc595連級的圖,就有了寫程序的沖動(dòng),最近學(xué)了點(diǎn)匯編,就用匯編寫一下
;///////////////////////////////////////////////////////////////////////////////////////// ;//矩陣鍵盤0—15按下按鍵顯示對應(yīng)的數(shù)值 ,沒按之前顯示"_" ;// ;//////////////////////////////////////////////////////////////////////////////////////// Key EQU P3 ;矩陣鍵盤接的I/O口 key_state EQU 20H ;用來標(biāo)記消抖和防止多次觸發(fā) key_step_buffer EQU 30H ;消抖時(shí)鍵值的保存 key_step EQU 35H ;存儲(chǔ)鍵值 key_count EQU 36H ;查表計(jì)數(shù) ORG 0000H SJMP STAR ORG 1BH LJMP Timer0_intrrupt ;裝T1中斷服務(wù)程序 ;///////////////////////////////////////////////////////////////////////////////////////// ;//初始化 ;// ;//////////////////////////////////////////////////////////////////////////////////////// star: mov key_state,#00H mov key_step,#00H mov key_step_buffer,#00H mov P0,#0ffH mov P1,#0ffH mov P2,#0aaH mov IE,#088H ; mov TMOD,#010H mov TH1, #0D8H mov TL1, #0EFH setb TR1 ;啟動(dòng)T1 setb EA ;///////////////////////////////////////////////////////////////////////////////////////// ;//主程序一直循環(huán)顯示 ;// ;//////////////////////////////////////////////////////////////////////////////////////// loop: lcall keystep_disp ; mov P0,key_step; ljmp loop ;///////////////////////////////////////////////////////////////////////////////////////// ;//鍵值顯示程序 ;// ;//////////////////////////////////////////////////////////////////////////////////////// keystep_disp: mov a,key_step cjne a,#00H,keystep_disp_1 ;判斷是否都沒按過 mov P0,#0f7h ret keystep_disp_1: mov key_count,#0ffH mov dptr,#kcodtab rk_none: clr a movc a,@a+dptr inc dptr inc key_count cjne a,key_step,rk_none ;按鍵查表 mov a, key_count mov dptr,#segtab2 movc a,@a+dptr ;數(shù)碼管查表 mov p0,a lcall delay ret ;///////////////////////////////////////////////////////////////////////////////////////// ;//功能:按鍵掃描 ;//方法:線反轉(zhuǎn)法 ;//////////////////////////////////////////////////////////////////////////////////////// key_check: mov Key,#0f0H mov a,Key cjne a,#0f0H,key_low key_high: mov key_state,#00H ;沒鍵按下,標(biāo)志位清零 exit: ret key_low: jb key_state.0,key_unchange_1;有鍵按下判斷是否抖動(dòng) setb key_state.0 mov Key,#0f0H mov a,Key orl a,#0fH mov Key,a mov key_step_buffer,Key ret key_unchange_1: jb key_state.1,exit mov Key,#0f0H mov a,Key orl a,#0fH mov Key,a mov a,Key cjne a,Key_step_buffer,key_high setb key_state.1 ;確定有鍵按下,自鎖 mov key_step,Key_step_buffer ret ;///////////////////////////////////////////////////////////////////////////////////////// ;//Timer0中斷服務(wù)程序 ;//功能:定時(shí)掃描按鍵 ;//////////////////////////////////////////////////////////////////////////////////////// Timer0_intrrupt: mov TH1,#0D8H mov TL1,#0EFH acall key_check ;檢測按鍵 exit_interrupt: reti ;///////////////////////////////////////////////////////////////////////////////////////// ;//延時(shí)子程序 ;// ;//////////////////////////////////////////////////////////////////////////////////////// delay: mov r3,#20 delay1: mov r4,#50 djnz r4,$ djnz r3,delay1 ret ;///////////////////////////////////////////////////////////////////////////////////////// ;//kcodtab 按鍵0——15對應(yīng)的鍵值 ;//segtab2 共陽數(shù)碼管對應(yīng)的0——9 ;//////////////////////////////////////////////////////////////////////////////////////// kcodtab: db 11101110b,11011110b,10111110b,1111110b db 11101101b,11011101b,10111101b,1111101b db 11101011b,11011011b,10111011b,1111011b db 11100111b,11010111b,10110111b,1110111b segtab2: db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh END