|
【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口。
最后就是修改主程序了,我是参考各个例程中的代码进行摘取、拼接、修改完成的。
- #include "project.h"
- #define LED_ON (0u)
- #define LED_OFF (1u)
- void LED_Control();
- void delay_ms(uint16 t)
- {
- uint16 a,b,c;
- for(a=100;a>0;a--)
- for(b=114;b>0;b--)
- for(c=t;c>0;c--);
- }
- typedef enum
- {
- SENSOR_SCAN = 0x01u,
- WAIT_FOR_SCAN_COMPLETE = 0x02u,
- PROCESS_DATA = 0x03u,
- } DEVICE_STATE;
- _Bool state=LED_OFF;
- int main(void)
- {
- DEVICE_STATE currentState = SENSOR_SCAN;
- CyGlobalIntEnable; /* Enable global interrupts. */
- LED_8_Write(state);
- EZI2C_Start();
- CapSense_Start();
- /* Place your initialization/startup code here (e.g. MyInst_Start()) */
- LCD_1602_Start();
- LCD_1602_Position(0,0);
- LCD_1602_PrintString("LED8:");
- LCD_1602_Position(1,0);
- LCD_1602_PrintString("Count:");
- uint8 count=0;
- LCD_1602_Position(0,6);
- LCD_1602_PrintString("OFF");
- LCD_1602_Position(1,7);
- LCD_1602_PrintInt8(count);
- for(;;)
- {
- if(SW1_Read()==0)
- {
- delay_ms(10);
- if(SW1_Read()==0)
- {
- state=!state;
- LED_8_Write(state);
- LCD_1602_Position(0,6);
- if(state)
- LCD_1602_PrintString("OFF");
- else
- LCD_1602_PrintString("ON ");
- count++;
- LCD_1602_Position(1,7);
- LCD_1602_PrintInt8(count);
- while(SW1_Read()==0){}
- }
- }
- switch(currentState)
- {
- case SENSOR_SCAN:
- /* Initiate new scan only if the CapSense block is idle */
- if(CapSense_NOT_BUSY == CapSense_IsBusy())
- {
- /* Scan widget configured by CSDSetupWidget API */
- CapSense_ScanAllWidgets();
- /* Set next state to WAIT_FOR_SCAN_COMPLETE */
- currentState = WAIT_FOR_SCAN_COMPLETE;
- }
- break;
- case WAIT_FOR_SCAN_COMPLETE:
- /* Put the device to CPU Sleep until CapSense scanning is complete*/
- if(CapSense_NOT_BUSY != CapSense_IsBusy())
- {
- CySysPmSleep();
- }
- /* If CapSense scanning is complete, process the CapSense data */
- else
- {
- currentState = PROCESS_DATA;
- }
- break;
- case PROCESS_DATA:
- /* Process data on all the enabled widgets */
- CapSense_ProcessAllWidgets();
- /* Controls LEDs Status based on the result of Widget processing. */
- LED_Control();
- /* Set the device state to SENSOR_SCAN */
- currentState = SENSOR_SCAN;
- break;
- default:
- break;
- }
- }
- }
- void LED_Control()
- {
- /*Turn ON/OFF LEDs based on the status of the corresponding CapSense buttons*/
- LED_11_Write(CapSense_IsWidgetActive(CapSense_BTN0_WDGT_ID) ? LED_ON : LED_OFF );
- LED_12_Write(CapSense_IsWidgetActive(CapSense_BTN1_WDGT_ID) ? LED_ON : LED_OFF );
- LED_13_Write(CapSense_IsWidgetActive(CapSense_BTN2_WDGT_ID) ? LED_ON : LED_OFF );
- }
复制代码
[结果分析]
按键和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为例)
|
|