今天看完了单个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;这样就超范围了。 |