阅读:6501回复:10
Keil c中如何保存p1、p0口状态
我要在中断服务程序中改变端口状态,推出中断时还原,Keil c中如何保存p1、p0口状态?
|
|
|
沙发#
发布于:2005-02-26 11:19
你可以在中断程序中设置两个unsigned char 的变量保存这两个断口的状态,出中断的时候还原就可以了呀
跟汇编差不多 |
|
板凳#
发布于:2005-02-26 11:30
详细一点,P0口如何表示?头文件中都是以位定义的啊?
|
|
|
地板#
发布于:2005-02-26 14:45
用 sfr 可以定义整个端口,如
sfr P0 =0x80; //假设PO对应寄存器的地址是0x80 那使用的时候就可以直接用 PO 来操作整个IO口了。 sbit就是定义IO口的一个位。如 sbit PO_0=0x80; sbit PO_1=0x81; ………… 其实使用时跟P0^0、P0^1是等价的(要使用P0^X这种表示方法就要先用sfr定义PO)。 按道理这些在芯片头文件里都应该是做好了的呀………… |
|
地下室#
发布于:2005-02-28 10:21
详细一点,P0口如何表示?头文件中都是以位定义的啊? 看来你对KEIL还不是很熟悉,建议买本书看看,推荐一本C上手的比较快的单片机书:51系列单片机及C51程序设计,科学出版社出版,王建校,杨建国等编著,26元,这本书性价比还可以,适合新手上路,另外不知道你把什么头文件包含进去了,一般用reg52.h的头文件,这在KEIL的文件夹中,自己找找,再把它拷贝到自己的源程序文件夹下,调用即可。 :D :D :D [编辑 - 2/28/05 by crying_p] |
|
5楼#
发布于:2005-02-28 15:24
这种保存方法有问题,
比如实际上P1全1,但由于外部下拉电阻,保存时可能会读成0,再恢复时就不对了。 最好保存控制字,用控制字刷新端口。 |
|
|
6楼#
发布于:2007-03-28 21:35
楼上正解. 51的IO口比较特殊,它是准双向IO口. 只有读-修改-写指令才能读到输出寄存器的值,而直接读端口,则读到的是IO口电平值,如果你的外部电路能够改变IO口状态的话,那么实际上读回的值与你写入到端口的值是不一样的。当然,如果你确保你的外围硬件不会影响IO口的电平,那么可以直接读端口来备份. 如果不是这样,你可以通过另外一个变量来保存输出状态。当在主程序中需要修改端口时,就把需要写的值先备份起来,然后再输出。进中断后就可以直接操作端口,在退出中断时,使用以前备份的值来恢复端口. 花费的代价就是需要多一个全局变量以及更新端口需要更多的时间。
|
|
|
7楼#
发布于:2007-06-18 15:32
楼上讲的很详细,谢谢,学习了
|
|
8楼#
发布于:2007-07-13 08:25
看看REG51.H或者REGX51.H头文件是怎么定义的就明白了.
Keil/c51/inc/下有各种微处理器的头文件,直接拿来看就行了。 |
|
9楼#
发布于:2007-08-06 14:50
在51这种单片机的程序设计中,最好是设置中断标志字,表明进入过中断,而后在主服务程序中做相应的处理,进入相应的服务程序,这样的好处是节省堆栈占用,因为51系列单片机的内存太少了,容易产生溢出,堆栈溢出可是不可预测的,很难调试出来的。
|
|
|
10楼#
发布于:2008-03-12 14:18
用 sfr 可以定义整个端口,如
sfr P0 =0x80; //假设PO对应寄存器的地址是0x80 那使用的时候就可以直接用 PO 来操作整个IO口了。 sbit就是定义IO口的一个位。如 sbit PO_0=0x80; sbit PO_1=0x81; ………… 其实使用时跟P0^0、P0^1是等价的(要使用P0^X这种表示方法就要先用sfr定义PO)。 按道理这些在芯片头文件里都应该是做好了的呀………… |
|