代码我需要的

本文描述了一个嵌入式系统中的关键组件,如定时器中断处理GPIO状态,LED和LCD显示控制,PWM输出与捕捉,ADC采样,I2C通信以及串口数据传输,展示了如何利用这些技术进行设备状态监控和数据交换。
摘要由CSDN通过智能技术生成
struct keys
{
	unsigned char judge_sta;
	bool key_sta;
	bool single_flag;
	bool long_flag;
	unsigned int key_count;
};




struct keys key[4] = {0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim -> Instance == TIM4)
	{
		key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
		key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
		key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
		key[3].key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);


		for(int i =0;i<4;i++)
		{
			switch(key[i].judge_sta)
			{
				case 0:
				{
					if(key[i].key_sta == 0)
					{

						key[i].judge_sta =1;
						key[i].key_count = 0;
					}
				}
				break;
				case 1:
				{
					if(key[i].key_sta == 0)
					{
						key[i].judge_sta = 2;
					}
					else
					{
						key[i].judge_sta = 0;
					}
				}
				break;
				case 2:
				{
					if(key[i].key_sta == 1)
					{ 
						key[i].judge_sta = 0;
						if(key[i].key_count < 70)
						{
							key[i].single_flag = 1;

						}
					}
					else
					{
						key[i].key_count++;
						if(key[i].key_count == 200)
						{
							key[i].long_flag = 1;
						}							
					}
					
				}
				break;				
			}
		}
	}

}

HAL_TIM_Base_Start_IT(&htim3);

//LED

void led_disp(unsigned char led_sta)
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, led_sta<<8, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
		
}
unsigned led_num;

void led_proc(void)
{
	if(view == 0)
	{
		 led_num |= 0x01;		
	}
	else
	{
		 led_num &= ~0x01;
	}
	led_disp(led_num);
}

//LCD

char temp[30];
sprintf(temp, "hello");
LCD_DisplayStringLine(Line0, (uint8_t*)temp);

//PWM输出

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);

void pwm_proc(void)
{
	__HAL_TIM_SetAutoreload(&htim2, 249);
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2, pwm_duty );
}

//PWM输入捕获

HAL_TIM_IC_Start_IT(&htim17, TIM_CHANNEL_1);


unsigned int ccr1_val;
unsigned int freq;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim ->Instance == TIM17)
	{
		ccr1_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
		__HAL_TIM_SetCounter(htim, 0);
		freq = (80000000/80)/ccr1_val;
		HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);		
		
	}
}

//ADC

uint16_t dac_value;
float value_r37;

void adc_proc(void)
{
	HAL_ADC_Start(&hadc2);
	dac_value = HAL_ADC_GetValue(&hadc2);
	value_r37 = dac_value*3.3/4096;
}

//I2C

unsigned char eeprom_read(unsigned char addr)
{
	unsigned char dat;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CStop();
	
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	dat = I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	return dat;
	
}


void eeprom_write(unsigned char addr, unsigned char dat)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

//串口发 记得开usb  lib

int fputc(int ch, FILE*f)
{
	HAL_UART_Transmit(&huart1,(unsigned char*)&ch, 1, 50 );
	return ch;
}

串口接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_IT(&huart1, uart_buf, 1);
	if(uart_buf[0] == '0')
	{
		printf("world");
	}

}

//串口接收合法性判断

bool rx_flag = 0;
void uart_proc(void)
{
	if(uwTick - uartTick < 50)return;	
	uartTick = uwTick;
	if(rx_cnt>0 && rx_flag == 0)
	{
		printf("no");
	}
	rx_flag = 0;	
	rx_cnt = 0;
	memset(rx_buf, '\0', sizeof(rx_buf));
	
}
	
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_IT(&huart1, uart_buf, 1);
	uartTick = uwTick;
	rx_buf[rx_cnt++] = uart_buf[0];
	if(rx_cnt == 7)
	{
		rx_flag = 1;
		sprintf(temp, "   OK" );
		LCD_DisplayStringLine(Line3, (uint8_t*)temp);
		rx_cnt = 0;
		printf("hello");
	}
		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值