智能车制作
标题:
实用,经典的单片机编程要点[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: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><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: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><FONT size=4>DDRx寄存器就是 单片机的端口方向寄存器,通过设置DDRx可以设置x端口的状态。<BR>DDRx端口方向寄存器相应位设置为1则对应的x端口相应位为输出状态,DDRx端口方向寄存器相应位设置为0则对应的x端口相应位为输入状态。<BR>例如:<BR>DDRA = 0xFF; //设置端口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: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><FONT size=4>DDRA = 0x0F //设置端口A高4位为输入状态,低4位为输出状态,因为0x0F对应的二进制为00001111b</FONT></SPAN></H3><SPAN style="FONT-SIZE: 5.5pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><FONT size=4>
ORTx寄存器是 单片机的输出寄存器,端口输出状态设定好后通过设置PORTx可以使端口x的相应位输入高电平或低电平来控制外部设备。<BR>例如:<BR>PORTA = 0xFF; //端口A所有口线输出高电平</FONT></H2><H2 class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>PORTA = 0x0F; //端口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<<3; //端口A第4位置为高电平,其它为低电平,应为00000001左移3位后是00001000<BR>PORTA = 1<<7; //同理,第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<<3; //实现端口A第4位置为高电平,其它位的高低电平不受影响<BR>上面的语句是简化的写法,分解一下就是:<BR>PORTA = PORTA | (1<<3); //数字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 &=~(1<<3); //解释一下,首先将1左移3位变成00001000b,然后再按位取反变成11110111b,然后再与端口A做按位与运算,这样就实现了设置端口A第4位为低电平,其它位的高低电平不变。<BR>分解后的语句为:<BR>PORTA = PORTA & (~(1<<3)); //结果是一样的</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; //将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