第一次做题用到eeprom,把写入和读取的代码背一下,用的时候还是蛮好用的。
题目
CubeMX配置
这里就给大家看一下引脚配置了,具体的配置其他作品都有,大家可以去看。
引脚配置
代码实现
回调函数
#include "interrupt.h"
#include "usart.h"
extern int pwm_flag,X_rep,Y_rep;
int pwm_time,led_time;
struct keys key[4]={0,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_flag)
{
case 0:
{
if(key[i].key_sta==0)
key[i].judge_flag=1;
}
break;
case 1:
{
if(key[i].key_sta==0)
{
key[i].judge_flag=2;
key[i].single_flag=1;
}
else
key[i].judge_flag=0;
}
break;
case 2:
{
if(key[i].key_sta==1)
key[i].judge_flag=0;
}
break;
}
}
}
if(htim->Instance==TIM6)
{
if(pwm_flag==1)
pwm_time++;
if(pwm_time>50)
{
pwm_flag=0;
pwm_time=0;
}
}
if(htim->Instance==TIM8)
{
if(X_rep==0&&Y_rep==0)
led_time++;
else
led_time=0;
}
}
//输入捕获测PWM
//uint16_t ccr1,ccr2;
//uint16_t duty, frq;
//void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
//{
// if(htim->Instance==TIM3)
// {
// if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
// {
// ccr1 = TIM3->CCR2;
// ccr2 = TIM3->CCR1;
// frq = 1000000/(ccr1+1);
// duty = 100*(ccr2+1)/(ccr1+1);
// HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
// HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
// }
// }
//}
unsigned char rxdata[20];
uint8_t rxda;
int rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rxdata[rx_pointer++]=rxda;
HAL_UART_Receive_IT(&huart1,&rxda,1);
}
头文件和定义
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "i2c_hal.h"
#include "stdio.h"
#include "string.h"
#include "interrupt.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern struct keys key[4];
extern unsigned char rxdata[20];
extern uint8_t rxda;
extern int rx_pointer;
extern int pwm_time,led_time;
//extern uint16_t duty,frq;
int view=0;
char text[20];
int X_num,Y_num;
int X_rep=10,Y_rep=10;
double X_Price=1.0,Y_Price=1.0;
int pwm_flag;
unsigned char led=0x00;
LED和EEPROM
void led_disp(unsigned char dsled)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,dsled<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void eepromwrite(u8 add,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
HAL_Delay(10);
}
u8 eepromread(u8 add)
{
u8 data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return data;
}
LCD
void lcd_pro(void)
{
if(view==0)
{
LCD_DisplayStringLine(Line1,(u8 *)" SHOP ");
sprintf(text," X:%d ",X_num);
LCD_DisplayStringLine(Line3,(u8 *)text);
sprintf(text," Y:%d ",Y_num);
LCD_DisplayStringLine(Line4,(u8 *)text);
}
if(view==1)
{
LCD_DisplayStringLine(Line1,(u8 *)" PRICE ");
sprintf(text," X:%.1f ",X_Price);
LCD_DisplayStringLine(Line3,(u8 *)text);
sprintf(text," Y:%.1f ",Y_Price);
LCD_DisplayStringLine(Line4,(u8 *)text);
}
if(view==2)
{
LCD_DisplayStringLine(Line1,(u8 *)" REP ");
sprintf(text," X:%d ",X_rep);
LCD_DisplayStringLine(Line3,(u8 *)text);
sprintf(text," Y:%d ",Y_rep);
LCD_DisplayStringLine(Line4,(u8 *)text);
}
}
void key_pro(void)
{
if(key[0].single_flag==1)
{
view++;
if(view==3)
view=0;
LCD_Clear(Black);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
switch(view)
{
case 0:
X_num++;
if(X_num>X_rep)
X_num = 0;
break;
case 1:
X_Price+=0.1;
if(X_Price>=2.1)
X_Price=1.0;
break;
case 2:
X_rep++;
break;
}
key[1].single_flag=0;
}
if(key[2].single_flag==1)
{
switch(view)
{
case 0:
Y_num++;
if(Y_num>Y_rep)
Y_num = 0;
break;
case 1:
Y_Price+=0.1;
if(Y_Price>=2.1)
Y_Price=1.0;
break;
case 2:
Y_rep++;
break;
}
key[2].single_flag=0;
}
if(view==0)
{
if(key[3].single_flag==1)
{
X_rep -= X_num;
Y_rep -= Y_num;
pwm_time=0;
pwm_flag=1;
sprintf(text,"X:%d,Y:%d,Z:%.1f;",X_num,Y_num,X_num*X_Price+Y_num*Y_Price);
HAL_UART_Transmit(&huart1,(u8 *)text,sizeof(text),50);
X_num=0;
Y_num=0;
key[3].single_flag=0;
}
}
eepromwrite(0x00,X_rep);
eepromwrite(0x01,Y_rep);
eepromwrite(0x02,X_Price*10);
eepromwrite(0x03,Y_Price*10);
}
EEPROM、USART、PWM、LED
void e2pread(void)
{
if(eepromread(0x08)!=0xaa)
{
eepromwrite(0x08,0xaa);
eepromwrite(0x00,10);
eepromwrite(0x01,10);
eepromwrite(0x02,10);
eepromwrite(0x03,10);
}
X_rep = eepromread(0x00);
Y_rep = eepromread(0x01);
X_Price = (double)eepromread(0x02)/10;
Y_Price = (double)eepromread(0x03)/10;
}
void rx_pro(void)
{
if(rx_pointer>0)
{
if(rx_pointer==1)
{
if(rxda=='?')
{
sprintf(text,"X:%.1f,Y:%.1f",X_Price,Y_Price);
HAL_UART_Transmit(&huart1,(u8 *)text,sizeof(text),50);
}
}
rx_pointer=0;
memset(rxdata,0,10);
}
}
void pwm_pro(void)
{
if(pwm_time>0)
TIM2->CCR2 = 0.3*(TIM2->ARR+1);
if(pwm_time==0)
TIM2->CCR2 = 0.05*(TIM2->ARR+1);
}
void led_pro(void)
{
if(pwm_time>0)
led |= 0x01;
else
led &= ~0x01;
if(led_time%2==1)
led |= 0x02;
if(led_time%2==0)
led &= ~0x02;
led_disp(led);
}
初始化
LCD_Init();
I2CInit();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
led_disp(led);
e2pread();
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_Base_Start_IT(&htim8);
HAL_UART_Receive_IT(&huart1,&rxda,1);
大家自己看看理解一下,看不懂或者想要源码的发评论区就行