一、流程图
一、 硬件部分
1)动态数码管(共阴)
a、数码管原理图:
b、共阳数码管码表:
0xc0 0xf9 0xa4 0xb0 0x99 0x92 0x82 0xf8 0x80 0x90 0 1 2 3 4 5 6 7 8 9 注:共阴在共阳基础上加“~”取反。
c、74hc573芯片:
注:输出使能为OE,锁存使能为LE。
d、74hc138芯片: A 0 1 0 1 0 1 0 1
B 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 C ______
Y0 _____Y1 ______Y2 _____Y3 _____Y4 ______Y5 ______Y6 ______Y7 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0
e、上拉电阻:P0端口必须接上拉电阻才能置一。 2)4×3按键: a、按键去抖动:
单片机常用软件去抖法,第一次检测到有键按下时,不是立刻认定按键的有效性,而是延时5~10ms或更长时间,再检测一次该键,如果仍有效,才确认为有效按键。在按键释放后,应再延时5~10ms,以消除后沿的抖动。 先反转法:
求按键的列线值:行线作为输出线,列线作为输入线,即可得到列线值。 求按键的行线值:行线作为输入线,列线作为输出线,即可得到行线值。 求按键的特征码:将列线值与行线值合并。
P1=0000 1110第一行 P1=0110 0000第一列 P1=0000 1101第二行 P1=0101 0000第二列 P1=0000 1011第三行 P1=0011 0000第三列 P1=0000 0111第四行 c、原理图:
3)复位电路,晶振电路:
4)密码锁原理图:
二、 程序: #include void delay5ms(void); void delay500ms(void); sbit led=P2^3; void main(void) { unsigned int m=0; unsigned char z,x,y,n=0; unsigned char i=0; unsigned int B[]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07}, A[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x00}; P0=0x00; while(1) { P1=0x0F; if(P1!=0x0F) { P1=0x0F; delay5ms(); if(P1!=0x0F) { z=P1; P1=0x70; x=P1; y=z^x; P2=B[i]; if(n==0) { led=1; } switch(y) { case 0x6E:P0=~A[1];delay500ms();if(i==7&&m==7){n=1;led=0;}i++;break; case 0x5E:P0=~A[2];delay500ms();i++;break; case 0x3E:P0=~A[3];delay500ms();if(i==6&&m==6)m=7;i++;break; case 0x6D:P0=~A[4];delay500ms();if(i==5&&m==5)m=6;i++;break; case 0x5D:P0=~A[5];delay500ms();if(i==3&&m==3)m=4;i++;break; case 0x3D:P0=~A[6];delay500ms();if(i==4&&m==4)m=5;i++;break; case 0x6B:P0=~A[7];delay500ms();if(i==2&&m==2)m=3;i++;break; case 0x5B:P0=~A[8];delay500ms();if(i==1&&m==1)m=2;i++;break; case 0x3B:P0=~A[9];delay500ms();i++;break; case 0x57:P0=~A[0];delay500ms();if(i==0)m=1;i++;break; default:break; } if(i>7) { i=0; P0=0x00; } } } } } void delay5ms(void) //误差 0us { unsigned char a,b; for(b=19;b>0;b--) for(a=130;a>0;a--); } void delay500ms(void) //误差 0us { unsigned char a,b,c; for(c=23;c>0;c--) for(b=152;b>0;b--) for(a=70;a>0;a--); } 三、 总结: 按键原本想用keypad-phone的,无奈不知道怎么使用,于是改用独立按键。按键程序自己写的时候用的是并列的if语句,程序编译会出错,后来参考别人写的发现是用if嵌套语句。判断密码正确的程序最初是想在switch语句后面写的,发现无法通过编译,也不知道问题出在哪,只知道if语句的条件有问题,最后为了减少if语句的判断条件,索性将判断密码的语句写在switch语句中,最后黄天不负有心人,简易密码锁成功了。不过还有点小问题,就是数码管显示一个数字后会再按下一个数字,上一个数字就会消失,无法显示按了什么,这是因为我用了38译码器作为动态数码管的 片选输入。初衷是为了节省端口,之后要去了解了解别的扩展端口的方法。 2019年3月15日 因篇幅问题不能全部显示,请点此查看更多更全内容