打印

TMOD不能位寻址,为什么就可以这样定义呢,有什么好处

[复制链接]
5758|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Devil松|  楼主 | 2012-5-6 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看AT89X51.h头文件,发现了这个,让我很是不理解,TMOD不是不能位寻址吗,为什么可以这样定义呢,有什么好处,请朋友们指教。
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F

相关帖子

沙发
xuyaqi| | 2012-5-6 10:18 | 只看该作者
这样定义增加程序可读性,位取值可用与,或 TMOD字节实现。

使用特权

评论回复
板凳
Devil松|  楼主 | 2012-5-6 10:46 | 只看该作者
但原则是不是说TMOD不能位定义吗,这样怎么感觉都像知法犯法,违反规则了,难道说Keil公司的人就有特权,嘿嘿……
具体的说不能位定义是什么意思?

使用特权

评论回复
地板
xuyaqi| | 2012-5-6 10:53 | 只看该作者
这样定义并不说明TMOD可以硬件位寻址

使用特权

评论回复
5
Devil松|  楼主 | 2012-5-6 10:57 | 只看该作者
哦,这样的意思只是用另一种方式来避开不能位定义的麻烦和尴尬吧,是不是这样做了,其实也就和位定义想实现的功能是一样的吧,位定义不就是想更方便的操作相关寄存器吗?这样做是不是也实现了位定义的功能,只不过是另一种方式?

使用特权

评论回复
6
xuyaqi| | 2012-5-6 11:58 | 只看该作者
是的

使用特权

评论回复
7
lyjian| | 2012-5-6 20:26 | 只看该作者
这样定义是为了方便使用逻辑指令来清零或置位某一位

使用特权

评论回复
8
lyjian| | 2012-5-6 20:36 | 只看该作者
这个和TMOD的位寻址是两码事。IE里面的可以位寻址,例如:EA=1;但是TMOD里面的GATE=1,是错误的。
taishandadi 发表于 2012-5-6 20:15

乱讲

使用特权

评论回复
9
logokfu| | 2012-5-6 20:40 | 只看该作者
这里不叫位寻址,能整除8的才可以位寻址。这里的用法不是位寻址,只是宏定义罢了。

使用特权

评论回复
10
zhoukouguren| | 2012-5-6 20:54 | 只看该作者
9# lyjian
我*,大哥,又碰见你在这儿说别人风凉话了,我还以为你只是说我风凉话呢,看看你,在这又是不说点有意义的,说完风凉话就闪人

使用特权

评论回复
11
lyjian| | 2012-5-6 20:59 | 只看该作者
楼上的是不是吃错药了
我什么时候说你风凉话了

使用特权

评论回复
12
bell1205| | 2012-5-7 01:06 | 只看该作者
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
----------------------------------------------------------------------------------------------
个人觉得是楼主理解错了,TMOD的确是不能位寻址,但是这些宏定义并不是代表那些存储单元,比如,MO代表 0X01(错误)。
细细推了下,为解释得更清楚方便,再请看下表
名称     十六进制     二进制   
T0_M0_   0x01 --- 0000 0001
T0_M1_   0x02 --- 0000 0010
T0_CT_   0x04 ---  0000 0100
T0_GATE_ 0x08 -- 0000 1000
T1_M0_   0x10 --- 0001 0000
T1_M1_   0x20 --- 0010 0000
T1_CT_   0x40 --- 0100 0000
T1_GATE_ 0x80 -- 1000 0000
T1_MASK_ 0xF0 -- 1111 0000
T0_MASK_ 0x0F -- 0000 1111
看完表,我想聪明的你已经知道为何如此定义了,-- 如果在程序中想置TMOD中的 MO 为1,程序可以写成
    TMOD |= 0X01;
    同样 ,也可以写成
   TMOD |=  T0_M0_;
后者相对前者更容易理解和纠错。
最后,发表下个人用宏定义的经验:  宏的根本目的是为清晰化,未有其他用途!

使用特权

评论回复
13
ayb_ice| | 2012-5-7 09:13 | 只看该作者
程序是要给人看的

使用特权

评论回复
14
coody| | 2012-5-7 09:53 | 只看该作者
宏定义,可以用逻辑操作。标准C就是这样的。

使用特权

评论回复
15
ayb_ice| | 2012-5-7 15:35 | 只看该作者
if(TMOD & 0x08)// 可能没有人能直接明白是什么意思
{

}


if(TMOD & T0_GATE_ )// 大部分懂51的人都知道什么意思
{

}

使用特权

评论回复
16
Devil松|  楼主 | 2012-5-7 16:03 | 只看该作者
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#d ...
bell1205 发表于 2012-5-7 01:06

说的对,终于明白啦……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

30

帖子

0

粉丝