不得不承认,PSOC的功能是非常强大的,主要归因于其内部丰富可配置的数字外设和模拟外设。以前没接触过PSOC,刚一入手的时候着实有些丈二和尚摸不着头脑,习惯与传统的MCU设计方式,对于这个不需要编程来配置外设的PSOC4,用IO口点亮个LED都不知道从何下手。PSOC4几乎都是使用原理图的方式来规划外设和IO口,虽然最终都是通过配置寄存器来实现的,但是寄存器操作的方式并没给用户提供友好的接口,所以使用外设模块编译生成的接口函数式首选方式,即使用一个IO口点亮LED,也要通过原理图来设计。 我今天只是初步了解了下IO口,IO的输入输出模式很多,高阻输入、上下拉输入、Push-pull输出、OD输出(OD居然还能输出高OD),IO配置是非常灵活的,一般数字功能可以随便映射到某个IO口,任何几个IO口都可以通过ControlReg和StatusReg组成一组总线。 例如可以使用ControlReg模块同时控制三个LED:
因此可以使用 uint8 reg=0; for(;;) { Control_Reg_Write(reg++); CyDelay(500); } 来循环显示7中颜色。 我还用PWM模块写了个LED颜色逐渐变化的程序,看起来还算漂亮,分享一下: 原理图:
主要代码: void main() { int red=65535, green=65535, blue=65535; uint8 r=0, g=0, b=0;
Clock_1_Start(); PWM_1_Start(); PWM_2_Start(); PWM_1_WriteCompare1(65535); PWM_1_WriteCompare2(65535); PWM_2_WriteCompare1(65535); for(;;) { if (r) { red += 30; if (red > 65535){ red = 65535; r = 0; } } else { red -= 30; if (red < 0) { red = 0; r = 1;} } if (g) { green += 20; if (green > 65535){ green = 65535; g = 0; } } else { green -= 20; if (green < 32768) { green = 32768; g = 1;} } if (b) { blue += 10; if (blue > 65535){ blue = 65535; b = 0; } } else { blue -= 10; if (blue < 32768) { blue = 32768; b = 1;} } CyDelay(1); PWM_1_WriteCompare1(red); PWM_1_WriteCompare2(green); PWM_2_WriteCompare1(blue); } }
最后晒一晒我的业余工作场所照,业余时间主要是看电脑和听收音机了 :
[ 本帖最后由 lcofjp 于 2013-11-16 22:37 编辑 ]
|