请教关于CH451参考程序的一个问题?

//************************************************* //输入命令子程序,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()函数里的一样,为什么还要再写一遍呢?

谁能解释一下????????

ch451_read()函数里面关中断了


中断可以直接调用ch451_read();程序没有区别.


对啊?你们公司汇编程序例子里也一样,中断里和查询方式读键盘的程序不一样呢, ; 输入键值子程序 ; EXIT: ACC 键值数据 ; 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 ;送出一位数据 SETB CH451_DCLK ;产生时钟上升沿锁通知CH451输入位数据 DJNZ R7,CH451_READ_4 ;位数据未完继续 SETB CH451_LOAD ;产生加载上升沿通知CH451处理命令数据 CLR A ;先清除键值单元以便移位 MOV R7,#07H ;读入7位键值 CH451_READ_7: MOV C,CH451_DOUT ;读入一位数据 CLR CH451_DCLK ;产生时钟下升沿通知CH451输出下一位 RLC A ;数据移入ACC,高位在前,低位在后 SETB CH451_DCLK DJNZ R7,CH451_READ_7 ;位数据未完继续 CLR IE0 ;清中断标志,读操作过程中有低电平脉冲 SETB EX0 ;允许键盘中断 RET

; 键盘中断子程序 ; USE: 堆栈4字节 CH451_INTER: CLR EX0 PUSH PSW ;现场保护 PUSH ACC CLR CH451_LOAD ;命令开始 MOV A,#0F7H ;读键值命令,忽略12位命令的低8位,高4位用作结束标志 CH451_INTER_4: SETB C ;在高位添0以检测位数据结束 RRC A ;低位在前,高位在后 CLR CH451_DCLK MOV CH451_DIN,C ;送出一位数据 SETB CH451_DCLK ;产生时钟上升沿锁通知CH451输入位数据 CJNE A,#0FFH,CH451_INTER_4 ;位数据未完继续,共4位,完成后为0FFH SETB CH451_LOAD ;产生加载上升沿通知CH451处理命令数据 MOV A,#0FCH ;该数据用以检测位数据结束 CH451_INTER_7: MOV C,CH451_DOUT ;读入一位数据 CLR CH451_DCLK ;产生时钟下升沿通知CH451输出下一位 RLC A ;数据移入ACC,高位在前,低位在后 SETB CH451_DCLK JC CH451_INTER_7 ;位数据未完继续,共7位,完成后才移出0 MOV CH451_KEY,A ;保存键值 POP ACC POP PSW CLR IE0 ;清中断标志,该指令需根据实际情况作修改 SETB EX0 RETI 如果程序没有区别的话,为什么有些参数不一样呢? 还有就是显示正常,按键没有中断产生,是怎么回事啊?


只有登录才能回复,可以选择微信账号登录