基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)

 电路板原理图

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第1张图片

触摸脚选择:PB1、PB2、PB3、PB4、PB5

这里我感觉触摸脚PB5应该是PB0。

程序结构

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第2张图片

程序逻辑

其实就是在HS16F3211_TkLib.c中存在与触摸相关的函数,然后在

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第3张图片

每个按键封装一个专门对这个按键按下或者松开不同的状态执行不同的操作。

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第4张图片

在main.c里的while循环里会不停地执行这个按键查询函数。

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第5张图片

程序拆解

GPIO初始化

//****GPIO设置****//
// 触摸脚和CMOD脚必须设置成输出低模式,不能复用
// 触摸脚和CMOD脚必须设置成输出低模式,不能复用
// 触摸脚和CMOD脚必须设置成输出低模式,不能复用
void GPIO_Init(void)
{
	// option注意事项
	OPTION = 0b00000010; //     option赋值非零正常赋值
						 //  	这个寄存器可以同时控制PB与PA
						 //     Bit7 INT1EDG, 外部中断 1 触发方式 0 INT1 引脚下降沿触发
						 // 	Bit6 INTEDG, 外部中断 触发方式 0 INT 引脚下降沿触发
						 // 	Bit5 T0CS, TMR0 时钟源选择位 0 内部指令时钟
						 // 	Bit4 T0SE, TMR0 时钟源边沿选择位 0 T0CKI 引脚下降沿触发计数
						 // 	Bit3 PSA, 预分频分配位 0 预分频器分配给 TMR0
						 // 	Bit2:0 PS[2:0], 预分频配置 010 '8 分频

	// PORTA注意事项	//
	PORTA = 0b00000000; // 0010 0001
	IOSTA = 0b00000000; // IOSTA赋值非零正常赋值(0-OUT;1-IN)
	// PORTA = 0b00000000;	//数据寄存器

	// PORTB注意事项	//
	PORTB = 0b00000000; // 数据寄存器
	IOSTB = 0b00000000; // IOSTB赋值非零正常赋值(0-OUT;1-IN)
	// PORTB = 0b00000000;	//数据寄存器

	// UP_PULL	:bit对应关系对照手册
	// 输入状态下配置端口上拉
	// bit对应关系包含PORTB7~PORTB4、PORTB2~PORTB0;
	PHCON = 0b11111111; // 1111 -111 :1-DIS;0-EN

	// DOWN_PULL	:bit对应关系对照手册
	// 输入状态下配置端口下拉
	// bit对应关系包含PORTB2~PORTB0和PORTA3~PORTA0;
	PDCON = 0b11111111; //-111 1111 :1-DIS;0-EN

	// OPEN_DRAIN	:bit对应关系对照手册
	// 输出状态下配置端口开漏(Open Drain Output)
	// 开漏输出无法真正输出高电平,即高电平没有驱动能力,需要借助外部上拉电阻完成对外驱动;
	// 端口设置开漏输出时,该端口需外接上拉电阻才能实现输出逻辑1的能力。
	ODCON = 0b00000000; // 1111 -111 :1-EN;0-DIS

	// WUCON:bit对应关系对照手册
	// 输入状态下配置PORTB输入状态变化唤醒控制寄存器
	// 睡眠状态下有效
	WUCON = 0b00000000; // 0000 0000	:1-EN;0=DIS
}

OPTION的宏定义

//OPTION_REG

volatile unsigned char           OPTION_REG          @ 0x081;

#define     OPTION  OPTION_REG

OPTION的使用

OPTION = 0b00000010;

根据这个宏定义我们可以知道,其实对这个OPTION这个变量赋值其实就是在操作OPTION_REG这个寄存器。

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)_第6张图片

这里的作用其实主要就是预分频比率为1:8;
预分频器分配给TMR0;
TMR0时钟源边沿选择位,TOCK1引脚下降沿触发计数;
TMR0时钟源选择为内部指令时钟;
PB0外部中断触发方式选择引脚下降触发中断;
PB1外部中断触发方式选择引脚下降触发中断;

其他寄存器以此类推就行

短按按键控制GPIO水平翻转

观察源码,在while循环里找到按键扫描函数

	if((TKey_Signal.oneBit.b0==1) && (Pre_TKey_Release.oneBit.b0==1))
	{
		Pre_TKey_Release.oneBit.b0=0;
		//-----------------------------------------//
		//松键状态下,检测到有手指标志,执行一次;
		//松键状态下,检测到有手指标志,执行一次;
		//-----------------------------------------//
		//User can add code
		//按键按下执行-在这里
		F_User_Tkey0 = 1;
		//PB ^= 0x40;		//翻转 PB6 的输出电平
		//-----------------------------------------//
	}
	else if(TKey_Signal.oneBit.b0==0)	
	{
		Pre_TKey_Release.oneBit.b0=1;	//无手指 执行
		//-----------------------------------------//
		if(F_User_Tkey0==1)	//松键执行-在这里
		{
			F_User_Tkey0=0;
			PA ^= 0x02;		//翻转 PB6 的输出电平
			#if(IS_SLEEP_MODE == 1)	
				F_User_Sleep = ~F_User_Sleep;		//测试使用,用户需要注释,自行根据程序给出该标志位
			#endif
		}
		//-----------------------------------------//
	}
}

其实就是按键按下会让PA引脚的数据寄存器的值与0x02进行异或,异或就是相同取0不同取1,这样就可以让PA2电平一直翻转。

你可能感兴趣的:(单片机,嵌入式硬件)