先讲个小明同学上小学的故事:学分数的概念时2/3有这样2个说法,一张饼分3份取其中的2份,或者是2张饼分三份取其中的一份。作为一名注重锻炼发散思维的有志儿童,小明立即敏锐的意识到“剩下的饼给谁吃呢?”随着岁月的流逝和老师的教导,小明终于意识到,掌握不同的方法或思想,可以适应多种不同的情况,就好象会学狗叫的老鼠能吓跑猫一样,是非常有用滴。在学习了加法分配率和结合律之后,小明有了第一个巨大的发现,就是3个数相加可以出现6种不同数序的排列,每种排列又有2种不同的结合方式,所以一到老师留“一题多解”作业时候,小明总能把一个简单问题搞出一大堆同构的垃圾答案。老师被填塞的发狂,终于发飙“请你父亲过来聊聊你这个天才的将来吧”,后来的恐怖片很老套,就不讲了。
下面来说说一道题“点亮CY8CKIT-003板上的led灯”,其实就是“GPIO输出有哪些方式”围观的群众注意适度使用,如果导致家长暴走,楼主很是欣慰。不,应该是很遗憾。
楼主手上板子的芯片是 CY8C3866AXI-040ES2,经过坛子里几位先进同学扫雷经验,可以使用creator2.0,2.1就不行了。楼主的教训是,以下实验中2、3在1.0下没成功,有喜欢钻牛角的童鞋可以坚韧不拔的再试试。
1】最简单的:配出来!
感觉PSoC3最大的特点就是不仅不用费心写汇编,甚至经常不用写程序,比如这第一个例子,按下面配就可以了(如果不改名字,只用鼠标就可以,懒人福音啊):
先在原理图里加2个“Digital Output Pin”和一个“Logic Low '0'”,然后按下图连接配置:
2012-11-29_172147_00002.png 
之后设置输出映射:
2012-11-29_172131_00001.png 
就可以了。

2】来点儿汇编:通过修改PSoC 3的 register实现
这个在《8051片上可编程系统原理及应用》上有例子,大家可以看6.2.3节,不过书上例子是在CY8CKIT-030上用的,因此不能照搬。
首先,新建一个project,然后在项目上点鼠标右键,选“add item”:
2012-11-29_173623_00003.png 
然后,文件类型选第一个,在下面起文件名:
2012-11-29_173729_00004.png 
之后打开a51文件,内容换成这个:

  1. ; ========================================
  2. ;
  3. ; Copyright YOUR COMPANY, THE YEAR
  4. ; All Rights Reserved
  5. ; UNPUBLISHED, LICENSED SOFTWARE.
  6. ;
  7. ; CONFIDENTIAL AND PROPRIETARY INFORMATION
  8. ; WHICH IS THE PROPERTY OF your company.
  9. ;
  10. ; ========================================
  11. $NOMOD51
  12. $INCLUDE (PSoC3_8051.inc)
  13.  
  14. NAME CONTROL_GPIO
  15.  
  16. segmaxcode segment code
  17. public CONTROL_GPIO
  18.  
  19. segmaxdata segment data
  20.   rseg segmaxdata
  21.   
  22.   rseg segmaxcode
  23.  
  24. CONTROL_GPIO:
  25.   NOP
  26. loop:
  27.   NOP
  28. CONTROL_GPIO_II:
  29.   MOV     DPTR,#05120H ;GPIO P2
  30.   MOV     A,#00H
  31.   MOVX    @DPTR,A
  32. CONTROL_GPIO_IV:
  33.   MOV     DPTR,#05140H ;GPIO P4
  34.   MOV     A,#00H
  35.   MOVX    @DPTR,A
  36.   
  37.   JMP loop
  38.   RET
  39. END
  40. ;[] END OF FILE
  41.  
复制代码

第29行、第33行的地址从这里332页勘误:应为331页,感谢ht868788指出查得:
 PSoC 3 Registers TRM_001-50581.pdf (4.21 MB, 下载次数: 14) 
然后修改main.c成这样:

  1. #include <device.h>
  2. extern CONTROL_GPIO();
  3. void main(){
  4.    while(1) {
  5.       CONTROL_GPIO();
  6.    }
  7. }
复制代码

在原理图里加2个“Digital Output Pin”,然后按下图连接配置:
2012-11-29_174750_00005.png 
设置输出映射:
2012-11-29_174902_00006.png 
就可以了。

3】在C中调用特殊功能寄存器
也是《8051片上可编程系统原理及应用》上的例子,6.2.4节,略作修改即可:
原理图、连接配置都和上面的【2】一样,只是main.c要写成这样:

  1. #include <device.h>
  2. void main(){
  3.         SFRPRT2SEL=0x0F;
  4.         SFRPRT4SEL=0x0F;
  5.     for(;;)    {
  6.                 SFRPRT2DR=0x00;
  7.                 SFRPRT4DR=0x00;
  8.     }
  9. }
复制代码

以上可以参考这个手册的63页:
 PSoC 3 Architecture TRM_001-50235.pdf (3.11 MB, 下载次数: 13) 

4】“Digital Output Pin”的API:
这个就更简单了,按【2】里面配好原理图、连接,然后双击Digital Pin,跳出来一个窗口:
2012-11-29_174750_00005.png 
点击左下角的“datasheet”就可以看文档了。
修改main.c:

  1. #include <device.h>
  2.  
  3. void main()
  4. {
  5.     for(;;)    {
  6.                 Pin_high_Write(0);
  7.                 Pin_low_Write(0);
  8.     }
  9. }
复制代码

以上点亮CY8CKIT-003板上的led灯的4种方法中,【1】是靠硬件输出,可以有很多种变化(这个容楼主择吉日再叙),【2】、【3】效率最高,但是可移植性、可维护性差,所以一般情况下推荐用【4】。

楼主匆忙而就,必有漏洞,还望诸位同学指正。元芳,你家大人有何高见?