請(qǐng)教關(guān)于CH451參考程序的一個(gè)問題?

//************************************************* //輸入命令子程序,MCU從451讀一字節(jié) unsigned char ch451_read() { unsigned char i; unsigned char command,keycode; //定義命令字,和數(shù)據(jù)存儲(chǔ)器 EX1=0; //關(guān)中段 command=0x07; //輸入讀451命令字 ch451_load=0; for(i=0;i<4;i++){ ch451_din=command&1; //送入最低位 ch451_dclk=0; command>>=1; //往右移一位 ch451_dclk=1; //產(chǎn)生時(shí)鐘上升沿鎖通知CH451輸入位數(shù)據(jù) } ch451_load=1; //產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù) keycode=0; //清除keycode for(i=0;i<7;i++){ keycode<<=1; //數(shù)據(jù)移入keycode,高位在前,低位在后 keycode|=ch451_dout; //從高到低讀入451的數(shù)據(jù) ch451_dclk=0; //產(chǎn)生時(shí)鐘下升沿通知CH451輸出下一位 ch451_dclk=1; } IE1=0; //清中斷標(biāo)志 EX1=1; return(keycode); //反回鍵值 } //************************************************* //中斷子程序 使用中斷2,寄存器組1

void ch451_inter() interrupt 2 using 1 { unsigned char i; //定義循環(huán)變量 unsigned char command,keycode; //定義控制字寄存器,和中間變量定時(shí)器 command=0x07; //讀取鍵值命令的高4位0111B ch451_load=0; //命令開始 for(i=0;i<4;i++){ ch451_din=command&1; //低位在前,高位在后 ch451_dclk=0; command>>=1; //右移一位 ch451_dclk=1; //產(chǎn)生時(shí)鐘上升沿鎖通知CH451輸入位數(shù)據(jù) } ch451_load=1; //產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù) keycode=0; //清除keycode for(i=0;i<7;i++){ keycode<<=1; //數(shù)據(jù)作移一位,高位在前,低位在后 keycode|=ch451_dout; //從高到低讀入451的數(shù)據(jù) ch451_dclk=0; //產(chǎn)生時(shí)鐘下升沿通知CH451輸出下一位 ch451_dclk=1; } ch451_key=keycode; //保存上次的鍵值 IE1=0; //清中斷標(biāo)志 }

//***********************************************

#endif

中斷可不可以直接調(diào)用 ch451_read() 函數(shù)??? 中斷里的程序和 ch451_read()函數(shù)里的一樣,為什么還要再寫一遍呢?

誰能解釋一下????????

ch451_read()函數(shù)里面關(guān)中斷了


中斷可以直接調(diào)用ch451_read();程序沒有區(qū)別.


對(duì)啊?你們公司匯編程序例子里也一樣,中斷里和查詢方式讀鍵盤的程序不一樣呢, ; 輸入鍵值子程序 ; EXIT: ACC 鍵值數(shù)據(jù) ; USE: ACC, R7 CH451_READ: CLR EX0 ;禁止鍵盤中斷 CLR CH451_LOAD ;命令開始 MOV A,#07H ;讀取鍵值命令的高4位0111B MOV R7,#04H ;忽略12位命令的低8位 CH451_READ_4: RRC A ;低位在前,高位在后 CLR CH451_DCLK MOV CH451_DIN,C ;送出一位數(shù)據(jù) SETB CH451_DCLK ;產(chǎn)生時(shí)鐘上升沿鎖通知CH451輸入位數(shù)據(jù) DJNZ R7,CH451_READ_4 ;位數(shù)據(jù)未完繼續(xù) SETB CH451_LOAD ;產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù) CLR A ;先清除鍵值單元以便移位 MOV R7,#07H ;讀入7位鍵值 CH451_READ_7: MOV C,CH451_DOUT ;讀入一位數(shù)據(jù) CLR CH451_DCLK ;產(chǎn)生時(shí)鐘下升沿通知CH451輸出下一位 RLC A ;數(shù)據(jù)移入ACC,高位在前,低位在后 SETB CH451_DCLK DJNZ R7,CH451_READ_7 ;位數(shù)據(jù)未完繼續(xù) CLR IE0 ;清中斷標(biāo)志,讀操作過程中有低電平脈沖 SETB EX0 ;允許鍵盤中斷 RET

; 鍵盤中斷子程序 ; USE: 堆棧4字節(jié) CH451_INTER: CLR EX0 PUSH PSW ;現(xiàn)場(chǎng)保護(hù) PUSH ACC CLR CH451_LOAD ;命令開始 MOV A,#0F7H ;讀鍵值命令,忽略12位命令的低8位,高4位用作結(jié)束標(biāo)志 CH451_INTER_4: SETB C ;在高位添0以檢測(cè)位數(shù)據(jù)結(jié)束 RRC A ;低位在前,高位在后 CLR CH451_DCLK MOV CH451_DIN,C ;送出一位數(shù)據(jù) SETB CH451_DCLK ;產(chǎn)生時(shí)鐘上升沿鎖通知CH451輸入位數(shù)據(jù) CJNE A,#0FFH,CH451_INTER_4 ;位數(shù)據(jù)未完繼續(xù),共4位,完成后為0FFH SETB CH451_LOAD ;產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù) MOV A,#0FCH ;該數(shù)據(jù)用以檢測(cè)位數(shù)據(jù)結(jié)束 CH451_INTER_7: MOV C,CH451_DOUT ;讀入一位數(shù)據(jù) CLR CH451_DCLK ;產(chǎn)生時(shí)鐘下升沿通知CH451輸出下一位 RLC A ;數(shù)據(jù)移入ACC,高位在前,低位在后 SETB CH451_DCLK JC CH451_INTER_7 ;位數(shù)據(jù)未完繼續(xù),共7位,完成后才移出0 MOV CH451_KEY,A ;保存鍵值 POP ACC POP PSW CLR IE0 ;清中斷標(biāo)志,該指令需根據(jù)實(shí)際情況作修改 SETB EX0 RETI 如果程序沒有區(qū)別的話,為什么有些參數(shù)不一樣呢? 還有就是顯示正常,按鍵沒有中斷產(chǎn)生,是怎么回事啊?


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频