//************************************************* //輸入命令子程序,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ù)里的一樣,為什么還要再寫一遍呢?
誰能解釋一下????????