历史上的今天
返回首页

历史上的今天

今天是: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;


推荐阅读

史海拾趣

东晶(ECEC)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,东晶电子开始将目光投向国际市场。公司积极参与国际展会,与全球知名电子企业建立合作关系,产品出口到欧洲、北美、东南亚等多个国家和地区。同时,东晶电子还与国际知名厂商进行技术交流和合作研发,不断提升自身技术水平,以适应全球市场的竞争需求。

旌芯半导体(GN)公司的发展小趣事

质量是企业的生命线。维峰电子始终将质量管理作为公司发展的重中之重。公司建立了完善的质量管理体系,从原材料采购、生产过程到产品检验等各个环节都进行严格把控。同时,公司还引入了先进的检测设备和技术,确保产品的质量和性能达到最高标准。这些措施的实施不仅提升了产品的竞争力,也赢得了客户的信任和好评。

上海晶丰明源(BPS)公司的发展小趣事

上海晶丰明源半导体股份有限公司的创立,标志着中国在半导体领域的又一重要布局。公司自成立之初,就专注于电源管理芯片的研发与销售,凭借对技术的深入理解和市场需求的敏锐洞察,迅速在行业中崭露头角。初步发展阶段,晶丰明源通过不断优化产品设计、提升生产工艺,逐步赢得了客户的信任,并在市场上占据了一席之地。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

ESS [ESS Technology,Inc]公司的发展小趣事

ESS科技公司的创始人在1984年创建了这家位于美国加利福尼亚州的公司,起初专注于将音响压缩重建技术应用于电子音响图书和问候卡。然而,随着个人电脑的普及和多媒体市场的快速增长,ESS决定调整战略,全力发展个人电脑音频技术。1993年,ESS推出了其首批PC音频半导体产品ES488,这是一个12位的单声道音质硅片。随后,ESS不断推出新产品,如ES688,一个16位立体音质硅片,这些产品为ESS带来了可观的收益。1995年,ESS成功在美国纳斯达克上市,标志着公司进入了一个全新的发展阶段。

CTC Coils Ltd公司的发展小趣事

CTC Coils Ltd公司早期以生产传统电感线圈为主,随着电子技术的飞速发展,公司意识到必须进行技术升级。于是,公司投入大量研发资源,成功开发出一种新型高效能电感线圈,该产品在性能上大幅提升,同时降低了能耗。这一技术突破使CTC Coils Ltd的产品在市场上脱颖而出,公司迅速赢得了大量客户,并扩大了生产规模。

问答坊 | AI 解惑

请教关于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,这样自己记起来轻松多了——男人何必为难自己呢...看看这个流水灯的程序,看上去是不是容易些了 ...…

查看全部问答>

有几个人可以解答这个问题?

cpu里面的电路是怎么认识程序翻译成的机器码0和1的?…

查看全部问答>

求verilog编辑一个带两位小数的加法运算

用verilog语言编辑一个带两位小数的十进制加法运算  例如139.33+122.53的运算…

查看全部问答>

哪位朋友可以谈谈轿车着火或者溺水之后车门安全系统如何预警和自救?

看到新闻上不断有报道轿车着火之后乘客不能及时逃生,721北京暴雨也导致有驾驶员不幸在轿车中溺水身亡! 哪位朋友可以谈谈轿车着火或者溺水之后车门安全系统如何预警和自救? http://weibo.com/vishaychina…

查看全部问答>

软件

请问哈有没有能够从stm32单片机串口上直接接收图片的数据流(十六进制),然后在电脑上显示的软件,用于弄摄像头的,谢谢?…

查看全部问答>

求助千兆网口Freescale_ETSEC+Marvell_88E1111驱动问题

开发环境:风河workbench3.2 vxworks6.8  ,目标板:飞思卡尔powerpc mpc8536 网络eTSEC集成于CPU芯片,物理芯片phy用的是Marvell公司的88E1111。 现在bootrom刚起来,想通过网络FTP加载VxWorks系统,老是下载失败,是网口驱动没做好。 ...…

查看全部问答>

TI芯片--TPS5450使用问题

几款板卡,其电源部分都是用的TPS5450,外围只有7颗元件,就可以实现DC/DC转换,最大5A的输出能力。当输出电压是5V时,输入电压范围可以达到7~33V,足以满足一般场合的应用。所以给板子配适配器可以放的很宽,可以使用各类适配器,9V的,12V的,19V ...…

查看全部问答>