8775|0

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

【CY8CKIT-149 PSoC 4100S测评】+LED开关计数与LCD显示(结项报告) [复制链接]


[项目概述]
本项目将CY8CKIT-149 PSoC 4100S作为控制核心,通过外接LCD1602作为显示设备,外接按键和LED作为信号接收与显示测试。
整个项目硬件如下图所示。其中PSoC板子上的按键和外接的按键共用一个引脚,目的是测试外接的按键与板子上的按键效果一样。
PPSoC板子上的LED和外接的LED也共用一个引脚,但PSoC板子上的LED为低电平点亮,自制板子上的LED为高电平点亮。



项目实现的功能通过按键来控制LED的亮灭,同时将LED的状态(PSoC板子上的那个LED)显示在LCD1602上。
并且对按键按下的次数进行计数,将计数值也显示在LCD1602上。
另外,PSoC板子上的3个触摸按键控制与之相邻的LED的亮灭(实时指示触摸按键是否按下)。

[硬件设计]

1)LCD1602底座的制作
     LCD1602的底座制作在上个帖子中已有介绍,请查看这里
2)按键与LED测试小板的制作
     制作了一个8路LED+3路按键的测试小板,如下图,8路LED为共地连接,即均为高电平点亮模式。
     3路按键也为共地连接,按下按键后按键信号接地。


此次测试只用到小板子的1个LED和1个按键。

[软件设计]

软件的编写使用新建空项目的方式,如何新建空项目参考之前的这篇

新建项目后,先在原理图页面添加需要用到的元件,如下图。
需要用到LCD,电容传感器(CapSense),IIC模块(用于电容传感器的通信),按键(SW),4个LED。


需要注意的是,PSoC上三个电容按键的Tx引脚在硬件连接上为公共引脚,需要手动配置一下。
双击CapSense模块,首先要手动添加3个电容触摸按键,如下图。


然后修改电容按键模式为CSX(Mutual-cap), 这个时候你们会看到下面的Pins需要8个,我这里显示6个是我已经修好了3个Tx为公共引脚。
修改公共引脚的方式为进入Advanced界面,打开按键1和按键2的Tx界面,将右侧Selected pins选择按键0的Tx,即与按键0的Tx共用一个引脚。


修改好后,再返回看Basic界面,Pins required就会变为6。

接下来进行引脚分配,如下图,电容按键的Tx公共引脚为P0.2,LCD1602这次选用P2口。

最后就是修改主程序了,我是参考各个例程中的代码进行摘取、拼接、修改完成的。


  1. #include "project.h"
  2. #define LED_ON                                                (0u)
  3. #define LED_OFF                                                (1u)

  4. void LED_Control();
  5. void delay_ms(uint16 t)
  6. {
  7.         uint16 a,b,c;
  8.     for(a=100;a>0;a--)
  9.         for(b=114;b>0;b--)
  10.                    for(c=t;c>0;c--);
  11. }

  12. typedef enum
  13. {
  14.     SENSOR_SCAN = 0x01u,               
  15.     WAIT_FOR_SCAN_COMPLETE = 0x02u,     
  16.     PROCESS_DATA = 0x03u,               
  17. } DEVICE_STATE;
  18. _Bool state=LED_OFF;

  19. int main(void)
  20. {
  21.     DEVICE_STATE currentState = SENSOR_SCAN;  
  22.     CyGlobalIntEnable; /* Enable global interrupts. */
  23.     LED_8_Write(state);
  24.     EZI2C_Start();
  25.     CapSense_Start();

  26.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */

  27.     LCD_1602_Start();   
  28.     LCD_1602_Position(0,0);
  29.     LCD_1602_PrintString("LED8:");
  30.     LCD_1602_Position(1,0);
  31.     LCD_1602_PrintString("Count:");
  32.     uint8 count=0;
  33.     LCD_1602_Position(0,6);
  34.     LCD_1602_PrintString("OFF");
  35.     LCD_1602_Position(1,7);   
  36.     LCD_1602_PrintInt8(count);
  37.     for(;;)
  38.     {
  39.         if(SW1_Read()==0)
  40.         {
  41.             delay_ms(10);
  42.             if(SW1_Read()==0)
  43.             {
  44.                 state=!state;
  45.                 LED_8_Write(state);
  46.                 LCD_1602_Position(0,6);
  47.                 if(state)
  48.                     LCD_1602_PrintString("OFF");
  49.                 else
  50.                     LCD_1602_PrintString("ON ");
  51.                 count++;
  52.                 LCD_1602_Position(1,7);   
  53.                 LCD_1602_PrintInt8(count);         
  54.                 while(SW1_Read()==0){}
  55.             }
  56.         }

  57.         switch(currentState)
  58.         {
  59.             case SENSOR_SCAN:
  60.                     /* Initiate new scan only if the CapSense block is idle */
  61.                 if(CapSense_NOT_BUSY == CapSense_IsBusy())
  62.                 {      
  63.                     /* Scan widget configured by CSDSetupWidget API */
  64.                     CapSense_ScanAllWidgets();

  65.                     /* Set next state to WAIT_FOR_SCAN_COMPLETE  */
  66.                     currentState = WAIT_FOR_SCAN_COMPLETE;
  67.                 }
  68.                 break;

  69.             case WAIT_FOR_SCAN_COMPLETE:
  70.                 /* Put the device to CPU Sleep until CapSense scanning is complete*/
  71.                 if(CapSense_NOT_BUSY != CapSense_IsBusy())
  72.                 {
  73.                     CySysPmSleep();
  74.                 }
  75.                 /* If CapSense scanning is complete, process the CapSense data */
  76.                 else
  77.                 {
  78.                     currentState = PROCESS_DATA;
  79.                 }
  80.                 break;

  81.             case PROCESS_DATA:               
  82.                 /* Process data on all the enabled widgets */
  83.                 CapSense_ProcessAllWidgets();

  84.                 /* Controls LEDs Status based on the result of Widget processing. */
  85.                 LED_Control();

  86.                 /* Set the device state to SENSOR_SCAN */
  87.                 currentState = SENSOR_SCAN;  
  88.                 break;  

  89.             default:
  90.                 break;
  91.         }
  92.     }
  93. }

  94. void LED_Control()
  95. {
  96.     /*Turn ON/OFF LEDs based on the status of the corresponding CapSense buttons*/
  97.     LED_11_Write(CapSense_IsWidgetActive(CapSense_BTN0_WDGT_ID) ? LED_ON : LED_OFF );
  98.     LED_12_Write(CapSense_IsWidgetActive(CapSense_BTN1_WDGT_ID) ? LED_ON : LED_OFF );
  99.     LED_13_Write(CapSense_IsWidgetActive(CapSense_BTN2_WDGT_ID) ? LED_ON : LED_OFF );
  100. }
复制代码


[结果分析]
按键和LED都可以正常工作,LCD1602上的计数值是16进制显示的,下一步想把它修改为10进制显示。
另外,LCD1602有时会在个别区域显示不正确,不知道是屏幕问题还是程序问题,需要进一步探究。
不过,整体的功能已经实现,视频演示效果如下。

[视频效果演示]


[之前的测评链接]
【CY8CKIT-149 PSoC 4100S测评】+开箱展示
【CY8CKIT-149 PSoC 4100S测评】+软件安装与程序下载
【CY8CKIT-149 PSoC 4100S测评】+PWM分析与使用(上)
【CY8CKIT-149 PSoC 4100S测评】+PWM分析与使用(下)
【CY8CKIT-149 PSoC 4100S测评】+UART串口使用
【CY8CKIT-149 PSoC 4100S测评】+定时器/计数器的使用
【CY8CKIT-149 PSoC 4100S测评】+LCD的使用
【CY8CKIT-149 PSoC 4100S测评】+新建空白工程(以Key-LED为例)


此帖出自单片机论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表