📄 电子密码1.c
字号:
//**********************FileName:电子密码.c*******************************//
//**********************ICCAVR V6.30编译***********************************//
//**************************侯德平****************************************//
#include<io8535v.h>
#include<macros.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
const uchar tab_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71};
/* 0 1 2 3 4 5 6 7 8 9 f */
const uchar tab_w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位型码
uchar tab[]={8,8,8,8,8,8};
uchar pw[]={8,4,0,7,1,6}; //密码值
uchar pwbuf[6]; //输入密码值
uchar count,pwflag,enterflag;
void delay(uint time) /*廷时子程序*/
{
uchar i;
for(;0<time;time--)
{
for(i=0;i<254;i++);
}
}
uchar keyscan() /*键扫子程序*/
{
uchar key,rowkey,colkey;
rowkey=PINB;
DDRB=0x0f;
PORTB=0xf0;
asm("nop"); //廷时1μs
//delay(1);
colkey=PINB;
key=rowkey|colkey;
DDRB=0xf0;
PORTB=0x0f;
while(PINB!=0x0f);
return(key);
}
void display() /*显示子程序*/
{
uchar i;
for(i=0;i<6;i++)
{
PORTC = tab_w[i];
PORTA = tab_d[tab[i]];
delay(30);
}
}
uchar pwcmp() /*密码比较子程序*/
{
uchar i,flag;
for(i=0;i<6;i++)
{
if(pw[i]==pwbuf[i])
{flag = 1;}
else
{flag = 0;}
}
return(flag);
}
void io_set() /*I/O设置子程序*/
{
DDRA=0xff;
PORTA=0xff;
DDRB=0xf0;
PORTB=0x0f;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0xff;
}
void main()
{
uchar i,key;
io_set(); //调用I/O设置子程序
while(1)
{
while(PINB!=0x0f)
{key = keyscan();} //调用键扫子程序
switch(key)
{
case 0x7d: //4行2列,数字0
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 0;
key=0;
count++;
}break;
case 0xee: //1行1列,数字1
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 1;
key=0;
count++;
}break;
case 0xed: //1行2列,数字2
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 2;
count++;
key=0;
}break;
case 0xeb: //1行3列,数字3
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 3;
count++;
key=0;
}break;
case 0xde: //2行1列,数字4
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 4;
count++;
key=0;
}break;
case 0xdd: //2行2列,数字5
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 5;
count++;
key=0;
}break;
case 0xdb: //2行3列,数字6
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 6;
count++;
key=0;
}break;
case 0xbe: //3行1列,数字7
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 7;
count++;
key=0;
}break;
case 0xbd: //3行2列,数字8
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 8;
count++;
key=0;
}break;
case 0xbb: //3行3列,数字9
if(count<6)
{
tab[count] = 10; //对应密码位上显示"F"
pwbuf[count] = 9;
count++;
key=0;
}break;
case 0x7e: //4行1列,取消键
key=0;
count = 0; //密码计数清零
DDRD=0xff;
PORTD=0xff;
for(i=0;i<6;i++)
{
tab[i] = 8;
pwbuf[i] = 10;
}break;
case 0x7b: //4行3列,确认键
key=0;
enterflag = 1; //确认键按下
if(count==6) //只有输入6个密码后按确认键才作密码比较
{pwflag = pwcmp();}
else
pwflag = 0; //否则直接pwflag赋0
break;
default:break;
}
display();
if(enterflag==1) //如果确认键按下
{
enterflag = 0; //确认键标志位回0
count = 0; //密码计数清零
if(pwflag==1)
{PORTD=0x7f;}
else
{ PORTD=0xbf;}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -