
44矩阵键盘检测程序(新手用),本程序用于检测44矩阵按键,先检测是否有按
键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给
8位数码管,P2^0位选,P2^1段选,P1接44矩阵按键
#include <reg52h>
#include<intrinsh> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit du=P2^1; //段选位
sbit we=P2^0; //位选位
uchar code duanma[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(xms) //延时函数
{
uchar i,j;
for(xms=i,i>0;i--;)
for(j=11;j>0;j--);
}
void main() //主函数
{
we=1; //位选开
P0=0; //8位数码管全部显示
we=0; //位选关
du=1; //段选开
P1=0x00; //初始化,8位数码管无显示
while(1)
{
uchar a,b;
P1=0xf0;
a=P1;
if(a!=0xf0)
{
delay(5); //去抖动
b=P1;
if(a==b)
{
a=0xfe;
do
{
P1=a;
if(a!=P1)
{
switch(P1)
{
case 0x7e:{P0=duanma[0];break;} //编码检测,第一个键按下显示0,第16个按键按下显示F
case 0xbe:{P0=duanma[1];break;}
case 0xde:{P0=duanma[2];break;}
case 0xee:{P0=duanma[3];break;}
case 0x7d:{P0=duanma[4];break;}
case 0xbd:{P0=duanma[5];break;}
case 0xdd:{P0=duanma[6];break;}
case 0xed:{P0=duanma[7];break;}
case 0x7b:{P0=duanma[8];break;}
case 0xbb:{P0=duanma[9];break;}
case 0xdb:{P0=duanma[10];break;}
case 0xeb:{P0=duanma[11];break;}
case 0x77:{P0=duanma[12];break;}
case 0xb7:{P0=duanma[13];break;}
case 0xd7:{P0=duanma[14];break;}
case 0xe7:{P0=duanma[15];break;}
}
}
a=_crol_(a,1); //循环移位去检测按键
}while(a!=0xef);
}
}
}
}
用51单片机,假设p1·0至p1·3接4个开关,P2·0接开锁按键S1
While(s1!=0);//等待按开锁按钮
delayms(10);//延时
While(s1==0);//等待按键抬起
mima=0x0F&P1;//读取P1低4位
if(mima==12)lock=1;//如果与设定密码相等开锁
else Fmq=1;//否则,报警
单片机,数码管显示。44矩阵键盘
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
#define key P1
sbit lock=P3^1;
sbit worn=P3^2;
char pass_right=0;
char pass_bit=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar code key_code[]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,
0x7b,0xbb,0xdb,0xeb,0x77, 0xb7,0xd7,0xe7};
uchar data scan_con[6]={0x01,0x02,0x04,0x08,0x10,0x20};
uchar data dis[6]={0,0,0,0,0,0};
uchar data shumi[]={0,0,0,0,0,0};
uchar data cmima[6]={6,5,4,3,2,1};
uchar data pass_word[]={0x6d,0x6d,0x77,0x73,0x40,0x40};
uchar data no_pass_word[]={0x76,0x76,0x76,0x76,0x76,0x76};
void delay(uint t)
{
uchar i,j;
for(i=0;i<t;i++)
for(j=0;j<121;j++);
}
uchar key_scan()
{
uchar x,y,z,j;
key=0xff;
key=0x0f;
if(key!=0x0f)
{
delay(10);
if(key!=0x0f)
x=key;
key=0xf0;
y=key;
z=x|y;
for(j=0;j<16;j++)
if(z==key_code[j])
return j;
}
else key=0xff;
return 16;
}
void display()
{
uchar i;
for(i=0;i<6;i++)
{
P0=table[dis[i]];P2=scan_con[i];delay(10);P0=0x00;
}
}
void pass_word_display()
{
uchar i;
if(pass_right)
for(i=0;i<6;i++)
{
P0=pass_word[i];P2=scan_con[i];delay(10);P0=0x00;
}
else
for(i=0;i<6;i++)
{
P0=no_pass_word[i];P2=scan_con[i];delay(10);P0=0x00; worn=0;
}
}
void shumih()
{
uchar k,i=0,j;
if((k=key_scan())==1)
{
pass_bit=0;pass_right=0; worn=1;lock=1;
for(j=0;j<6;j++)
shumi[j]=0;
while(i!=6)
{
display();
if((k=key_scan())!=16)
{
while(k==key_scan());
for(j=5;j>0;j--)
shumi[j]=shumi[j-1];
switch(k)
{
case 4:shumi[0]=1;i++;break;
case 5:shumi[0]=2;i++;break;
case 6:shumi[0]=3;i++;break;
case 8:shumi[0]=4;i++;break;
case 9:shumi[0]=5;i++;break;
case 10:shumi[0]=6;i++;break;
case 12:shumi[0]=7;i++;break;
case 13:shumi[0]=8;i++;break;
case 14:shumi[0]=9;i++;break;
case 15:shumi[0]=0;i++;break;
default:break;
}
}
for(j=0;j<6;j++)
dis[j]=shumi[j];
}
}
}
void mima_pass()
{
uchar k;
if((k=key_scan())==2)
{
delay(5);
pass_bit=1;
while(k==key_scan());
if(shumi[0]==cmima[0])
if(shumi[1]==cmima[1])
if(shumi[2]==cmima[2])
if(shumi[3]==cmima[3])
if(shumi[4]==cmima[4])
if(shumi[5]==cmima[5])
{
pass_right=1;
lock=0;
}
}
}
void main()
{
display();
while(1)
{
shumih();
mima_pass();
if(pass_bit!=1)
display();
else
pass_word_display();
}
}
以上就是关于(80C51单片机)设计4×4键盘及8位数码管显示构成的电子密码锁.的C语言程序。全部的内容,包括:(80C51单片机)设计4×4键盘及8位数码管显示构成的电子密码锁.的C语言程序。、c语言单片机密码锁控制程序,用4个按键输入状态分别代表4位二进制数,可组成16种密码,范围0000、请问哪位高人有电子密码锁的C语言程序,最好是有注释的 谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)