【51单片机8位密码锁】2023-2-22

缘由https://ask.csdn.net/questions/7889502/54080235

1.用矩阵按键来输入0~9的数字来输入密码,在数码管中显示。

2.输入密码后用独立按键K1确认密码输入。

3.如果密码正确,LED灯亮任意一盏,不与38译码器冲突。

4.如果密码错误,鸣叫三秒后进行密码重新输入。

5.如果错误三次数码管显示ERROR

cpp 复制代码
`#include "reg52.h"
unsigned char code ShuMaGuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴0~15
unsigned char code ShaoMiaoZhi[]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
sbit L1=P2^2;
sbit L2=P2^3;
sbit L3=P2^4;
sbit k=P3^0;
sbit led=P2^0;
sbit beep=P2^5;
bit er=0;
unsigned long m=0;//数据2^32=4294967296
void ShuMaXianShi(unsigned char s,unsigned char w)
{
    P0=L1=L2=L3=0;
    switch(w)
    {
        case 2:{L1=0;L2=L3=1;}break;//011
        case 3:{L2=0;L1=L3=1;}break;//101
        case 4:{L1=L2=0;L3=1;}break;//001
        case 5:{L1=L2=1;L3=0;}break;//110
        case 6:{L1=L3=0;L2=1;}break;//010
        case 7:{L1=1;L2=L3=0;}break;//100
        case 8:{L1=L2=L3=0;}break;//000
        case 1:{L1=L2=L3=1;}break;//111
        default:{L1=L2=L3=0;}break;
    }//d显示小数点11,10关闭
    P0=ShuMaGuan[s];
}
void XianShi(unsigned char w)
{
    switch(w)
    {
        case 0:ShuMaXianShi(m/10000000,1);break;
        case 1:ShuMaXianShi(m/1000000%10,2);break;
        case 2:ShuMaXianShi(m/100000%10,3);break;
        case 3:ShuMaXianShi((er?14:m/10000%10),4);break;
        case 4:ShuMaXianShi((er?10:m/1000%10),5);break;
        case 5:ShuMaXianShi((er?10:m/100%10),6);break;
        case 6:ShuMaXianShi((er?0:m/10%10),7);break;
        case 7:ShuMaXianShi((er?10:m%10),8);break;
        default:P0=L1=L2=L3=0;break;
    }
}
unsigned char JianPanShaoMiao(/*使用行列反转扫描法*/)
{    
    unsigned char H=15,L=240,Ys=0;
    P1=15;
    if(P1!=15)
    {        
        while(++Ys);//消抖
        H=P1;
        P1=240;
        L=P1;
        while(P1!=240);
    }
    P1 = 255;
    return (H+L);
}
unsigned char JianPanQuZhi(/*定义按钮*/)
{    
    unsigned char Jian_Zhi=0,LinShi=JianPanShaoMiao();
    if(LinShi==255)return LinShi;else//减小对延时影响提高运行效率
    while(LinShi!=ShaoMiaoZhi[Jian_Zhi])if(++Jian_Zhi > 15)break;
    return Jian_Zhi;//按键排列
    //12 08 04 00
    //13 09 05 01
    //14 10 06 02
    //15 11 07 03
}
void main()
{
    unsigned char jz=0,xd=0,ys=0,w=0,s=0;//数据2^8=256
    unsigned int Ys=747;//数据2^16=65536
    unsigned long mm=63258741;//数据2^32=4294967296
    bit bk=0;
    while(1)
    {
        jz=JianPanQuZhi();
        if(jz<10){m=m*10+jz;}
        if(++ys>24)
        {
            if(bk)beep=!beep;
            ys=0;
            XianShi(w);if(++w>7){w=0;}
            if(bk&&++xd==0){bk=0;m=0;}
        }
        if(k==0&&++xd==0)
        {
            if(mm==m){led=!led;s=0;}
            else
            {
                if(++s<3){bk=1;}
                else er=1;
            }
            while(k==0);
        }
    }
}`

修改使得按键不影响数码管显示

cpp 复制代码
`while(P1!=240){XianShi(w);if(++w>7)w=0;}
while(k==0){XianShi(w);if(++w>7)w=0;}`

需要注意的是处理LONG数据类型比处理CHAR数据类型花费时间长,将LONG数据类型修改为4个CHAR数据类型同样能达到8位密码,不使用CHAR数组8个存储8位密码,处理时间变长一直找不到原因,对比上贴1302才觉得应该是数据类型不同处理时间也不同,虽然同样都是处理8位数码管数据。修改代码如下:证实分析是对的。

cpp 复制代码
`#include "reg52.h"
unsigned char code ShuMaGuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code ShaoMiaoZhi[]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
sbit L1=P2^2;
sbit L2=P2^3;
sbit L3=P2^4;
sbit k=P3^0;
sbit led=P2^0;
sbit beep=P2^5;
bit er=0;
unsigned char m1=0,m2=0,m3=0,m4=0;
void ShuMaXianShi(unsigned char s,unsigned char w)
{
    P0=L1=L2=L3=0;
    switch(w)
    {
        case 2:{L1=0;L2=L3=1;}break;
        case 3:{L2=0;L1=L3=1;}break;
        case 4:{L1=L2=0;L3=1;}break;
        case 5:{L1=L2=1;L3=0;}break;
        case 6:{L1=L3=0;L2=1;}break;
        case 7:{L1=1;L2=L3=0;}break;
        case 8:{L1=L2=L3=0;}break;
        case 1:{L1=L2=L3=1;}break;
        default:{L1=L2=L3=0;}break;
    }
    P0=ShuMaGuan[s];
}
void XianShi(unsigned char w)
{
    switch(w)
    {
        case 0:ShuMaXianShi(m4/10,1);break;
        case 1:ShuMaXianShi(m4%10,2);break;
        case 2:ShuMaXianShi(m3/10,3);break;
        case 3:ShuMaXianShi((er?14:m3%10),4);break;
        case 4:ShuMaXianShi((er?10:m2/10),5);break;
        case 5:ShuMaXianShi((er?10:m2%10),6);break;
        case 6:ShuMaXianShi((er?0:m1/10),7);break;
        case 7:ShuMaXianShi((er?10:m1%10),8);break;
        default:P0=L1=L2=L3=0;break;
    }
}
unsigned char JianPanShaoMiao()
{    
    unsigned char H=15,L=240,Ys=0,w=0;
    P1=15;
    if(P1!=15)
    {        
        while(++Ys);
        H=P1;
        P1=240;
        L=P1;
        while(P1!=240)if(++Ys==47){XianShi(w);if(++w>7)w=0;Ys=0;}
    }
    P1 = 255;
    return (H+L);
}
unsigned char JianPanQuZhi()
{    
    unsigned char Jian_Zhi=0,LinShi=JianPanShaoMiao();
    if(LinShi==255)return LinShi;else
    while(LinShi!=ShaoMiaoZhi[Jian_Zhi])if(++Jian_Zhi > 15)return 255;
    return Jian_Zhi;
}
void main()
{
    unsigned char jz=0,xd=0,ys=0,w=0,s=0,ym1=63,ym2=25,ym3=87,ym4=41;
    bit bk=0;
    while(1)
    {
        jz=JianPanQuZhi();
        if(jz<10)
        {//用4个CHAR变量存储8位密码
            if(m1>9)
            {
                if(m3>9){if(m4<10){m4=m4*10+m3/10;m3%=10;}}
                if(m2>9){if(m3<10){m3=m3*10+m2/10;m2%=10;}}
                if(m2<10)m2=m2*10+m1/10;
                m1%=10;
            }
            m1=m1*10+jz;
        }
        if(++ys>47)
        {
            if(bk)beep=!beep;
            ys=0;
            XianShi(w);if(++w>7)w=0;
            if(bk&&++xd==0){bk=0;m4=m3=m2=m1=0;}
        }
        if(k==0&&++xd==0)
        {
            if(ym4==m1&&ym3==m2&&ym2==m3&&ym1==m4){led=!led;s=0;}
            else
            {
                if(++s<3)bk=1;
                else er=1;
            }
            while(k==0)if(++xd==47){XianShi(w);if(w>7)w=0;else ++w;xd=0;}
        }
    }
}`


从2个程序2张波形对比可以看到调节到差不多周期,但是延时数值不同24和47,证实之上所述处理数据类型引起的时间不同。

相关推荐
鱼鱼不愚与19 分钟前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络5 小时前
论最小 Agent 计算机的形态
算法
FreakStudio20 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
kisshyshy20 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
LinXunFeng2 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github