#include <reg51.h>; //引用头部文件
void delay(void); //按键消抖延时函数
uchar keyscan(); //按键扫描函数
void timer0_int(void) interrupt 1; //定时器0中断服务程序
void timer1_int(void) interrupt 3; //定时器3中断服务程序
uchar getcode(uchar i); //根据共阴极字型编码表获取字型代码
void display(); //显示函数
bit pwcmp(void); //密码比较函数
uchar digbit; //字位
uchar wordbuf[6]; //字型码缓冲区
uchar tlcount; //定时器1由50ms累积到1s所用的计数器
uchar count; //密码位计数
uchar pw[6]; //初始密码存储区
uchar pwbuf[6]; //输入密码存储区
bit enterflag; //确认键按下与否标志
bit pwflag; //密码正确与否标志
bit showflag; //数码管显示与否标志
sbit green=p3^0;
sbit red=p3^1;
//应用程序主函数
main ()
{
uchar j,key;
P2=0x0; //关闭数码管显示
TMOD=0x11; //T0,T1工作方式1
//2ms定时设置
THO=-2000/256;
TLO=-2000%256;
//50ms定时设置
THO=-5000/256;
TLO=-2000%256;
//启动计数器0,关闭计数器1
TRO=1;
ET0=1;
TR1=0;
ET1=1;
EA=1;
count=0; //初始没有输入密码,计数器设为0
enterflag=0; //没有按下确认键
pwflag=0; //密码标志先置为0
open=1; //非开锁
close=1; //非不开锁
//假设内定密码为845231
pw[0]=8;
pw[1]=4;
pw[2]=5;
pw[3]=2;
pw[4]=3;
pw[5]=1;
showflag=1; //打开数码管显示
//刚加电时,显示888888
for(j=0;j<6;j++)
wordbuf[j]=8;
digbit=0x01; //从第一行数码开始动态扫描
while(1)
{
key=keyscan(); //调用键盘扫描函数
switch(key)
{
case 0x11: //1行1列,数字0
if(count<6)
{
wordbuf[count]=0x0f;//对应密码位显示“F”
pwbuf[count]=0;
count++;
}
break;
case 0x21:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=1;
count++;
}
break;
case 0x41:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=2;
count++;
}
break;
case 0x81:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=3;
count++;
}
break;
case 0x12:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=4;
count++;
}
break;
case 0x22:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=5;
count++;
}
break;
case 0x42:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=6;
count++;
}
break;
case 0x82:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=7;
count++;
}
break;
case 0x14:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=8;
count++;
}
break;
case 0x24:
if(count<6)
{
wordbuf[count]=0x0f;
pwbuf[count]=9;
count++;
}
break;
case 0x44: //3行2列,数字9
enterflag=1; //确认键按下
if(count==6) //只要输入6个密码后按确认那件才作密码比较
pwflag=pwcmp();
else
pwflag=0; //否则直接peflag赋0
break;
case 0x84: //3行4列,取消键
count=0; //密码计数器清0
for (j=0;j<6;j++)
wordbuf[j]=8; //数码管显示888888
pwbuf[j]0x0f; //用FFFFFF清除已经输入的密码
}
break;
default:break;
}
if(enterflag==1) //如果按下确认键
{
enterflag=0; //标志位置回0
count=0; //密码位计数器清0
//用FFFFFF清除已经输入的密码
for(j=0;j<6;j++)
pwbuf[j]=0x0f;
showflag=0; //关闭数码管显示
TR1=1; //计数器1开始计数
tlcount=0;
if(pwflag==1)
open=0; //绿灯亮
else
close=0; //红灯亮
}
}
}
//按键消抖延时函数
void delay(void)
{
uchar i;
for(i=300;i>0;i--);
}
//
按键扫描函数
uchar keyscan(void)
{
uchar scancode,tmpcode; //发全0行扫描码
P1=0xf0; //若有键按下
if((P1&0xf0)!=0xf0)
{
delay(); //延时去抖动
if( (P1&0xf0)!=0xf0) //延时后再判断,去除抖动影响
{
scancode=0xfe;
while((scancode&0x10)!=0) //逐行扫描
{
P1=scancode; //输出行扫描码
if((P1&0xf0)!=0xf0) //本行有键按下
{
tmpcode=(P1&0xf0)|0x0f;
//返回特征字节码,为1的位即对应于行和列
return((~scancode)+(~tmpcode));
}
else scancode=(scancode<<1)|0x01; //行扫描码左移一位
}
}
}
return(0); //无键按下,返回值为0
}
//定时器0中断服务子程序,2ms定时动态扫描显示
void time0_int(void) interrupt 1
{
//重置2ms定时
TH0=-2000/256;
TL0=-2000&256;
if (showflag==1)
display(); //调用显示函数
}
//定时器1中断服务子程序,50ms定时动态扫描显示
void time1_int(void) interrupt 3
{
uchar k;
//重置50ms定时
TH0=-2000/256;
TL0=-5000&256;
if (tlcount<20)
{
tlcount++;
}
else //计时到1s
{
TR1=0; //关闭计数器1
Tlcount=0;
open=1; //绿灯不亮
close=1; //红灯不亮
showflag=1; //打开数码管显示
digbit=0x01; //从数码管第1位开始动态显示
for(k=0;k<6;k++) //显示888888
wordbuf[k]=8;
}
}
//根据共阴极字型编码表获取0~9,A~B字型代码
uchar getcode(uchar i)
{
uchar p;
switch(i)
{
case0: p=0x3f; break; //0
case1: p=0x06; break; //1
case2: p=0x5B; break; //2
case3: p=0x4F; break; //3
case4: p=0x66; break; //4
case5: p=0x6D; break; //5
case6: p=0x7D; break; //6
case7: p=0x07; break; //7
case8: p=0x7F; break; //8
case9: p=0x67; break; //9
case10: p=0x77; break; //A
case11: p=0x7C; break; //B
case12: p=0x39; break; //C
case13: p=0x5E; break; //D
case14: p=0x79; break; //E
case15: p=0x71; break; //F
default:
}
return(p);
}
//数码显示函数
void delay1(void) //延时1函数
{
int k;
for(k=0;k<100;k++);
}
void delay2(void) //延时2函数
{
int k;
for(k=0;k<300;k++);
}
void display(int k) //显示函数
{
P0=0xf7; //千位
P2_6=1; //产生一个脉冲 锁存
delay1();
P2_6=0;
P0=tab[k/1000]; //千位值
P2_7=1; //产生一个脉冲 锁存
delay1();
P2_7=0;
delay2(); //延时
P0=0xff; //段消隐
P2_7=1;
delay1();
P2_7=0;
P0=0xfb; //百位
P2_6=1; //产生一个脉冲
delay1();
P2_6=0;
P0=tab[k%1000/100]; //百位值
P2_7=1; //产生一个脉冲
delay1();
P2_7=0;
delay2();
P0=0xff; //段消隐
P2_7=1;
delay1();
P2_7=0;
P0=0xfd; //十位
P2_6=1; //产生一个脉冲
delay1();
P2_6=0;
P0=tab[k%100/10]; //十位值
P2_7=1; //产生一个脉冲
delay1();
P2_7=0;
delay2();
P0=0xff; //段消隐
P2_7=1;
delay1();
P2_7=0;
P0=0xfe; //个位
P2_6=1; //产生一个脉冲
delay1();
P2_6=0;
P0=tab[k%10]; //个位值
P2_7=1; //产生一个脉冲
delay1();
P2_7=0;
delay2();
P0=0xff; //段消隐
P2_7=1;
delay1();
P2_7=0;
}
//密码比较函数
bit pwcmp(void)
{
bit flag;
uchar i;
for(i=0;i<6;i++)
{
if(pw[i]==pwbuf[i])
flag=1;
else
{
flag=0;
i=6;
}
}
return(flag);
}
mimasuo.rar_密码锁 数码管_密码锁数码管_矩阵密码锁
版权申诉
85 浏览量
2022-09-22
23:50:53
上传
评论 1
收藏 2KB RAR 举报
四散
- 粉丝: 51
- 资源: 1万+
最新资源
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
- python-leetcode面试题解之第165比较版本号-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0