@ruanxingzhi
2019-05-19T11:07:17.000000Z
字数 1322
阅读 1023
8位密码锁,设密码为Pwd
。提供的功能是:
1. 当输入K
等于Pwd
时,灯组LD2
全亮,表示开锁
2. 当输入K
不等于Pwd
时,灯组LD1
全亮,表示锁没有打开
3. 计时:从输入第一个按钮开始,倒计时5s,若未打开则复位,并报警
4. 修改密码:按Reset可修改密码
初始状况下,密码为1234
.
按Reset
键之后,进入重设密码状态:不停地读入密文,直到Reset键再次按下。此时,取最后输入的4位数作为密码。
屏幕上总是显示最后输入的4位数。
此阶段的任意时刻,按【重置】键可以恢复初始状态(没有输入任何一位密码的状态)。
连续输入4个数,输入完4个数之后进入开锁判断阶段。
【开锁判断】
这个阶段可被【计时】打断。
K
等于Pwd
时,灯组LD2
全亮,表示开锁K
不等于Pwd
时,灯组LD1
全亮,表示锁没有打开输入任意一位密码之后,开始计时。
屏幕上数秒。数完之后,右边数码管显示EEEE
。
reg [3:0]Pwd[3:0] // 密码
reg [3:0]K[3:0] // 输入,初始值为0000
// K恒等于输入的后四位。不足的以0补齐。
// K被重置为0当且仅当:Reset键被按下;复位键被按下
reg Proc // 当前程序。[0]:尝试开锁 1:设置密码
reg isBegun
// Proc=1时,恒为[0]
// Proc=0时,[0]:未开始输入 1:已经开始输入
// isBegun被重置为0当且仅当:Reset键被按下;复位键被按下
reg isOver
// Proc=1时,恒为[0]
// Proc=0时,[0]:时间还没用完 1:时间已经用完
// isOver被重置为0当且仅当:Reset键被按下;复位键被按下
reg isEnd
// 默认为[0]
// 输入结束后,置为1
// isEnd被重置为0当且仅当:Reset键被按下;复位键被按下
reg [1:0]isOpen // [0]:未完成输入 1:成功 2:失败
字符表:
M[0]=0x7E;
M[1]=0x30;
M[2]=0x6D;
M[3]=0x79;
M[4]=0x33;
M[5]=0x5B;
M[6]=0x5F;
M[7]=0x70;
M[8]=0x7F;
M[9]=0x7B;
M[10]=0x77; // A
M[11]=0x67; // P
M[12]=0x4F; // E
这是为数码管实现的计时器。带一位小数:A.B
时钟P17
为1e6Mhz
,故计时开始(isBegun
上升沿)时,取t=1000000
,接下来每个P17
时钟沿下降1
。
恒有:A=t/1000000,B=(t%100000)/100000
当t
下降到0时,AB
置为E
.
当四位密码输入完成时,锁定t
。
以下记数码管为[7:0]D
。
D[7]
显示当前状态。
- D[7]=A
:正常工作阶段。此时可以尝试开锁。
- D[7]=S
:设置密码阶段。
因此D[7]
由Proc
控制。
D[6:5]
显示倒计时。
- D[5:6]
为空:isBegun=0
,也就是无需计时。
- D[5:6]
为数码:计时方式为s.s
,带一位小数。由计时器提供。
- D[5:6]
为E:
D[4]
空。
以上数据汇总后,由左端数码管输出。
D[3:0]
恒与K
一致。
以上数据汇总后,由右端数码管输出。