@ruanxingzhi
2019-05-19T03:07:17.000000Z
字数 1322
阅读 1327
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; // AM[11]=0x67; // PM[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一致。
以上数据汇总后,由右端数码管输出。