http://blog.csdn.net/googlemi/article/details/38470565
2014
《一》先从昨天那个按键检测程序对比下KEIL和IAR在编译代码方面的严谨性,当然仅仅个人看法而已,可能我理解的不深入吧,权当做IAR学习笔记吧
程序如下
- #include<reg52.h><span style="white-space:pre"> </span>//IAR里面此处修改为io8051.h
-
- int keyscan(void);
-
- int table[]={0xff,0xf9,0xa4,0xb0,0x99,//增加0xff以便不按键时灯熄灭
- 0x92,0x82,0xf8,0x00,
- 0x90,0x88,0x83,0xc6,
- 0xa1,0x84,0x8e,0xc0}; //按s16显示0
-
- int main(void)
- {
- while(1)
- P2=table[keyscan()];
-
- // return 0;
- }
-
- int keyscan(void)
- {
- int row=0,col=0,key=0; //row行扫描,col列扫描
- for(row=0;row<4;row++)
- {
- P1&=~(1<<(row+4));//P1[4-7]依次至零
- if((P1&0xf)<0xf) //判断P1[0-3]是否有0,即是否按键按下
- {
- for(col=0;col<4;col++)
- {
- if((P1&(1<<col))==0)//判断一行中那一列为0
- key=row*4+col+1;//注意+1,以便按1能显示1
- }
- }
- while((P1&0xf)!=0xf);//等待按键被释放
- P1=0xff;
- }
- return key;
- }
同时用KEIL和IAR编译后,然后到proteus运行,结果KEIL能正常运行,当按下相应按键后数码管能显示对应数值,然后IAR里面一直不能被点亮,换句话说key似乎一直是0,
后来经过调试和分析后发现IAR的结果是正确的,按程序说数码管显示数值由于时间极短人眼是看不到的,因为Main函数在一个while(1) 死循环里面,每当有按键被按下,keyscan就得到key返回主函数,接着数码管就能显示相应数值,但是此时他又立即进入下一次按键检测,由于按键没有被按下,此时得到的key应该是0,所以肉眼看着一直没有被点亮,但是KEIL编译过之后却能点亮,具体原因就不得而知了,
。。。分割线。。。。
下面记录下解决办法,由于机器执行代码太快导致按下开关时间过短人眼无法看见,所以可以用两种解决办法
①每次读取按键程序后,延时一定时间,以便人眼能够看清楚
②将key定义为全局变量或者静态局部变量,这样在下一次按键之前,无论while(1)多少次了,keyscan始终读取到上一次的key,显示就会正常
《二》软件调试时IAR如何设置端口寄存器的数值
如图所示
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。