keil里面的if(key1==0)前面加了while(1)此后不管key1是不是等于0,if后面的执行语句都没有反应了?

把程序编译时的提示信息,以及你工程的选项页面(Options for Target xxx)贴出来。你的程序或许根本没有正常编译,跳转到了与工程配置不符的地址段。追问运行到while(!TI)的时候提示错误,去掉if(key1==0)   /*按下key0发送0x01*/{delayms(10);if(key1==0){while(!key1);key=0x02;send(key);} }这一部分就能成功追答你开了串口中断,然而中断服务函数呢?这不跑飞才怪……要么把中断关掉……老老实实先查询方式工作;要么添加串口中断服务函数www.shufadashi.com防采集。

key1变量的赋值是在中断程序里吧?如果是这样,变量key1申明时应该加上关键字volatile,如volatile char key1;不加此关键字编译器会把当前局部的key1变量优化成一个寄存器变量,永远不去读取全局变量,你去看看汇编代码就知道了。新手进阶时都会碰到此问题,恭喜你要步入老手行列了!回答完了才看到你采用降低优化等级来绕过,这是治标不治本的办法,当你程序太大了或其它什么原因需要提高优化等级时你现在采用的办法不可行。

主程序中调用3个子程序,画红框的3个,子程序写在头文件中了吗。还有变量keyval,调用Key_Scan( )函数后并不会改变的,初值为0,将始终为0,switch语句根据keyval去跳转没有意义。

key1变量的赋值是在中bai断程du序里吧?如果是这样,变zhi量key1申明时应该加上关键字daovolatile,如volatile char key1;不加此关专键字编译器会把当前局部属的key1变量优化成一个寄存器变量,永远不去读取全局变量,你去看看汇编代码就知道了。新手进阶时都会碰到此问题,恭喜你要步入老手行列了!回答完了才看到你采用降低优化等级来绕过,这是治标不治本的办法,当你程序太大了或其它什么原因需要提高优化等级时你现在采用的办法不可行,你的key1是什么?是外部中断里改变的变量吗,你敢把中断程序放上来吗?如果是,你是不是没有进中断啊?或者进来中断就没出来了追问前面有sbit key1= P1^0,问题解决了,确实是if被优化掉了。把优化级别设为1就成功了。追答好吧,解决了问题就好,应该不是,我觉得是单片机执行太快,你的按键效果不好。加上延时试试!追问我加了while循环的啊,这得看你的key1是什么了,这里的key1是要在循环的时候被动态改变的,凡是指向硬件地址或在定时器里改变的都可以,如果不是那就是你这种情况了。你可以调试打断点看看。追问确实是if被优化掉了。把优化级别设为1就成功了。弄出汇编界面IF被砍了.追答这个 你得检查你P1^0的定义有没有volatile关键字了,我暂时看不出什么门道,但我觉得正一兄的说法很可能,按键我在用的时候都要延时判断是不是真的被按下了,延时20ms内容来自www.shufadashi.com请勿采集。

声明:本网内容旨在传播知识仅供参考,不代表本网赞同其观点,文字及图片版权归原网站所有。