lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:6501回复:10

Keil c中如何保存p1、p0口状态

楼主#
更多 发布于:2005-02-26 09:50
我要在中断服务程序中改变端口状态,推出中断时还原,Keil c中如何保存p1、p0口状态?
l=z=l 我听说,灌水是使分数快速增长的有效方法
crying_p
驱动牛犊
驱动牛犊
  • 注册日期2005-02-25
  • 最后登录2005-11-19
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-26 11:19
你可以在中断程序中设置两个unsigned char 的变量保存这两个断口的状态,出中断的时候还原就可以了呀
跟汇编差不多
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-26 11:30
详细一点,P0口如何表示?头文件中都是以位定义的啊?
l=z=l 我听说,灌水是使分数快速增长的有效方法
lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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)。
按道理这些在芯片头文件里都应该是做好了的呀…………
crying_p
驱动牛犊
驱动牛犊
  • 注册日期2005-02-25
  • 最后登录2005-11-19
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-28 10:21
详细一点,P0口如何表示?头文件中都是以位定义的啊?

看来你对KEIL还不是很熟悉,建议买本书看看,推荐一本C上手的比较快的单片机书:51系列单片机及C51程序设计,科学出版社出版,王建校,杨建国等编著,26元,这本书性价比还可以,适合新手上路,另外不知道你把什么头文件包含进去了,一般用reg52.h的头文件,这在KEIL的文件夹中,自己找找,再把它拷贝到自己的源程序文件夹下,调用即可。 :D :D :D

[编辑 -  2/28/05 by  crying_p]
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-28 15:24
这种保存方法有问题,
比如实际上P1全1,但由于外部下拉电阻,保存时可能会读成0,再恢复时就不对了。

最好保存控制字,用控制字刷新端口。
A strong man can save himself. A great man can save another.
computer00
驱动小牛
驱动小牛
  • 注册日期2004-09-27
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望120点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-28 21:35
楼上正解. 51的IO口比较特殊,它是准双向IO口. 只有读-修改-写指令才能读到输出寄存器的值,而直接读端口,则读到的是IO口电平值,如果你的外部电路能够改变IO口状态的话,那么实际上读回的值与你写入到端口的值是不一样的。当然,如果你确保你的外围硬件不会影响IO口的电平,那么可以直接读端口来备份. 如果不是这样,你可以通过另外一个变量来保存输出状态。当在主程序中需要修改端口时,就把需要写的值先备份起来,然后再输出。进中断后就可以直接操作端口,在退出中断时,使用以前备份的值来恢复端口. 花费的代价就是需要多一个全局变量以及更新端口需要更多的时间。
博客Http://computer00.21ic.org
xuyaosong
驱动牛犊
驱动牛犊
  • 注册日期2007-04-08
  • 最后登录2007-11-02
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-18 15:32
楼上讲的很详细,谢谢,学习了
mycpu
驱动牛犊
驱动牛犊
  • 注册日期2005-12-22
  • 最后登录2007-07-13
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-07-13 08:25
看看REG51.H或者REGX51.H头文件是怎么定义的就明白了.
Keil/c51/inc/下有各种微处理器的头文件,直接拿来看就行了。
天冰天降
驱动牛犊
驱动牛犊
  • 注册日期2007-08-01
  • 最后登录2015-11-13
  • 粉丝1
  • 关注1
  • 积分110分
  • 威望200点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-06 14:50
在51这种单片机的程序设计中,最好是设置中断标志字,表明进入过中断,而后在主服务程序中做相应的处理,进入相应的服务程序,这样的好处是节省堆栈占用,因为51系列单片机的内存太少了,容易产生溢出,堆栈溢出可是不可预测的,很难调试出来的。
驱网无线,快乐无限
cnwarror
驱动小牛
驱动小牛
  • 注册日期2005-08-20
  • 最后登录2013-07-31
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望257点
  • 贡献值0点
  • 好评度134点
  • 原创分0分
  • 专家分0分
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)。
按道理这些在芯片头文件里都应该是做好了的呀…………
游客

返回顶部