本帖最后由 jinglixixi 于 2020-10-2 13:41 编辑
在HC32F460的开发板上,提供了一个I2C接口的AT24C02存储芯片,通过它可进行关键参数的读写。 由于其存储容量相对较小,故不适宜做字库或图库来使用。 AT24C02的接口原理图如图1所示,其占用的MCU引脚如下: SCL---PC4 SDA--- PC4
图1 AT24C02接口
在结合OLED 屏及阵列按键的情况下,我们可以将其设计为一个秘密锁。 OLED 屏的接口原理图如图2所示,其占用的MCU引脚如下: SCL---PD0 SDA--- PD1
图2 OLED 屏接口
阵列按键的接口原理图如图3所示,其占用的MCU引脚如下: KEYOUT0---PD12 KEYOUT1---PD13 KEYOUT2---PD14 KEYIN0---PA4 KEYIN1---PA5 KEYIN2---PA6
图3 阵列按键接口
实现秘密门锁的主要程序如下: - OLED_ShowString(0,0,"AT24C02 OK !",16);
- OLED_ShowString(88,2,"CLOSE",16);
- i=0;
- n=0;
- m=0;
- OLED_ShowString(0,2,"KEY=",16);
- while(1)
- {
- if(n==0)
- {
- PORT_ResetBits(PortD, Pin12);
- PORT_SetBits(PortD, Pin14);
- PORT_SetBits(PortD, Pin13);
- m=0;
- }
- keycan();
- if(n==0)
- {
- PORT_SetBits(PortD, Pin12);
- PORT_ResetBits(PortD, Pin13);
- PORT_SetBits(PortD, Pin14);
- m=3;
- }
- keycan();
- if(n==0)
- {
- PORT_SetBits(PortD, Pin12);
- PORT_SetBits(PortD, Pin13);
- PORT_ResetBits(PortD, Pin14);
- m=6;
- }
- keycan();
- if(n>0)
- {
- OLED_ShowNum(40+8*i,2,n+m,1,16);
- key[i]=n+m;
- i++;
- n=0;
- }
- if(i==5)
- {
- for(i=0ul; i<5; i++)
- {
- if(key[i] != u8RxBuf[i]) // 13528-741
- {
- OLED_ShowString(0,2,"KEY= ",16);
- i=0;
- n=0;
- }
- else
- {
- OLED_ShowString(88,2,"OPEN ",16);
- while(1);
- }
- }
- }
- Ddl_Delay1ms(200ul);
- }
复制代码
编译下载程序后,相关的运行效果如图4~ 图6 所示。图4 初始界面
图5 提示界面
图6 解锁界面
感兴趣的话还可以在此基础上添加密码的修改功能,其处理方式为按功能键激活密码修改功能,然后先输入原密码并与AT24C02中的钥匙比较,若正确再输入新密码并存入AT24C02中作为钥匙保存。由于密码的存放位置不变,故程序无需进行变更。若是密码存放在程序中,则要想修改密码,就只能修改程序并重新下载了!
|