目录
基础必备知识
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
如果对你有用的话,可不可以点个赞呢