基础必备知识
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 #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 #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
上一篇:mc9s08dz60 BootLoader基于bin文件
下一篇:飞思卡尔电机驱动
推荐阅读最新更新时间:2024-11-09 14:27
推荐帖子
- 分享MSP430F5529时钟模块总结
- 开始学习MSP430系列一款新CPU,F5529。按照之前学430的方法,我开始了解他的时钟部分,我参照TI官方例程学习,其中有段程序让我在实验室困惑了很久,这句注释如下:ACLK=n/a,MCLK=SMCLK=BRCLK=defaultDCO=1.048576MHZ都知道msp430的时钟系统灵活多变,他的USC模块有三个时钟(MCLK,SMCLK,ACLK)和五个时钟源(XT1CLK,VLO,REFOCLK,DCO,XT2)PUC之后,UCS模块的默认配置如下:1.XT
- fish001 微控制器 MCU
- 第一时间抢先报:ADI创新大赛获奖作品图赏
- 呵呵下午去参观了在华中举行的ADI创新设计大赛颁奖礼,感觉学生们太可爱了。在过一两天文章中详述方案,先上图,大家也可以猜猜是啥方案。第一时间抢先报:ADI创新大赛获奖作品图赏4
- soso 电子竞赛
- 加密U盘开发问题,是否和主控芯片有关?(高手帮忙)
- 需要开发一个加密U盘,就是要实现类似iFormat的加密。看来很多资料,还是无从下手。密码存放在那里?如何重新更改fat分区信息?这个操作是不是和主控有关系呢?希望大家一起讨论。加密U盘开发问题,是否和主控芯片有关?(高手帮忙)呵呵,刚好完成了一个加密U盘。一般来说,在U盘上不存密码,而是存储使用RSA加密的一段数据;用户登录时输入私钥,用私钥解密该数据,如果能解密成功就允许登录;剩下的看你的密级做了。那不是相当于这个登陆私钥只是做登陆用的。U盘中实际的数据是明
- xstlovezxh 嵌入式系统
- 推荐一些满足美国能源部标准doe6 的AC-DC转换器类产品
- InnoSwitch产品系列InnoSwitch™系列IC将初级、次级和反馈电路同时集成到一个表面贴装离线式反激开关IC中。InnoSwitchIC集成了初级FET、初级侧控制器、用于同步整流的次级侧控制器以及可省去光耦器的创新性的FluxLink™技术产品详情LinkSwitch产品系列LinkSwitch™系列IC是一种低功率离线式开关器件,它们同时将高精度控制器和高压MOSFET集成在一个低引脚数封装内。LinkSwi
- eric_wang 电源技术
- [Coremark跑分评测] Nucleo-L432KC Coremark跑分
- 测试对象:Nucleo-L432KC测试环境:Windows+Eclipse+Ac6测试代码:从eembc.org官网,下载的跑分软件下载地址:http://www.eembc.org/coremark/index.phpCoreMark代码移植方法:参考文档:《如何将CoreMark程序移植到STM32上》值得注意的是,帖子中的串口设置,奇偶失能参数:Parity在设置为Odd时,本次测试通过VC
- wolfgang2016 stm32/stm8
- 关于中断事件EVENT
- 在IIC_INIT中建立事件gI2CEvent=CreateEvent(NULL,FALSE,FALSE,NULL);(为自动重置)在中断线程I2C_IntrThread中SetEvent(gI2CEvent)后进入IIC_READ函数的ret=WaitForSingleObject(gI2CEvent,I2C_RW_TIMEOUT);为什么还需要ResetEvent(gI2CEvent)???我看书中介绍操作系统会自动设置为无信号状态。DWORDIIC_Read
- liaohuchen 嵌入式系统
设计资源 培训 开发板 精华推荐
- LT1308BCS8 SEPIC(单端初级电感转换器)的典型应用电路将 3V 至 10V 输入转换为 5V/500mA 稳压输出
- RT9297 3A高性能升压DC/DC转换器典型应用电路
- LT3091IFE 无镇流器并联器件的典型应用(50mA 最小负载)
- 应用示例 - STM32F101xx 和 STM32F103xx 内核和系统外设中的 6 个
- LT8330HS6 4V 至 16V 输入、-5V 反相转换器的典型应用电路
- MCP1501T-33E/CHY 3.300V 负参考电压典型应用电路
- LTC3615EFE 双路 3A 同步降压型 DC/DC 转换器具有外部补偿的典型应用
- MPC5566VBBOARDS: MPC5566 Vertical基础板
- 使用 Semtech 的 SC1630 的参考设计
- LT1956EGN 5V 降压转换器的典型应用电路
- 盛夏嗨学有礼——和dcexpert一起学ESP8266
- 【答题有礼】了解PI推出的全新LinkSwitch-XT2离线反激式开关电源IC产品系列
- 下载安森美半导体工业物联网工业解决方案,百份好礼送!
- 【XILINX 主题分享月】 低功耗资料大搜集!
- TI即将直播【 MSP430 系列最新超声波流量测量方案】,你会错过?报名看直播赢双重好礼喽!
- CadenceLIVE China 2022中国线上用户大会 报名中!
- ADI 全新技术资料集锦
- 你敢评,我敢送! 点评《越控越有趣-TI C2000 LaunchPad炼成记》尽享精彩好礼!
- 直播|基于英特尔® Agilex™ FPGA F-Tile的以太网硬核IP详解及如何使用oneAPI对FPGA编程