历史上的今天
今天是:2024年10月29日(星期二)
2019年10月29日 | AVR IO口设置方法详解
2019-10-29 来源:51hei
看到好多新手对AVR单片机位变量使用不明白,现在提供一个I/O口位操作方法供大家学习:
下面是我用的宏定义方式:
#define LED_SET PORTD |= (1 << PD5) //位置高
#define LED_CLR PORTD &= ~(1 << PD5) //位置低
#define LED_COM PORTD ^= (1 << PD5) //位取反
#define LED_R PIND & (1 << PD5) //位读取
通过上面的定义就可以在程序中直接操作I/O了。
判断PD5是否为‘1’:
if (LED_R != 0) {
;
}
那么如果要判断PD5是否为‘0’时:
if ((LED_R) == 0) {
;
}
呵呵,还是C语言没看好。
a |= b; 这是C语言里面的一种简化写法,前面的语语句和后面等同:a = a | b;
PIND & (1 << PD5) 这个语句我也是从书上学的,反正结果就是告诉编译器,在处理的时候把这个处理成位操作指令。
PD5知道了,它就是头文件里面定义的,实际数值是数字5;
1 << 5用二进制来看的话:0000 0001 被左移了5位,结果就是0010 0000。
PIND & 0010 0000这个二进制数,结果不就是取PIND.5这一位吗。
我是这样理解的,你也可以这样理解虽然不能百分之百保证标准,但不会错。要是上面有看不懂的,你就应该看书和学习了。
如何用C语言操纵AVR的IO端口(以ICCAVR为例):
举例一:将PB0定义为输出,且输出为高电平
DDRB=BIT(0); //定义 PB0为输出
PORTB|=BIT(0); // PB0 输出高电平
举例二:将PB0、PB1定义为输出,且PB0输出低电平,PB1均为高电平
DDRB|=BIT(0)|BIT(1); //定义 PB0、PB1为输出
PORTB|=BIT(0)|BIT(1);// PB0、PB1 输出高电平
举例三:将PB0数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1
PORTB^=BIT(0); // PB0 输出高电平
举例四:将PB0、PB1数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1
PORTB^=BIT(0)|BIT(1); // PB0 输出高电平
举例五:将PB2、PB3定义为输入,不带上拉电阻
DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3为输入
PORTB&=~(BIT(2)|BIT(3)); // 将 PORT 置0,没有上拉电阻
举例六:将PB2、PB3定义为输入,带上拉电阻。即没有引用这些引脚时,缺省值为高电平
SFIOR&=~BIT(PUD); // SFIOR寄存器的上拉电阻控制位PUD置0,在整个代码中,这句话可以不出现,或仅出现一次即可。因为它是一个控制全部上拉电阻的控制位。
DDRB&=~(BIT(2)|BIT(3)); //定义 PB2、PB3为输入
PORTB|=BIT(2)|BIT(3); // 将 PORT 置1,满足上拉电阻的另一个条件
举例七:DDRB=BIT(0)|BIT(1) 与 DDRB|=BIT(0)|BIT(1) 的区别
假定在执行上面两句指令前,DDRB 的状态为: 1000 0000
如果执行 DDRB=BIT(0)|BIT(1) ,DDRB的状态变为: 0000 0011
如果执行 DDRD|=BIT(0)|BIT(1),,DDRB的状态变为: 1000 0011
那前一句会先清空以前的所有状态,后一句保留前面的状态。
在实际应用中,后一句更常用。
举例八:将第三位置1,除了用BIT(3),还有其它的表达方法吗?
DDRB|=BIT(3);
DDRB|=1<<3;
DDRB|=0x08;
DDRB|=0b00001000;
下一篇:AVR红外遥控解码代码
史海拾趣
|
请教关于DXP2004中原理图的“Title Block”的修改 请教大家一个问题: 在 Protel DXP2004 sp2 的原理图编辑中,它右下角的那个“Title Block”的区域中的信息,有没有非常方便的方法修改呢? 恳请大家告诉我正确的方法,谢谢!… 查看全部问答> |
|
新买回来的摄像头,驱动安装正常,用amcap预览正常,默认打开的视频窗口大小是800*600,可是在qq视频设置里面,图像的帧率却很低,显示很慢,在msn的视频设置中是正常的,请问各位高手故障现象的原因在什么地方呢?是驱动的问题还是qq软件的不兼容?… 查看全部问答> |
|
一下还不习惯用ST的库函数(懒记),所以自己对GPIO口进行 另外,对ST的一些寄存器定义也不大习惯,所以也重新做了定义,例如GPIOx_BSRR我另外定义了一个GPIOx_SET,GPIOx_BRR我另外定义了一个GPIOx_CLR,这样自己记起来轻松多了——男人何必为难自己呢...看看这个流水灯的程序,看上去是不是容易些了 ...… 查看全部问答> |
|
哪位朋友可以谈谈轿车着火或者溺水之后车门安全系统如何预警和自救? 看到新闻上不断有报道轿车着火之后乘客不能及时逃生,721北京暴雨也导致有驾驶员不幸在轿车中溺水身亡! 哪位朋友可以谈谈轿车着火或者溺水之后车门安全系统如何预警和自救? http://weibo.com/vishaychina… 查看全部问答> |
|
求助千兆网口Freescale_ETSEC+Marvell_88E1111驱动问题 开发环境:风河workbench3.2 vxworks6.8 ,目标板:飞思卡尔powerpc mpc8536 网络eTSEC集成于CPU芯片,物理芯片phy用的是Marvell公司的88E1111。 现在bootrom刚起来,想通过网络FTP加载VxWorks系统,老是下载失败,是网口驱动没做好。 ...… 查看全部问答> |
|
几款板卡,其电源部分都是用的TPS5450,外围只有7颗元件,就可以实现DC/DC转换,最大5A的输出能力。当输出电压是5V时,输入电压范围可以达到7~33V,足以满足一般场合的应用。所以给板子配适配器可以放的很宽,可以使用各类适配器,9V的,12V的,19V ...… 查看全部问答> |




