Arduino代码机制-引脚读写

在写arduino代码时,pinMode, digitalWrite, digitalRead这些函数用起来是不是非常顺手呢?有了这些函数,我们就不用关心AVR单片机的那些令人头疼寄存器了。我们向函数传入引脚在Arduino开发板上的引脚号,就能对这个引脚进行读写和设置操作了。这些函数是如何实现的呢?

以上这三个函数,最终还是要通过设置PORT,PIN和DDR三个寄存器实现,要设置某个引脚,就必须知道这个引脚在哪个端口上,还必须知道在这个端口的哪一位上,这样就能通过设置寄存器来读写和设置引脚了。

宏 digitalPinToPort(P)

#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )

Arduino将端口定义为整形,后面将会领略到这样定义的妙处

#define PA 1
#define PB 2
#define PC 3
#define PD 4
#define PE 5
#define PF 6
#define PG 7
#define PH 8
#define PJ 10
#define PK 11
#define PL 12

再将每个引脚在哪个端口保存为数组,放在Flash中,通过查表得到引脚所在的端口。关于如何将数据放在Flash中这方面内容可以看我的上一篇博客。

const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
// PORTLIST     
// -------------------------------------------      
PE  , // PE 0 ** 0 ** USART0_RX 
PE  , // PE 1 ** 1 ** USART0_TX 
PE  , // PE 4 ** 2 ** PWM2  
PE  , // PE 5 ** 3 ** PWM3  
PG  , // PG 5 ** 4 ** PWM4  
PE  , // PE 3 ** 5 ** PWM5  
PH  , // PH 3 ** 6 ** PWM6  
PH  , // PH 4 ** 7 ** PWM7  
PH  , // PH 5 ** 8 ** PWM8  
PH  , // PH 6 ** 9 ** PWM9  
PB  , // PB 4 ** 10 ** PWM10    
PB  , // PB 5 ** 11 ** PWM11    
PB  , // PB 6 ** 12 ** PWM12    
PB  , // PB 7 ** 13 ** PWM13    
PJ  , // PJ 1 ** 14 ** USART3_TX    
PJ  , // PJ 0 ** 15 ** USART3_RX    
PH  , // PH 1 ** 16 ** USART2_TX    
PH  , // PH 0 ** 17 ** USART2_RX    
PD  , // PD 3 ** 18 ** USART1_TX    
PD  , // PD 2 ** 19 ** USART1_RX    
PD  , // PD 1 ** 20 ** I2C_SDA  
PD  , // PD 0 ** 21 ** I2C_SCL  
PA  , // PA 0 ** 22 ** D22  
PA  , // PA 1 ** 23 ** D23  
PA  , // PA 2 ** 24 ** D24  
PA  , // PA 3 ** 25 ** D25  
PA  , // PA 4 ** 26 ** D26  
PA  , // PA 5 ** 27 ** D27  
PA  , // PA 6 ** 28 ** D28  
PA  , // PA 7 ** 29 ** D29  
PC  , // PC 7 ** 30 ** D30  
PC  , // PC 6 ** 31 ** D31  
PC  , // PC 5 ** 32 ** D32  
PC  , // PC 4 **
  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值