智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6997|回复: 16
打印 上一主题 下一主题

实用,经典的单片机编程要点[3]

[复制链接]

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
跳转到指定楼层
1#
发表于 2008-9-21 18:15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 5.5pt; FONT-FAMILY: 宋体; mso-hansi-font-family: &#39;Times New Roman&#39;; mso-ascii-font-family: &#39;Times New Roman&#39;"><FONT size=4>单片机的IO口是标准的双向端口,首先要设置IO口的状态,即:输入还是输出</FONT></SPAN></H3><H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 5.5pt; FONT-FAMILY: 宋体; mso-hansi-font-family: &#39;Times New Roman&#39;; mso-ascii-font-family: &#39;Times New Roman&#39;"><FONT size=4>DDRx寄存器就是 单片机的端口方向寄存器,通过设置DDRx可以设置x端口的状态。<BR>DDRx端口方向寄存器相应位设置为1则对应的x端口相应位为输出状态,DDRx端口方向寄存器相应位设置为0则对应的x端口相应位为输入状态。<BR>例如:<BR>DDRA = 0xFF;&nbsp; //设置端口A所有口为输出状态,因为0xFF对应的二进制为11111111b</FONT></SPAN></H3><H3 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 5.5pt; FONT-FAMILY: 宋体; mso-hansi-font-family: &#39;Times New Roman&#39;; mso-ascii-font-family: &#39;Times New Roman&#39;"><FONT size=4>DDRA = 0x0F&nbsp; //设置端口A高4位为输入状态,低4位为输出状态,因为0x0F对应的二进制为00001111b</FONT></SPAN></H3><SPAN style="FONT-SIZE: 5.5pt; FONT-FAMILY: 宋体; mso-hansi-font-family: &#39;Times New Roman&#39;; mso-ascii-font-family: &#39;Times New Roman&#39;"><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><FONT size=4>ORTx寄存器是 单片机的输出寄存器,端口输出状态设定好后通过设置PORTx可以使端口x的相应位输入高电平或低电平来控制外部设备。<BR>例如:<BR>PORTA = 0xFF;&nbsp; //端口A所有口线输出高电平</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>PORTA = 0x0F;&nbsp; //端口A高4位输出低电平,低4位输出高电平</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>小贴士:<BR>利用位逻辑运算符对特定的端口进行设定。</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>PORTA = 1&lt;&lt;3;&nbsp; //端口A第4位置为高电平,其它为低电平,应为00000001左移3位后是00001000<BR>PORTA = 1&lt;&lt;7;&nbsp; //同理,第8位置高电平</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>有时候我们期望端口某一位设置成高电平,但是其它位的高低电平要保持不变,如何做呢?C语言是很强大的,有办法!如下:</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>PORTA |=1&lt;&lt;3;&nbsp; //实现端口A第4位置为高电平,其它位的高低电平不受影响<BR>上面的语句是简化的写法,分解一下就是:<BR>PORTA = PORTA | (1&lt;&lt;3);&nbsp;&nbsp;&nbsp; //数字1左移3位后与端口A进行按位或,结果就是端口A第4位置为高电平,其它位的高低电平不受影响</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>那么大家就会问了,如何实现设置某一位为低电平,其它位的高低电平不变呢?建议大家思考1分钟再看下面的内容。</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>?<BR>PORTA &amp;=~(1&lt;&lt;3);&nbsp; //解释一下,首先将1左移3位变成00001000b,然后再按位取反变成11110111b,然后再与端口A做按位与运算,这样就实现了设置端口A第4位为低电平,其它位的高低电平不变。<BR>分解后的语句为:<BR>PORTA = PORTA &amp; (~(1&lt;&lt;3));&nbsp; //结果是一样的</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>将某端口相应位的高低电平翻转,即原来高电平变为低电平,低电平变为高电平.</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><FONT size=4>PORTA = ~PORTA;&nbsp; //将PORTA按位取反后再赋值给PORTA</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>按位逻辑运算还有一个异或,这个也非常有意思,它能实现电平翻转,有兴趣大家看看书</FONT></SPAN></H2>

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
2#
发表于 2008-9-21 19:05:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
3#
发表于 2008-9-21 19:20:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
4#
 楼主| 发表于 2008-9-21 19:44:55 | 只看该作者

Re:实用,经典的单片机编程要点[3]

<>这不仅仅是C语言的问题,是单片机C语言.</P><P>b是二进志标志.</P>
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
威望
190
贡献
22
兑换币
0
注册时间
2008-9-29
在线时间
0 小时
5#
发表于 2008-10-20 04:26:27 | 只看该作者

Re:实用,经典的单片机编程要点[3]

讲得很好啊!
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
威望
225
贡献
38
兑换币
0
注册时间
2009-2-16
在线时间
3 小时
6#
发表于 2009-2-17 10:22:49 | 只看该作者
PORTA=1<<3是怎么回事儿,能否解释一下?谢谢~
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
125
威望
173
贡献
22
兑换币
0
注册时间
2009-2-15
在线时间
17 小时
7#
发表于 2009-2-19 22:31:22 | 只看该作者
和AVR是一样的
回复 支持 反对

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
8#
 楼主| 发表于 2009-2-20 13:51:26 | 只看该作者
PORTA=1<<3

1、000000001左移3位就是00001000
2、再把00001000赋给PORTA,PORTA是个宏,表示A口寄存器的当前值。
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
威望
182
贡献
22
兑换币
0
注册时间
2009-2-23
在线时间
2 小时
9#
发表于 2009-2-24 22:25:30 | 只看该作者
受益非浅啊
回复 支持 反对

使用道具 举报

0

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
QQ
威望
298
贡献
22
兑换币
0
注册时间
2008-7-9
在线时间
3 小时
10#
发表于 2009-3-12 14:36:51 | 只看该作者
呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 12:27 , Processed in 0.110964 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表