合泰单片机之点亮开发板的所有LED灯
上一篇文章,我们介绍了如何从0开始新建工程,这一篇我们来实现最简单的操作,点亮LED灯。
HT66F0185芯片
1.通用输入\输出内部结构
2.GPIO寄存器介绍
PAWUn: PA 口引脚唤醒功能控制
0: 除能
1: 使能
PAPUn/PBPUn/PCPUn/PDPUn: 输入 / 输出引脚上拉功能控制
0: 除能
1: 使能
PAn/PBn/PCn/PDn: 输入 / 输出口数据位
0: 数据 0
1: 数据 1
PACn/PBCn/PCCn/PDCn: 输入 / 输出引脚类型选择
0: 输出
1: 输入
要将PA3配置为输出模式并初始化为低电平(默认熄灭状态),需按以下步骤设置寄存器:
_pac3 = 0;//设置为输出
_pa3 = 0;//引脚输出低电平
3.开发板原理图
根据原理图分析,CXLED1灯的一端接地,另一端连接至P8接口的第1引脚,未直接与单片机端口相连。可采用跳线帽将P8的1、2引脚短接,使CXLED1通过CX(PA3)引脚接入单片机。此时只需向PA3引脚输出高电平即可点亮LED灯。
4.实现部分代码
由于CXLED1的一端连接到比较器的CX端,而芯片的I/O引脚数量有限,通常具有复用功能。这些引脚不仅可用作通用I/O,还可复用为CX、IIC通信总线或SPI通信总线等其他功能。通过查阅比较器的寄存器发现:
因此,如果要将PA3直接用作通用I/O口,需要在初始化时将cos设置为1。
_cos = 1; //设置pa3管脚为IO,而不是比较器输出
为防止程序运行时看门狗定时器触发系统复位,应在初始化阶段关闭看门狗功能。
_wdtc=0xa8;//关闭看门狗
为使LED灯状态变化更明显,我们采用亮1秒、灭1秒的循环模式。
while(1)
{CLED=0;delay_ms(1000);CLED=1;delay_ms(1000);
}
要实现LED灯1秒亮1秒灭的效果,可以通过以下步骤实现:
- 将PA3引脚设置为低电平点亮LED
- 调用1秒延时函数
- 将PA3引脚切换为高电平熄灭LED
- 再次调用1秒延时函数
- 循环执行上述步骤
为此需要预先编写一个精确的1秒延时函数。
我们之前曾在工程设置中选择了V3编译器,该编译器内置了延时函数功能。
根据HT66F0185芯片手册的数据,当系统时钟频率为20MHz时,每个时钟周期为0.05μs。图例显示指令周期为0.2μs,通过计算0.2μs/0.05μs=4,可以得出每个指令周期包含4个时钟周期(状态周期)。
我们的主频设置为8MHz,每个指令周期为1/8000000 * 4 = 0.5μs。因此,当主频为8MHz时,指令周期为0.5μs。
具体应用时:
- GCC_DELAY(1) 表示延迟1个指令周期,即0.5μs
- GCC_DELAY(2000) 表示延迟2000个指令周期,换算结果为0.5μs * 2000 = 1ms
void delay_ms(u16 ms)
{while(ms--){GCC_DELAY(2000);//编译器自带延时指定个周期,在主频8Mhz下,一个指令周期为0.5us GCC_CLRWDT();}
}
5.完整代码
#include "HT66F0185.h"#define u8 unsigned char
#define u16 unsigned int#define CLED _pa3void delay_ms(u16 ms)
{while(ms--){GCC_DELAY(2000);//编译器自带延时指定个周期,在主频8Mhz下,一个指令周期为0.5us GCC_CLRWDT();}
}void main()
{_wdtc=0xa8;//关闭看门狗_pac3=0;//设置为输出_pa3 = 0;_cos=1;//设置pa3管脚为IO,而不是比较器输出while(1){CLED=0;delay_ms(1000);CLED=1;delay_ms(1000);}
}
6.实验现象
如下图所示,将跳线帽插上,就会发现CLED不停的亮1s,熄灭1s.
B86D20A-3芯片
1.GPIO寄存器介绍
PAWUn: PA 口引脚唤醒功能控制
0: 除能
1: 使能
PAPUn/PBPUn/PCPUn/PDPUn: 输入 / 输出引脚上拉功能控制
0: 除能
1: 使能
PAn/PBn/PCn/PDn: 输入 / 输出口数据位
0: 数据 0
1: 数据 1
PACn/PBCn/PCCn/PDCn: 输入 / 输出引脚类型选择
0: 输出
1: 输入
2.原理图
根据原理图设计,8个LED的正极共同连接至LEDCOM端,负极分别连接单片机的各个引脚。要实现LED点亮效果,需将LEDCOM端置为低电平,同时给对应引脚输出高电平。
3.部分代码
单片机引脚通常具备多功能特性。除了作为通用输入输出(GPIO)外,它们还可复用为其他特殊功能。因此,在初始化时往往需要先禁用其他功能,才能将其配置为GPIO模式。
LED1:
PD1端口的复位功能CTP0B:该引脚作为外部定时器输出功能可忽略;SSEG17用于LCD驱动的SEG输出,需关闭;LXT为晶振引脚,由于开发板未外接晶振,该功能无需配置。其他引脚功能参照此原则处理。
_seg17en = 0; //选用GPIO功能
_pdc1 = 0; //输出引脚选择
_pd1 = 0; //输出低电平
这里直接设置
_ace7 = 0;
4.完整代码
#include "BS86D20A-3.h"#define u16 unsigned int #define LED1_ON _pd1 = 1
#define LED1_OFF _pd1 = 0
#define LED2_ON _pd0 = 1
#define LED2_OFF _pd0 = 0
#define LED3_ON _pa1 = 1
#define LED3_OFF _pa1 = 0
#define LED4_ON _pc1 = 1
#define LED4_OFF _pc1 = 0
#define LED5_ON _pc7 = 1
#define LED5_OFF _pc7 = 0
#define LED6_ON _pc6 = 1
#define LED6_OFF _pc6 = 0
#define LED7_ON _pc0 = 1
#define LED7_OFF _pc0 = 0
#define LED8_ON _pb6 = 1
#define LED8_OFF _pb6 = 0
#define LEDCOM _pd2 = 0void delay_ms(u16 ms)
{while(ms--){GCC_DELAY(2000);//编译器自带延时指定个周期,在主频8Mhz下,一个指令周期为0.5us GCC_CLRWDT();}
}void Led_Init()
{//LED1_seg17en = 0;_pdc1 = 0; //输出引脚选择_pd1 = 0;//LED2_seg16en = 0;_pdc0 = 0; //输出引脚选择_pd0 = 0;//LED3_pac1 = 0; //输出引脚选择_pa1 = 0;//LED4_ace1 = 0;_pcc1 = 0; //输出引脚选择_pc1 = 0; //LED5_ace7 = 0;_pcc7 = 0; //输出引脚选择_pc7 = 0;//LED6_ace6 = 0;_pcc6 = 0; //输出引脚选择_pc6 = 0; //LED7_ace0 = 0;_pcc0 = 0; //输出引脚选择_pc0 = 0; //LED8_tm2pc0 = 0;_pbc0 = 0; //输出引脚选择_pb6 = 0; //LEDCOM_pdc2 = 0;LEDCOM;}void main()
{//_acerl=0;//设置ad口为IOLed_Init();while(1){GCC_CLRWDT();LED1_ON;LED2_ON;LED3_ON;LED4_ON;LED5_ON;LED6_ON;LED7_ON;LED8_ON; delay_ms(500);LED1_OFF;LED2_OFF;LED3_OFF;LED4_OFF;LED5_OFF;LED6_OFF;LED7_OFF;LED8_OFF; delay_ms(500);}}
将程序分别烧录至两块芯片后接通电源,此时开发板上的所有LED指示灯均被点亮。