//************************************************* //输入命令子程序,MCU从451读一字节 unsigned char ch451_read() { unsigned char i; unsigned char command,keycode; //定义命令字,和数据存储器 EX1=0; //关中段 command=0x07; //输入读451命令字 ch451_load=0; for(i=0;i<4;i++){ ch451_din=command&1; //送入最低位 ch451_dclk=0; command>>=1; //往右移一位 ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据 } ch451_load=1; //产生加载上升沿通知CH451处理命令数据 keycode=0; //清除keycode for(i=0;i<7;i++){ keycode<<=1; //数据移入keycode,高位在前,低位在后 keycode|=ch451_dout; //从高到低读入451的数据 ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位 ch451_dclk=1; } IE1=0; //清中断标志 EX1=1; return(keycode); //反回键值 } //************************************************* //中断子程序 使用中断2,寄存器组1
void ch451_inter() interrupt 2 using 1 { unsigned char i; //定义循环变量 unsigned char command,keycode; //定义控制字寄存器,和中间变量定时器 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; //产生时钟上升沿锁通知CH451输入位数据 } ch451_load=1; //产生加载上升沿通知CH451处理命令数据 keycode=0; //清除keycode for(i=0;i<7;i++){ keycode<<=1; //数据作移一位,高位在前,低位在后 keycode|=ch451_dout; //从高到低读入451的数据 ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位 ch451_dclk=1; } ch451_key=keycode; //保存上次的键值 IE1=0; //清中断标志 }
//***********************************************
#endif
中断可不可以直接调用 ch451_read() 函数??? 中断里的程序和 ch451_read()函数里的一样,为什么还要再写一遍呢?
谁能解释一下????????