📄 多功能密码锁.c
字号:
#include"REGX51.h"
/************************************************ 宏定义 **********************************************************/
/* LCD commend */
#define TwoLine_8bit 56
#define CLEAR 1
#define CURSOR_HOME 2
#define CURSOR_LEFT 4
#define CURSOR_RIGHT 6
#define CURSOR_OFF 12
#define CURSOR_ON 14
#define CURSOR_BLINK 15
#define GOTO_LINE_2 192
#define GOTO_LINE_1 128
/* LCD control lines */
#define ENABLE 1
#define DISABLE 0
#define RADE 1
#define WRITE 0
#define COMMAND 0
#define DATA 1
#define rs P1_0
#define rw P1_1
#define enable P1_2
sbit DQ= P1^3;
sbit LOCKOUT= P1^4;
sbit TEMPOUT= P1^5;
sbit LOCK= P1^6;
sbit BELL= P1^7;
sbit LEFT= P3^5;
sbit ENTER= P3^6;
sbit RIGHT= P3^7;
/************************************************ END **********************************************************/
/************************************************ 键盘扫描 **********************************************************/
code char key_code[]={0xDD,0x7E,0x7D,0x7B,0x77,0xBE,0xBD,0xBB,0xB7,0xDE,0xDB,0xD7,0xEE,0xED,0xEB,0xE7};
code ksp[4]={0x7F,0xBF,0xDF,0xEF};
void delay( void )
{
unsigned char i,j;
for(i=0;i<5;i++)
for(j=0;j<255;j++)
;
}
char keypad_scan( void )
{
char key,i;
P2=0xF0;
while(P2!=0xF0)
;
do{
for(i=0;i<=3;i++)
{
P2=ksp[i];
if(P2!=ksp[i])
{
delay();
key=P2;
if(key!=ksp[i])
{
return(key);
}
}
}
}while(ENTER);
}
char gotkey( void )
{
char temp,i;
temp=keypad_scan();
for(i=0;i<=15;i++)
{
if(temp==key_code[i])
return(i);
}
}
/************************************************ END **********************************************************/
/************************************************ 1602液晶控制 ************************************************************/
char code int2charLCD[]="0123456789";
void delay100us( unsigned char j )
{
unsigned char i;
i=10*j;
while(i--);
}
void write_LCD_command( unsigned command )
{
rw=WRITE;
rs=COMMAND;
enable=ENABLE;
P0=command;
delay100us(20);
enable=DISABLE;
rw=1;
}
void write_LCD_data( unsigned LCDdata )
{
rw=WRITE;
rs=DATA;
enable=ENABLE;
P0=LCDdata;
delay100us(20);
enable=DISABLE;
rw=1;
}
void init_LCD( void )
{
write_LCD_command(TwoLine_8bit);
write_LCD_command(CURSOR_OFF);
write_LCD_command(CURSOR_RIGHT);
}
void clear_LCD( void )
{
write_LCD_command(CLEAR);
write_LCD_command(CURSOR_HOME);
}
void display_LCD_string( char *p )
{
while(*p)
{
write_LCD_data(*p);
p++;
}
}
void display_LCD_int( char number )
{
unsigned char x;
x=number;
write_LCD_data(int2charLCD[x]);
}
void gotoxy( unsigned x , unsigned y )
{
if(x==1)
write_LCD_command(GOTO_LINE_1+y);
else
write_LCD_command(GOTO_LINE_2+y);
}
/************************************************ END **********************************************************/
/************************************************ 计算器 **********************************************************/
unsigned long dat1=0,dat2=0,dat3=0;
void print_num( unsigned long dat )
{
unsigned char x;
if(dat<10)
x=1;
if(dat>=10&&dat<100)
x=2;
if(dat>=100&&dat<1000)
x=3;
if(dat>=1000&&dat<10000)
x=4;
if(dat>=10000&&dat<100000)
x=5;
if(dat>=100000&&dat<1000000)
x=6;
if(dat>=1000000&&dat<10000000)
x=7;
if(dat>=10000000&&dat<100000000)
x=8;
if(dat>=100000000&&dat<1000000000)
x=9;
if(dat>=1000000000&&dat<10000000000)
x=10;
gotoxy(2,x-10);
display_LCD_int(dat/1000000000);
gotoxy(2,x-9);
display_LCD_int(dat/100000000%10);
gotoxy(2,x-8);
display_LCD_int(dat/10000000%10);
gotoxy(2,x-7);
display_LCD_int(dat/1000000%10);
gotoxy(2,x-6);
display_LCD_int(dat/100000%10);
gotoxy(2,x-5);
display_LCD_int(dat/10000%10);
gotoxy(2,x-4);
display_LCD_int(dat/1000%10);
gotoxy(2,x-3);
display_LCD_int(dat/100%10);
gotoxy(2,x-2);
display_LCD_int(dat/10%10);
gotoxy(2,x-1);
display_LCD_int(dat%10);
}
Calculator( void )
{
unsigned char temp;
unsigned char key;
unsigned char i=0;
init_LCD();
clear_LCD();
gotoxy(2,6);
display_LCD_string("Calculator");
while(1)
{
key=gotkey();
switch(key)
{
case 0:
dat1=dat1*10+0;
gotoxy(1,i);
i++;
display_LCD_int(0);
break;
case 1:
dat1=dat1*10+1;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(1);
break;
case 2:
dat1=dat1*10+2;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(2);
break;
case 3:
dat1=dat1*10+3;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(3);
break;
case 4:
dat1=dat1*10+4;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(4);
break;
case 5:
dat1=dat1*10+5;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(5);
break;
case 6:
dat1=dat1*10+6;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(6);
break;
case 7:
dat1=dat1*10+7;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(7);
break;
case 8:
dat1=dat1*10+8;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(8);
break;
case 9:
dat1=dat1*10+9;
dat3=dat1;
gotoxy(1,i);
i++;
display_LCD_int(9);
break;
case 10:
i=0;
dat1=0;
dat2=0;
dat3=0;
clear_LCD();
gotoxy(1,15);
display_LCD_string("C");
break;
case 11:
i=0;
dat3=0;
gotoxy(1,15);display_LCD_string("=");
switch(temp)
{
case '+':dat3=dat2+dat1;break;
case '-':dat3=dat2-dat1;break;
case '*':dat3=dat2*dat1;break;
case '/':dat3=dat2/dat1;break;
}
print_num(dat3);
break;
case 12:
i=0;
dat3=0;
dat2=dat1;
dat1=0;temp='+';
dat3=dat2;clear_LCD();
gotoxy(1,15);
display_LCD_string("+");
break;
case 13:
i=0;
dat3=0;
dat2=dat1;
dat1=0;
temp='-';
dat3=dat2;
clear_LCD();
gotoxy(1,15);
display_LCD_string("-");
break;
case 14:
i=0;
dat3=0;
dat2=dat1;
dat1=0;
temp='*';
dat3=dat2;
clear_LCD();
gotoxy(1,15);
display_LCD_string("X");
break;
case 15:
i=0;
dat3=0;
dat2=dat1;
dat1=0;
temp='/';
dat3=dat2;clear_LCD();
gotoxy(1,15);
display_LCD_string("/");
break;
default:
break;
}
}
}
/************************************************ END **********************************************************/
/************************************************ 主函数及菜单 **********************************************************/
void main( void )
{
char num;
init_LCD();
clear_LCD();
num=0;
while(1)
{
Calculator();
}
}
/************************************************ END **********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -