GPIO的配置及使用(MC9S08AW60)

基础必备知识

AW60有7个GPIO接口,分别是A、B、C、D、E、F、G。每个接口最多对应8个GPIO引脚,但对每个GPIO接口编程时,寄存器设置都要是8位,只是没有引脚的位无效。用8位二进制数表示寄存器的值,8位二进制数从右向左依次表示为GPIO 0~7个 引脚。以0b开头的数是二进制,0x开头的数是十六进制(0b00001111=0x0f,0b11110000=0xf0,就是把二进制传化为十六进制)。用单片机实现什么功能其实就是对寄存器进行操作。

每个I/O(GPIO)管脚(引脚)的功能受5个寄存器的控制:

一、数据寄存器

(1)命名规则:PT+该端口(接口)的名称+D
如:PTAD、PTBD、PTCD等
(2)设置每个引脚的输出电平:1为高电平,0为低电平
如:PTAD=0b11111111 等价于 PTAD=0xff
(3)单独对每一个引脚配置数据寄存器:PTxDn(x:接口;n:引脚)
如:PTAD0=1(设置A接口的0号引脚为高电平);PTBD3=0(设置B接口的3号引脚为低电平)

二、方向寄存器

(1)命名规则:PT+该端口(接口)的名称+DD
如:PTADD、PTBDD、PTCDD等
(2)设置每个引脚是输入还是输出:1为输出,0为输入
如:PTADD=0b11111111 等价于 PTADD=0xff :设置A接口的8个引脚都是输出;PTBDD=0b00001111(0x0f):设置B接口的0 ~ 3个引脚为输出,4 ~ 7个引脚为输入。
(3)单独对每一个引脚配置方向寄存器:PTxDDn(x:接口;n:引脚)
如:PTADD0=1(设置A接口的0号引脚为输出);PTBDD3=0(设置B接口的3号引脚为输入)

三、输出驱动能力寄存器(输出高电平时电压的高低)

(1)命名规则:PT+该端口(接口)的名称+DS
如:PTADS、PTBDS、PTCDS等
(2)设置每个引脚的驱动能力:1为高驱动(接LED),0为低驱动(接IC)
如:PTADS=0b11111111 等价于 PTADS=0xff:设置A接口的8个引脚都是高驱动 ;PTBDS=0b00001111(0x0f):设置B接口的0 ~ 3个引脚为高驱动,4 ~ 7个引脚为低驱动。
(3)单独对每一个引脚配置输出驱动能力寄存器:PTxDSn(x:接口;n:引脚)
如:PTADS0=1(设置A接口的0号引脚为高驱动);PTBDS3=0(设置B接口的3号引脚为低驱动)

四、设置单片机内部输入上拉寄存器

(1)命名规则:PT+该端口(接口)的名称+PE
如:PTAPE、PTBPE、PTCPE等
(2)设置每个引脚为上拉输入:1为允许内部输入上拉,0为禁止内部输入上拉(该引脚不设置为上拉输入)
如:PTAPE=0b11111111 等价于 PTAPE=0xff:设置A接口的8个引脚都是上拉输入 ;PTBPE=0b00001111(0x0f):设置B接口的0 ~ 3个引脚为上拉输入,4 ~ 7个引脚不设置为上拉输入。
(3)单独对每一个引脚配置内部输入上拉寄存器:PTxPEn(x:接口;n:引脚)
如:PTAPE0=1(设置A接口的0号引脚为上拉输入);PTBPE3=0(不设置B接口的3号引脚为上拉输入)

五、输出摆率控制寄存器

(1)命名规则:PT+该端口(接口)的名称+SE
如:PTASE、PTBSE、PTCSE等
(2)设置每个引脚为输出摆率控制:1为允许输出摆率控制,0为禁止输出摆率控制(该引脚不设置为输出摆率控制)
如:PTASE=0b11111111 等价于 PTASE=0xff:设置A接口的8个引脚为输出摆率控制 ;PTBSE=0b00001111(0x0f):设置B接口的0 ~ 3个引脚为输出摆率控制,4 ~ 7个引脚不设置为输出摆率控制。
(3)单独对每一个引脚配置输出摆率控制寄存器:PTxSEn(x:接口;n:引脚)
如:PTASE0=1(设置A接口的0号引脚为输出摆率控制);PTBSE3=0(不设置B接口的3号引脚为输出摆率控制)

常用GPIO的配置

(1)控制LED时只需要配置:数据寄存器、方向寄存器、输出驱动能力(电流的高低)寄存器。

(2)用开关时只需要配置:方向寄存器、内部输入上拉寄存器(外部有接上拉电阻时这个寄存器也不用配置)。
读取开关状态时用数据寄存器读取,如下:

key =PTBD_PTBD3   //读取B接口3号引脚的值(1或0)

实例

一、用AW60点亮一个LED

LED负极接低电平,正极接B接口的5号引脚。

代码如下

#include <hidef.h>          //调用头文件
#include "derivative.h"

void GPIO_init(void);  //子函数声明

void main(void)    //主函数
{
	DisableInterrupts; //关闭中断,本程序未用到中断
	SOPT_COPE=0;       //关闭看门狗复位功能,避免程序复位
	GPIO_init();       //引脚初始化
	for(;;)            //主程序主循环
	{
		PTBD=0x20;     //其中PTB5号引脚输出高电平,灯亮
	}
}
void GPIO_init(void)    //子函数定义
{
	PTBDD=0xff;     //PTB设置为输出
	PTBDS=0x20;     //初始化PTB5号引脚为高驱动
	PTBD=0x00;       //初始状态PTB输出低电平,灯灭
}

二、用两个开关控制八个LED的亮灭

1、开关1按下八个LED同时亮灭,开关2按下四个LED同时亮灭,开关1、2都按下八个LED右流水灯,开关1、2都不按下八个LED左流水灯。
2、开关用上拉输入接在C接口的 0、1号引脚
3、八个LED正极都接+5V,负极接B接口的8个引脚。

代码如下

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

void Delay(uint Temp);  子函数声明

void main(void) 
{
  uchar b=0x01,c=0x80;
  EnableInterrupts; /* enable interrupts */
  SOPT_COPE=0;   //关闭看门狗复位功能,避免程序复位
  PTBDD=0xff;   //定义PTB八个引脚为输出
  PTBD=0xff;    //初始化PTB八个引脚输出高电平
  PTCDD=0xfc;  //定义PTC0和PTC0引脚为输入
  PTCPE=0x03;  //定义PTC0和PTC0引脚为上拉电阻
  for(;;)
  {
    __RESET_WATCHDOG(); /* feeds the dog */
  if(!PTCD_PTCD0&&PTCD_PTCD1)  //开关1按下
  {
  	PTBD=0x00;   //8个LED一起亮
  	Delay(1000);
  	PTBD=0xff;   //8个LED一起灭
  	Delay(1000);
  }
 
  if(PTCD_PTCD0&&!PTCD_PTCD1)  开关2按下
  {
  	PTBD=0xf0;    //前4个LED一起亮,后4个LED一起灭
  	Delay(1000);
  	PTBD=0x0f;    //前4个LED一起灭,后4个LED一起亮
  	Delay(1000);	
  }
  if(!PTCD_PTCD0&&!PTCD_PTCD1)  //开关1、2都按下,右流水灯
  {
    PTBD=~b;
    Delay(1000);
    b=b<<1;
    if(b==0x00)
  	b=0x01;
  }
  if(PTCD_PTCD0&&PTCD_PTCD1)  //开关1、2都不按下,左流水灯
  {
    PTBD=~c;
    Delay(1000);
    c=c>>1;
    if(c==0x00)
  	c=0x80;
  }
  } 
}

void Delay(uint Temp)  //延时函数,单位是ms
{
	uchar a,b;
	for(;Temp>0;Temp--)
	{
		for(b=30;b>0;b--)
		{
			for(a=10;a>0;a--);
		}
	}
}

想了解键盘中断的配置及使用请看
https://blog.csdn.net/qq_45390365/article/details/109398444

如果对你有用的话,可不可以点个赞呢

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
MC9S08DZ是一款微控制器,关于CAN初始化的具体步骤可以在MC9S08DZ60的文档中找到。根据引用\[1\]中的代码,可以看到时钟的切换和初始化的过程。在初始化外部时钟模式(FBE)时,需要设置MCGC2、MCGC1和MCGC3寄存器的值。具体的初始化步骤如下: 1. 设置MCGC2寄存器的值为0x36,选择外部1M~16M高频晶振,并将总线分频率设置为1。 2. 设置MCGC1寄存器的值为0xB8,选择外部参考时钟。 3. 设置MCGC3寄存器的值为0x00,等待外部参考时钟稳定。 4. 使用while循环等待外部参考时钟被选定。 5. 使用while循环等待时钟模式状态确认。 以上是初始化外部时钟模式(FBE)的步骤,具体的CAN初始化步骤可能需要参考MC9S08DZ60的文档中的CAN模块相关章节。 #### 引用[.reference_title] - *1* [MC9S08DZ时钟初始化](https://blog.csdn.net/wuhuijun165/article/details/46880707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [第三课 MC9S08DZ60之通用输出输入GPIO](https://blog.csdn.net/friendsdan/article/details/79493751)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [第四课 MC9S08DZ60之实时计数器RTC](https://blog.csdn.net/friendsdan/article/details/79568869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值