【PSoC4】关于电灯泡,关于合体……
0赞
发表于 2013/10/9 19:34:55
阅读(2205)
上学时和全班小伙伴去划船,3人一组,结果和我一组的童鞋在船上开始远眺另外一组,然后积极讨论:某某分组时动作慢了点,成电灯泡了,多么尴尬云云。作为一单纯的好学少年,我就是从那时开始学习什么叫“电灯泡”的。记得当时船上的讨论结果是宁可不玩,也不做电灯泡,活受罪。后来我大了点了,在新的学校有了新的认识——宿舍某男Z,看另一男L的中学女同学Q很顺眼,于是在Q回家时借口去L家同坐一辆车,L自知成灯泡一枚,主动和Z换位置,然Z未果。后Z托L多次制造机会、帮助牵线等等。终于,L和Q去修正果去了……可见灯泡也可以华丽丽地逆袭滴。
关于psoc4的官方Example,可以看到,四个里前面两个都是点亮LED的,也就是说——点电灯泡的,而另外2个一个是按键中断、另一个是触摸按键。闲的时候,把这4个拼在一起,做了个调色灯泡——Examples,合体!
先看一下全貌。因为要用Capsense分别调整RGB3个不同LED的亮度,因此增加了一个ControlReg:
下面分开说:
1】按键中断:
psoc里用中断来响应按键,以前月之骑士讨论过2种方式,这里貂尾续狗罗嗦一下:像上图这种方式,需要在中断响应函数里手工调用一下对应Pin的清中断函数,详细的可以看本文末附的代码;如果是把下图中HW Connection选中的话,就可以把isr直接连到pin上,但是在本例中,由于响应的是上升段,所以在加电初始化时触发一次,有利有弊,看应用上的需要了。
这个真没什么可说的了,Cypress看家本领,配合Creator使用,不改名字的话几乎不用键盘,像下面直接按一下“Add”的按钮,连参数都是按Kit上的预设的不用改。
3】PWM这里为了配合Capsense,Period配成100,亮一点儿。
4】ControlReg
由于准备用ControlReg来控制LED Pin是否输出,Pin要选上“OutputEnable”:
ControlReg配3输出
看视频吧:
看,顶个华丽丽灯泡的合体——像不像这位?
附代码:
#include#define NO_FINGER 0xFFFFu #define USER_KEY_FUNCTION userKeyInterrupt CY_ISR_PROTO(USER_KEY_FUNCTION); int button_stat=0; void main() { uint16 sliderPosition = NO_FINGER; isr_key_Start(); isr_key_SetVector(USER_KEY_FUNCTION); CyGlobalIntEnable; PWM_Red_Start(); PWM_Green_Start(); PWM_Blue_Start(); Clock_PWM_Start(); CapSense_Start(); CapSense_InitializeAllBaselines(); for(;;) { CapSense_UpdateEnabledBaselines(); CapSense_ScanEnabledWidgets(); while(CapSense_IsBusy()); sliderPosition = CapSense_GetCentroidPos(CapSense_LINEARSLIDER0__LS); switch(button_stat){ case 0: Control_Reg_color_Write(4+2+1); break; case 1: Control_Reg_color_Write(4+0+0); if(sliderPosition != NO_FINGER)PWM_Blue_WriteCompare(sliderPosition); break; case 2: Control_Reg_color_Write(0+2+0); if(sliderPosition != NO_FINGER)PWM_Green_WriteCompare(sliderPosition); break; case 3: Control_Reg_color_Write(0+0+1); if(sliderPosition != NO_FINGER)PWM_Red_WriteCompare(sliderPosition); break; default: break; } } } CY_ISR(USER_KEY_FUNCTION) { isr_key_Disable(); KEY_ClearInterrupt(); button_stat=(button_stat>=3)?0:button_stat+1; isr_key_Enable(); }