实现步骤与计划:
ACM32F070是一款功能强大的MCU,它提供了丰富的外设接口和强大的性能,非常适合用于各种嵌入式应用的开发。
关于点亮LCD屏和触控按键功能操作,以及驱动蜂鸣器测评,下面是一些建议和指导:
硬件连接:首先,确保LCD屏与开发板之间的连接正确无误。通常,你需要将LCD屏的电源、地线、数据线等接口与开发板上的对应接口相连。
驱动配置:查阅ACM32F070的文档,了解如何配置LCD控制器或相关的GPIO接口。根据LCD屏的规格和要求,设置正确的数据格式、时序等参数。
编程实现:编写代码来初始化LCD控制器,并发送图像数据到LCD屏上显示。这通常涉及到对LCD控制器的寄存器进行操作,以及准备和发送图像帧数据。
触控按键功能操作:
硬件连接:同样,确保触控按键模块与开发板之间的连接正确。这通常包括电源、地线以及用于传输触控数据的接口。
驱动配置:配置相关的GPIO接口或触控控制器,以接收和处理触控数据。
编程实现:编写代码来读取触控数据,并根据需要执行相应的操作。例如,你可以编写一个函数来检测是否有按键被按下,并根据按下的按键执行不同的操作。
驱动蜂鸣器测评:
硬件连接:将蜂鸣器模块与开发板上的PWM或GPIO接口相连。确保连接正确,避免短路或损坏设备。
驱动配置:根据蜂鸣器的类型(有源或无源)和规格,配置相应的PWM或GPIO接口。对于有源蜂鸣器,你可能只需要控制其电源线的通断;对于无源蜂鸣器,你可能需要使用PWM信号来调节其发声频率和音量。
编程实现:编写代码来驱动蜂鸣器发声。你可以根据需要调整PWM信号的频率和占空比,以产生不同的音效和节奏。
原理图:
蜂鸣器
触摸按键
LCD:
代码:
COM0 COM1 COM2 COM3分别是接PA9 PA10 PA11 PA12,其它的就请见上图,和上上图。 下面我上代码: 蜂鸣器 #define BUZZER_GPIO_PORT GPIOD #define BUZZER_GPIO_PIN GPIO_PIN_1 定义GPIOD口的Pin的1脚。 void BUZZER_Init(void) { GPIO_InitTypeDef GPIOx_Handle; GPIOx_Handle.Pin = BUZZER_GPIO_PIN; GPIOx_Handle.Mode = GPIO_MODE_OUTPUT_PP; GPIOx_Handle.Pull = GPIO_NOPULL; GPIOx_Handle.Alternate = GPIO_FUNCTION_0; HAL_GPIO_Init(BUZZER_GPIO_PORT, &GPIOx_Handle); HAL_GPIO_WritePin(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN, GPIO_PIN_CLEAR); } 蜂鸣器工作函数: GPIOCD->SET = (GPIO_PIN_1<<16); System_Delay_MS(200); GPIOCD->CLR = (GPIO_PIN_1<<16); 这里延时200MS,蜂鸣器的声音更加响亮。 触摸按键: uint8_t TouchKey_Init(void) { uint8_t ret = 0; TKEY_Init(); TKEY_Calibrate_ParaInit(); ret = TKEY_Quick_Calibrate(); //校准无触摸时的读取数据寄存器值 TKEY_Timer_ScanInit(); TKEY_Timer_Scan_Start(); TKEY_DEBUG("sgu16_RawDataRangRatio = %d\n", sgu16_RawDataRangRatio); TKEY_DEBUG("sgu8_TKEYScanTime = %d\n", sgu8_TKEYScanTime); return ret; } 按键的滤波: #define TKEY_DEBIN 2 #define TKEY_DEBOUT 2 扫描按键获取值: uint8_t TK_TimerSacn_GetKeyVal(void) { uint8_t ucKey = 0xFF; TKEY_Timer_Scan_Result(&ucKey); #ifdef TKEY_WAVEFORM_OUTPUT TK_DebugDataOut(); #endif return ucKey; } void TKEY_Timer_Scan_Result(uint8_t *pucKey) { *pucKey = 0xFF; #ifdef TKEY_FIFO_ENABLE if(FIFO_Query(&TKEY_Fifo)) { FIFO_Out(&TKEY_Fifo, pucKey); } #endif } 按键如果看不明白,可以看原DEMO,我这里不多介绍。 下面是屏的相关代码,我把我用的全赋上,屏是用的YR1618。 先上初始化: void LCD_Init_YR1618A(void) { memset(&lcdhandle_YR1618A,0,sizeof(lcdhandle_YR1618A));//初始化清零Handle lcdhandle_YR1618A.Instance=LCD; lcdhandle_YR1618A.Init.Bias=LCD_BIAS_1_3; lcdhandle_YR1618A.Init.Duty=LCD_DUTY_1_4; lcdhandle_YR1618A.Init.DisplayMode=LCD_DisplayMode_1; lcdhandle_YR1618A.Init.LCDFrequency=LCD_LCDFrequency_512HZ; lcdhandle_YR1618A.Init.Driving_Waveform=LCD_Driving_Waveform_B; lcdhandle_YR1618A.Init.BiasSrc=LCD_BiasSrc_InRes_Seg31_35_Normal;//内部电阻模式 // lcdhandle_YR1618A.Init.BlinkEN=LCD_BlinkEN_Enable;//闪频使能 lcdhandle_YR1618A.Init.BlinkFrequency =0x3;//帧间隔时间,影响帧中断时间和LCD DMA请求时间 以及闪烁时间 HAL_LCD_Init(&lcdhandle_YR1618A); LCD_InResInitTypeDef Resstrcut; memset(&Resstrcut,0,sizeof(Resstrcut));//初始化清零Handle Resstrcut.Contrast=LCD_Contrast_903VDD; Resstrcut.BiasRes=LCD_BiasRes_240k;//LCD_BiasRes_240k LCD_BiasRes_4M Resstrcut.FastCharge=LCD_FastCharge_Enable;//快速充电配置 Resstrcut.PONTime=0x3f; Resstrcut.DriveMod=LCD_DriveMod_FC;//LCD_DriveMod_FC HAL_LCD_InResConfig(&lcdhandle_YR1618A,&Resstrcut); LCD_GPIO_Config_YR1618A(); LCD_SegCom_Config_YR1618A(); } 再上一个IO的配置:这里我介绍一下,担心会有看不明白的。 void LCD_GPIO_Config_YR1618A(void) { 清GPIO的YR1618初始化 memset(&GPIO_Init_YR1618A,0,sizeof(GPIO_Init_YR1618A)); 下面的是配置COM0 COM1 COM2 COM3的GPIO,这个端口是PA口,分别是PA9 PA10 PA11 PA12 还有SEG14 SEG0和SEG13的PA4 PA8 PA0; /* COM0-COM3:PA9-PA12 SEG0:PA8 */ GPIO_Init_YR1618A.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_8|GPIO_PIN_4|GPIO_PIN_0; GPIO_Init_YR1618A.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_Init_YR1618A);// 这里是配置SEG1-4的GPIO口对应的脚位是PC6到PC9 /* SEG1-4:PC9-6 */ GPIO_Init_YR1618A.Pin = GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0; GPIO_Init_YR1618A.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOC, &GPIO_Init_YR1618A); /* SEG5-7:PB15-13 */ GPIO_Init_YR1618A.Pin = GPIO_PIN_0|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_15|GPIO_PIN_14|GPIO_PIN_13; GPIO_Init_YR1618A.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOB, &GPIO_Init_YR1618A); /* SEG5-7:PD5, =1*/ GPIO_Init_YR1618A.Pin = GPIO_PIN_5; GPIO_Init_YR1618A.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOD, &GPIO_Init_YR1618A); } void LCD_SegCom_Config_YR1618A(void) { LCD_SegComInitStructure2.SEG0_31=0xF0371C00;//开启SEG0-SEG70xF0371C00 LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEG32_39_COM0_8=0xFFFFFFFF;//初始化LCD_POEN1寄存器 关闭全部输出 LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.COM0_3=0;//开启COM0-COM3 LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.SEG32_35=0xf;//关闭SEG32_35和COM4-7 LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.SEG36_COM7=1; LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.SEG37_COM6=1; LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.SEG38_COM5=1; LCD_SegComInitStructure2.Stc_SEG32_39_COM0_8.SEGCOM_bit.SEG39_COM4=1; HAL_LCD_SegComConfig(&lcdhandle_YR1618A,&LCD_SegComInitStructure2); } 再上显示数字:这里我上传两断DEMO中比较经典的,个人写的非常的乱,只上传图片好了。 void LCD_DisplayNum_YR1618A(uint32_t Num) { uint32_t ram_buff[4]; ram_buff[0]=0; ram_buff[1]=0; ram_buff[2]=0; ram_buff[3]=0; // ram_buff[4]=0; if(Num>9999) Num=9999;//4位数,最大显示9999 Get_RAM_NUM_DATA(ram_buff,Num,Num); HAL_LCD_Write(&lcdhandle_YR1618A,0,ram_buff[0]); HAL_LCD_Write(&lcdhandle_YR1618A,1,ram_buff[1]); HAL_LCD_Write(&lcdhandle_YR1618A,2,ram_buff[2]); HAL_LCD_Write(&lcdhandle_YR1618A,3,ram_buff[3]); // HAL_LCD_Write(&lcdhandle_YR1618A,4,ram_buff[4]); } 8位动态显示0-9 void LCD_DisplayNum_YR1618A_INIT() { uint16_t i=0; uint32_t ram_buff[5]; uint16_t numi=6;//5 for(numi=0;numi<8;numi++) { System_Delay_MS(100); for(i=0;i<10;i++) { ram_buff[0]=0; ram_buff[1]=0; ram_buff[2]=0; ram_buff[3]=0; if(numi==4) { ram_buff[0]=NUM5_RAM0_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[1]=NUM5_RAM1_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[2]=NUM5_RAM2_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[3]=NUM5_RAM3_DIS<<NUM_RAM_OFFSET[numi]; } else if(numi==6) { ram_buff[0]=NUM7_RAM0_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[1]=NUM7_RAM1_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[2]=NUM7_RAM2_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[3]=NUM7_RAM3_DIS<<NUM_RAM_OFFSET[numi]; } else { ram_buff[0]=NUM123468_RAM0_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[1]=NUM123468_RAM1_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[2]=NUM123468_RAM2_DIS<<NUM_RAM_OFFSET[numi]; ram_buff[3]=NUM123468_RAM3_DIS<<NUM_RAM_OFFSET[numi]; } HAL_LCD_Write(&lcdhandle_YR1618A,0,ram_buff[0]); HAL_LCD_Write(&lcdhandle_YR1618A,1,ram_buff[1]); HAL_LCD_Write(&lcdhandle_YR1618A,2,ram_buff[2]); HAL_LCD_Write(&lcdhandle_YR1618A,3,ram_buff[3]); System_Delay_MS(100);//初始化时每个项显示时间,方便检测每一段显示状态 } } }
实现效果:
点亮LCD屏:
实现0-9显示: