第十集 虚拟LED数码管 课后小练
密码锁
1. 没有输入时,显示“- - - - - - - -”
2. 有输入时,按下一个按键,开始按顺序写入
例如,第一个按下1,显示“1 - - - - - - - ”
例如,第二个按下3,显示“1 3 - - - - - - ”
3. 当按下的密码为“1 2 3 4 5 6 7 8”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”
题目要求比较简洁,考虑到如果前面几位按错了,不想8位全部按完就重新开始按,这种情况比较常见。
所以我增加了这部分的功能。下面还是先上视频。
main程序内先定义3个全局变量:
extern u32 REC_NUM;
extern u8 j , open ;
在config.h内调用头文件: #include "string.h" //memcmp()、memcpy()两函数需要。
- while(1)
- {
-
- if (bUsbOutReady) //如果接收到了数据
- {
- if( UsbOutBuffer[5]==106) //加入恢复起始状态的按键“*”,键值为106
- {
- open = 0;
- j = 0;
- }
- else
- {
- REC_NUM = UsbOutBuffer[5]-48; //把接收到的数字减48为需要的数值
- j++;
- }
- usb_OUT_done(); //
- }
- Task_Pro_Handler_Callback(); //执行功能函数
- }
复制代码
- #include "io.h"
-
- u8 State1 = 0; //LED1初始状态
- u8 State2 = 0; //LED2初始状态
- u8 State3 = 0; //LED3初始状态
-
- u16 Key_Vol[3] ; //按键按下持续时间
- BYTE cod0[] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; //数码管初始值显示“--------”
- BYTE cod[] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}; //cod[]保存输入的数字
- BYTE cod1[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F,0x6F,0x40}; // 0-9 段码数组
- BYTE cod2[] = {0x06, 0x5B, 0x4F, 0x66, 0x6D ,0x7D, 0x07, 0x7F}; // 密码数字
- BYTE cod3[] = {0x40, 0x40, 0x5c, 0x73, 0x79, 0x54, 0x40, 0x40}; //“--OPEN--”
- u32 REC_NUM = 10; //起始值数码管显示“-”
- u8 j =0;
- u8 open =0;
- void TASK_1(void)
- {
- if((open ==0)&&(j==0)) //起始状态
- memcpy(cod,cod0,8); //将初始值cod0复制给cod,回到起始状态
- if(open ==0) //open=0 闭锁状态,open=1 开锁状态
- {
- cod[j-1] = cod1[REC_NUM]; //把收到的数字逐一存入cod[]中
- if(j==8) //如果按了8个数字
- {
- if(!memcmp(cod,cod2,8)) //比较cod与cod2两数组是否相等,若相等显示“--OPEN--”,不等显示初始值“--------”
- {
- open = 1;
- }
- else
- {
- memcpy(cod,cod0,8); //将初始值cod0复制给cod,回到起始状态
- SEG7_ShowCode(cod); //显示初始值“--------”
- j = 0;
- }
- }
- else
- SEG7_ShowCode(cod); //显示输入的数字
- }
- else
- {
- SEG7_ShowCode(cod3);//显示“--OPEN--”
- memcpy(cod ,cod0,8); //将数组cod0的值复制给cod,等待下一次解锁
- j = 0;
- }
- }
复制代码
程序在冲哥第十课程序的基础上,稍作以上修改,其余不用动。
10.虚拟LED和SHU码管.zip
(162.64 KB, 下载次数: 47)
|