打印

单片机新手,入门前的感悟第六篇。(转)

[复制链接]
1575|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suoma|  楼主 | 2009-12-28 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天看完了单个LED数码管控制的程序,在师哥的帮助下,又学到了一些知识,现在拿来和初学者一起分享。
#include <mega16.h>
#include<delay.h>
flash unsigned char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
bit point_on=0;
void main(void)
{
  unsigned char i=0;
  PORTA=0xFF;
  DDRA=0xFF;
while (1)
    {
    for(i=0;i<=15;i++)
    {
      PORTA=led_7
;
      if (point_on) PORTA|=0x80;
      delay_ms(1000);
    }
    point_on=~point_on;
    };
}
这个程序执行后的结果是:1 2 3 4 5 6 7 8 9 A B C D  E   F
然后1. 2. 3. 4. 5. 6. 7. 8. 9. A. B. C. D. E. F.循环下去
bit定义了一个只能取0或1的变量,但它的特点是只占一个位,而不是一个字节。
PORTA|=0x80什么意思?
他是位运算PORTA|=0x80等价于PORTA=PORTA|0x80作用是对PA7置1
例如对PA2置1 PORTA=0x04
为了直观也可以PORTA|=(1<<2)或者宏定义#define BTT(x)(1<<x)那么以后就可以写为PORTA=|BTT(2)
|为或运算,&为且运算
还有一个问题,当DDRX设为1时表输出,PORTX设为0时表输入,两者同时岂不矛盾?
后来我明白DDRX表输出,PORTX为0时引脚为低电平,这时是输出低电平,那这是电流的方向是流向单片机里的。
单片机程序中变量的赋值可以是十进制,十六进制,二进制。
例如PORTA=0x80;
PORTA=128;
PORTA=0b10000000;三者等价,注意当用二进制时,前面要加0b,否则如例题中PORTA=10000000;这样就超范围了。
沙发
love_life| | 2009-12-28 23:53 | 只看该作者
字体很好,看起来听清楚的

使用特权

评论回复
板凳
Karlshen| | 2009-12-29 21:22 | 只看该作者
PORTX为0时引脚为低电平,这时是输出低电平,那这是电流的方向是流向单片机里的。
这个类似于模电中某块

使用特权

评论回复
地板
huamunv| | 2009-12-29 23:17 | 只看该作者
拜读

使用特权

评论回复
5
linhai2009| | 2009-12-30 00:06 | 只看该作者
不错,拜读了

使用特权

评论回复
6
suoma|  楼主 | 2009-12-31 21:53 | 只看该作者
别人的东西总有一些值得一看

使用特权

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

本版积分规则

82

主题

714

帖子

5

粉丝