由硬件框图可以知道我们要配置LED 和按键
LED
先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题
按键
按键配置,由原理图按键所对引脚要GPIO_Input
生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lcd.c、lcd.h、fonts.h添加到code中,然后去写按键控制灯亮灭的程序,看是否有问题
按键控制led没有问题后写lcd显示代码,显示没问题后,解决lcd与led引脚冲突问题,方法在我的其他文章中
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET ); //为解决引脚冲突初始化lcd时 LCD_Init (); 要将锁存器锁存器来;
LCD_Clear (Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD显示函数
void lcd_show(void)
{
sprintf(text," hello world");
LCD_DisplayStringLine (Line0 ,(uint8_t *)text);
}
eeprom
用到eeprom就要用到IIC通信协议就要去资源包中将IIC_hal.c IIC_hal.h添加进来
然后再main中方初始化IIC
然后写eeprom读和写的函数,用lcd显示测试功能是否好用,没有问题就开始写ADC的功能函数代码。
ADC
由原理图知道ADC测量是由PB15与PB12测量,去配置两引脚为ADCx_INx,去相应ADCx中勾选相对应的INx为single-ended,后编写电压获取函数,其中用到ADC测量量与电压转化公式。
上面把需要用的功能都测试了一次没有问题,就开始按要求写写代码
下面是分别界面显示的代码
void Lock_show(void)
{
sprintf(text," Lock " );
LCD_DisplayStringLine (Line2 ,(uint8_t *)text);
sprintf(text," Pass Word " );
LCD_DisplayStringLine (Line4 ,(uint8_t *)text);
sprintf(text," * * * " );
LCD_DisplayStringLine (Line5 ,(uint8_t *)text);
}
void Set_show(void)
{
sprintf(text," Set " );
LCD_DisplayStringLine (Line2 ,(uint8_t *)text);
sprintf(text," Change " );
LCD_DisplayStringLine (Line4 ,(uint8_t *)text);
sprintf(text," * * * " );
LCD_DisplayStringLine (Line5 ,(uint8_t *)text);
}
ADC电压值转换成数值密码,将i输出到屏幕就行
void Lock_show(void)
{
if(get_vo1(&hadc2)<1.5)
{
i=0;
}
else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5)
{
i=1;
}
else
{
i=2;
}
*按键与电压共同输入密码
限定电压的大小可以控制输入的数字为0 1 2,密码一共有三位,这就需要输入第一位后记住并且切换到下一位,切换就需要用到按键,按键按一下且为下一位,再按一下又切换到下一位,再按又回到第一位输入。写代码时参数跨文件使用的就要在.h中外部申明,外部声明的数组在.c中初始化就不可以在.h又初始化
案件代码
uint8_t count;
uint8_t Password[3]={0,1,2};
uint8_t word[3];用于记住输入的密码//这三个都需要外部声明void key_scan(void)
{B1_state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);if(B1_state==0&&B1_last_state==1) //如果按下就用word[]记住当前数值{if(get_vo1(&hadc2)<1.5){word[count]=0;}else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5){word[count]=1;}else{word[count]=2;}count++;count %=3;}B1_last_state=B1_state;
}
输入密码显示
void Lock_show(void)
{sprintf(text," Lock " );LCD_DisplayStringLine (Line2 ,(uint8_t *)text);sprintf(text," Pass Word " );LCD_DisplayStringLine (Line4 ,(uint8_t *)text);if(get_vo1(&hadc2)<1.5){if(count==0){sprintf(text," %d * * ",0 );}else if(count==1){sprintf(text," %d %d * ",word[0],0);}else if(count==2){sprintf(text," %d %d %d ",word[0],word[1],0 );}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}else if(1.5<get_vo1(&hadc2)&&get_vo1(&hadc2)<2.5){if(count==0){sprintf(text," %d * * ",1 );}else if(count==1){sprintf(text," %d %d * ",word[0],1);}else if(count==2){sprintf(text," %d %d %d ",word[0],word[1],1 );}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}else{if(count==0){sprintf(text," %d * * ",2 );}else if(count==1){sprintf(text," %d %d * ",word[0],2);}else if(count==2){sprintf(text," %d %d %d ",word[0],word[1],2);}LCD_DisplayStringLine (Line5 ,(uint8_t *)text);}
}
用一个标志位来修改页面,当密码正确时标志位改变
uint8_t show_flag;// 标志位,0位输出页面,1位修改页面
if(word[0]==Password[0]&&word[1]==Password[1]&&word[2]==Password[2])
{
show_flag=1;
}