智能车制作

标题: 实用,经典的单片机编程要点[3] [打印本页]

作者: whut_wj    时间: 2008-9-21 18:15
标题: 实用,经典的单片机编程要点[3]
<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>
作者: 50833713    时间: 2008-9-21 19:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: 50833713    时间: 2008-9-21 19:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: whut_wj    时间: 2008-9-21 19:44
标题: Re:实用,经典的单片机编程要点[3]
<>这不仅仅是C语言的问题,是单片机C语言.</P><P>b是二进志标志.</P>
作者: hackbuteer    时间: 2008-10-20 04:26
标题: Re:实用,经典的单片机编程要点[3]
讲得很好啊!
作者: hyl4926    时间: 2009-2-17 10:22
PORTA=1<<3是怎么回事儿,能否解释一下?谢谢~
作者: 远方    时间: 2009-2-19 22:31
和AVR是一样的
作者: whut_wj    时间: 2009-2-20 13:51
PORTA=1<<3

1、000000001左移3位就是00001000
2、再把00001000赋给PORTA,PORTA是个宏,表示A口寄存器的当前值。
作者: auqfvjfire    时间: 2009-2-24 22:25
受益非浅啊
作者: xixihaha    时间: 2009-3-12 14:36
呵呵
作者: xiaotry    时间: 2009-3-12 17:24
版主真强!
作者: control    时间: 2009-3-15 18:19
顶~~
作者: narcsx2008    时间: 2009-3-17 20:23
讲的太好了,精辟!~!~!~!
作者: xbsf-写轮眼    时间: 2009-4-6 19:57
受教了!
作者: chenrunshe_007    时间: 2009-4-10 12:21
我拿
作者: 786892880    时间: 2009-4-18 15:10
这样说就容易白啦!
作者: 破风    时间: 2010-1-21 18:34
学习了~~~~~




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2