笔记:合泰单片机BH66F2652开发(二)GPIO

笔记:(二)GPIO引脚驱动

Author:家有仙妻谢掌柜
Date:2021/2/26
本文已于2021/3/1更新完毕。

本文用到的数据手册连接在这里

首先,先用寄存器操作控制一个LED实现电平翻转

/*******************************************************************************
 * fn		delayMs	
 * brief	延时函数
 * param	延时时间 单位为ms
 * return	无
 *******************************************************************************/
void delayMs(unsigned long int ms)
{
	while(ms--)
		GCC_DELAY(2000);//主频8Mhz,执行一条指令为0.5us。一条指令周期等于四条机器周期——》 1/8Mhz * 4 = 0.5us
}
/*******************************************************************************
 * fn		main	
 * brief	主函数
 * param	无
 * return	无
 *******************************************************************************/
void main(void)
{
	_wdtc = 0b10101000;	//关闭看门狗。直接配置看门狗寄存器,0b代表二进制。
    _pbc2 = 0;   		//设置PB2口为输出
	_cos=1;				//设置PB2管脚为IO,而不是比较器输出
	while(1)
	{
		_pb2 = 1;		//设置PB2输出高电平 高电平为VDD
		delayMs(500);	//延时500ms
		_pb2 = 0;		//设置PB2输出低电平
		delayMs(500);	//延时500ms	
	}
}

目前已经实现一个IO的电平翻转,致使LED灯亮灭。
如果想要通过判断PA3引脚是高电平,才能让PB2引脚的灯珠闪烁起来,否则就灭下去。

if(_pa3)//读取寄存器就可以判断当前引脚电平高低
{
	_pb2 = 1;		//设置PB2输出高电平 高电平为VDD
	delayMs(500);	//延时500ms
	_pb2 = 0;		//设置PB2输出低电平
	delayMs(500);	//延时500ms
}
if(!_pa3)
{
	_pb2 = 0;		//设置PB2输出低电平
}

下面简单的封装起来,比较适合调用。

控制GPIO引脚的主要寄存器都在下图中:
在这里插入图片描述
合泰的BH66F2652单片机有两种封装,对应的GPIO引脚个数也是不同的,这里以最大引脚数量来写封装函数代码。
在这里插入图片描述
该封装引脚没有PORTC和PB7引脚。
在这里插入图片描述
该封装引脚包含PORTC和PB7引脚。

一、引脚输入输出选择位

在这里插入图片描述

 /*******************************************************************************
 * fuction	gpioInput	
 * brief	设置引脚输入
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioInput(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _pac0 = 1;    break;
 		case  1: _pac1 = 1;    break;
 		case  2: _pac2 = 1;    break;
 		case  3: _pac3 = 1;    break;
 		case  4: _pac4 = 1;    break;
 		case  5: _pac5 = 1;    break;
 		case  6: _pac6 = 1;    break;
 		case  7: _pac7 = 1;    break;
 		//POARTB
 		case  8: _pbc0 = 1;    break;
 		case  9: _pbc1 = 1;    break;
 		case 10: _pbc2 = 1;    break;
 		case 11: _pbc3 = 1;    break;
 		case 12: _pbc4 = 1;    break;
 		case 13: _pbc5 = 1;    break;
 		case 14: _pbc6 = 1;    break;
 		case 15: _pbc7 = 1;    break;
 		//POARTC
 		case 16: _pcc0 = 1;    break;
 	}
 }
 /*******************************************************************************
 * fuction	gpioOutput	
 * brief	设置引脚输出
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioOutput(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _pac0 = 0;    break;
 		case  1: _pac1 = 0;    break;
 		case  2: _pac2 = 0;    break;
 		case  3: _pac3 = 0;    break;
 		case  4: _pac4 = 0;    break;
 		case  5: _pac5 = 0;    break;
 		case  6: _pac6 = 0;    break;
 		case  7: _pac7 = 0;    break;
 		//POARTB
 		case  8: _pbc0 = 0;    break;
 		case  9: _pbc1 = 0;    break;
 		case 10: _pbc2 = 0;    break;
 		case 11: _pbc3 = 0;    break;
 		case 12: _pbc4 = 0;    break;
 		case 13: _pbc5 = 0;    break;
 		case 14: _pbc6 = 0;    break;
 		case 15: _pbc7 = 0;    break;
 		//POARTC
 		case 16: _pcc0 = 0;    break;
 	}
 }

二、引脚上拉使能除能选择位

在这里插入图片描述

 /*******************************************************************************
 * fuction	gpioPullUpEnable	
 * brief	设置引脚上拉使能
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioPullUpEnable(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _papu0 = 1;    break;
 		case  1: _papu1 = 1;    break;
 		case  2: _papu2 = 1;    break;
 		case  3: _papu3 = 1;    break;
 		case  4: _papu4 = 1;    break;
 		case  5: _papu5 = 1;    break;
 		case  6: _papu6 = 1;    break;
 		case  7: _papu7 = 1;    break;
 		//POARTB
 		case  8: _pbpu0 = 1;    break;
 		case  9: _pbpu1 = 1;    break;
 		case 10: _pbpu2 = 1;    break;
 		case 11: _pbpu3 = 1;    break;
 		case 12: _pbpu4 = 1;    break;
 		case 13: _pbpu5 = 1;    break;
 		case 14: _pbpu6 = 1;    break;
 		case 15: _pbpu7 = 1;    break;
 		//POARTC
 		case 16: _pcpu0 = 1;    break;
 	}
 }
 /*******************************************************************************
 * fuction	gpioPullUpDisable	
 * brief	设置引脚上拉失能
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioPullUpDisable(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _papu0 = 0;    break;
 		case  1: _papu1 = 0;    break;
 		case  2: _papu2 = 0;    break;
 		case  3: _papu3 = 0;    break;
 		case  4: _papu4 = 0;    break;
 		case  5: _papu5 = 0;    break;
 		case  6: _papu6 = 0;    break;
 		case  7: _papu7 = 0;    break;
 		//POARTB
 		case  8: _pbpu0 = 0;    break;
 		case  9: _pbpu1 = 0;    break;
 		case 10: _pbpu2 = 0;    break;
 		case 11: _pbpu3 = 0;    break;
 		case 12: _pbpu4 = 0;    break;
 		case 13: _pbpu5 = 0;    break;
 		case 14: _pbpu6 = 0;    break;
 		case 15: _pbpu7 = 0;    break;
 		//POARTC
 		case 16: _pcpu0 = 0;    break;
 	}
 }

三、引脚拉高拉低电平选择位

 /*******************************************************************************
 * fuction	gpioHigh	
 * brief	设置引脚高电平
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioHigh(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _pa0 = 1;    break;
 		case  1: _pa1 = 1;    break;
 		case  2: _pa2 = 1;    break;
 		case  3: _pa3 = 1;    break;
 		case  4: _pa4 = 1;    break;
 		case  5: _pa5 = 1;    break;
 		case  6: _pa6 = 1;    break;
 		case  7: _pa7 = 1;    break;
 		//POARTB
 		case  8: _pb0 = 1;    break;
 		case  9: _pb1 = 1;    break;
 		case 10: _pb2 = 1;    break;
 		case 11: _pb3 = 1;    break;
 		case 12: _pb4 = 1;    break;
 		case 13: _pb5 = 1;    break;
 		case 14: _pb6 = 1;    break;
 		case 15: _pb7 = 1;    break;
 		//POARTC
 		case 16: _pc0 = 1;    break;
 	}
 }
 /*******************************************************************************
 * fuction	gpioLow	
 * brief	设置引脚低电平
 * param	gpioPin
 * return	无
 *******************************************************************************/  
 void gpioLow(char gpioPin)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: _pa0 = 0;    break;
 		case  1: _pa1 = 0;    break;
 		case  2: _pa2 = 0;    break;
 		case  3: _pa3 = 0;    break;
 		case  4: _pa4 = 0;    break;
 		case  5: _pa5 = 0;    break;
 		case  6: _pa6 = 0;    break;
 		case  7: _pa7 = 0;    break;
 		//POARTB
 		case  8: _pb0 = 0;    break;
 		case  9: _pb1 = 0;    break;
 		case 10: _pb2 = 0;    break;
 		case 11: _pb3 = 0;    break;
 		case 12: _pb4 = 0;    break;
 		case 13: _pb5 = 0;    break;
 		case 14: _pb6 = 0;    break;
 		case 15: _pb7 = 0;    break;
 		//POARTC
 		case 16: _pc0 = 0;    break;
 	}
 }

四、引脚唤醒选择位在这里插入图片描述

 /*******************************************************************************
 * fuction	gpioWakeup	
 * brief	设置引脚唤醒
 * param	gpioPin:引脚号   enORdis:使能/除能
 * return	无
 *******************************************************************************/  
 void gpioWakeup(char gpioPin,char enORdis)
 {
 	switch(gpioPin)
 	{
 		//POARTA
 		case  0: if(!enORdis) _pawu0 = 0; else _pawu0 = 1; break;
 		case  1: if(!enORdis) _pawu1 = 0; else _pawu1 = 1; break;
 		case  2: if(!enORdis) _pawu2 = 0; else _pawu2 = 1; break;
 		case  3: if(!enORdis) _pawu3 = 0; else _pawu3 = 1; break;
 		case  4: if(!enORdis) _pawu4 = 0; else _pawu4 = 1; break;
 		case  5: if(!enORdis) _pawu5 = 0; else _pawu5 = 1; break;
 		case  6: if(!enORdis) _pawu6 = 0; else _pawu6 = 1; break;
 		case  7: if(!enORdis) _pawu7 = 0; else _pawu7 = 1; break;
 	}
 }
#ifndef _GPIO_H
#define _GPIO_H

#include "BH66F2652.h"

//POARTA
#define PA0  0
#define PA1  1
#define PA2  2
#define PA3  3
#define PA4  4
#define PA5  5
#define PA6  6
#define PA7  7
//POARTB
#define PB0  8
#define PB1  9
#define PB2 10
#define PB3 11
#define PB4 12
#define PB5 13
#define PB6 14
#define PB7 15
//POARTC
#define PC0 16

extern void gpioInput(char gpioPin);
extern void gpioOutput(char gpioPin); 
extern void gpioPullUpEnable(char gpioPin); 
extern void gpioPullUpDisable(char gpioPin); 
extern void gpioHigh(char gpioPin);
extern void gpioLow(char gpioPin);
extern void gpioWakeup(char gpioPin,char enORdis);

#endif
/*--------------------------------END THE FILE-----------------------------------*/

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值