⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多功能密码锁.c

📁 单片机开发液晶显示万年历计算器电子琴电子音乐字母输入
💻 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 + -