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

📄 password.c

📁 在单片机的产品设计中
💻 C
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/pgmspace.h>
#define PRG_RDB(addr)       pgm_read_byte(addr)
#include"right.h"
#include"ding.h"
#include"input.h"
#include"again.h"#include"succeed.h"
#include"wrong.h"

#define PPI_1_PA (unsigned char *)0x6000
#define PPI_1_PB (unsigned char *)0x6001
#define PPI_1_PC (unsigned char *)0x6002
#define PPI_1_CT (unsigned char *)0x6003
#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001

unsigned char *lcd_data,*lcd_control,F_Pass=0;
unsigned char *ppi_ctrl,*key,F_Update=0,Flag=1;
unsigned int i=0,cnt=0;
unsigned int G_Password[6]={1,2,3,4,5,6};
unsigned int G_Password_Get[6];
unsigned int Update_Password[6];
volatile const char string_data0[]="Password Right  ";
volatile const char string_data1[]="Password Wrong  ";
volatile const char string_data2[]="Quit clear      ";
volatile const char string_data3[]="Password Updated";
volatile const char string_data4[]="Input Wrong     ";
volatile const char string_data6[]="Input Password  ";
volatile const char string_data5[]="Input Again     ";
volatile const char string_data7[]="operation wrong ";
volatile const char string_data8[]="Welcome         ";

unsigned char key_scan(void);
void delay(int d1,int d2);
void initialize_ppi(void);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
void display(unsigned char in);
unsigned int Com_Password(unsigned int *a,unsigned int *b);
void F_numLED_Status(unsigned int temp);
void print_message(char *message);
void music(unsigned char __attribute__ ((progmem)) *snd_data,unsigned long int n);
unsigned char EEPROM_read(unsigned int uiAddress);
void EEPROM_write(unsigned int uiAddress, unsigned char ucData);

int main(void)
{
  unsigned char in,k;
  MCUCR=(1<<SRE);
  initialize_ppi();
  initialize_text_lcd(); 
  F_numLED_Status(0);
  print_message((char *)string_data8);	
  if(EEPROM_read(0x00f0)==1) 
  {
  for(k=0;k<6;k++)
  G_Password[k]=EEPROM_read(0x00f1+k);
  }
  do{
  delay(1000,700);
  in=key_scan();
  if(in)
      display(in);
    }while(1);	
	
}

unsigned char key_scan(void)
{
  unsigned char save_low,save_high;
  *ppi_ctrl=0x91;
  *key=0xf0;
  delay(10,10);
  save_low=*key&0x0f;
  *ppi_ctrl=0x90;
  *key=0x00;
  if(save_low){
  *ppi_ctrl=0x98;
  *key=0x0f;
  delay(10,10);
  save_high=*key&0xf0;
  *ppi_ctrl=0x90;
  *key=0x00;
  if(!save_high)
     return 0;
	 save_high |=save_low;
	 return save_high;
     }
	 return 0;
}

void display(unsigned char in)
{
  unsigned char a=11,j,k;
  switch(in){
       case 0x11:a=0x01;
	              break;
		case 0x21:a=0x02;
		          break;
	    case 0x41:a=0x03;
	              break;
		case 0x81://键入 A	表示显示当前密码
		   if(F_Update==0){
    		if(F_Pass==1) {
			*lcd_control=0x80;
	        lcd_control_wait();
	       for(i=0;i<6;i++){
	        *lcd_data=G_Password[i]+'0';
	         lcd_data_wait();
	         }
		}
			   
    		else F_numLED_Status(2);}
			else{
			    print_message((char *)string_data7);
				music(snd_data,1976);
				}
	              break;
		 case 0x12:a=0x04;
	              break;
         case 0x22:a=0x05;
	              break;
		case 0x42:a=0x06;
	              break;
		case 0x82:
		     if(F_Pass==1){
		        F_Update=1;
				*lcd_control=0x01;
                lcd_control_wait();
				print_message((char *)string_data6);
				 music(input,10338);
				}
				else
    			    F_numLED_Status(2);	
    			    break;
		case 0x14:a=0x07;
	              break;
		case 0x24:a=0x08;
	              break;
		case 0x44:a=0x09;
	              break;
		case 0x84:
		        F_Pass = 0;
				F_Update=0;
    			F_numLED_Status(2);
	              break;
		case 0x18://键入 *	保存密码
				if(Flag==1&&F_Update==1)			//若处于"开门"状态,则可保存密码(更新密码)
    			{
				    Flag=0;
					*lcd_control=0x01;
                    lcd_control_wait();
					print_message((char *)string_data5);
					 music(again,11238);
    				}
    			else if(Flag==0&&F_Update==1)
    			{
				    Flag=1;
					j = Com_Password((unsigned int *)Update_Password,(unsigned int *)G_Password_Get);		//比效密码
    			   if(j==1)				//返回值为1则表示通过对比
    			     {
				       for(i=0;i<6;i++){
	  		           G_Password[i] = G_Password_Get[i];	//保存新的密码
				       EEPROM_write(0x00f1+i,G_Password_Get[i]);
				       EEPROM_write(0x00f0,1);
				    }
    				  F_numLED_Status(0);
					  print_message((char *)string_data3);
					  F_Update=0;
					  music(succeed,26632);
    				  }				
    			  else
    			  {
    				*lcd_control=0x01;
                    lcd_control_wait();
					print_message((char *)string_data4);
					F_Update=0;
					music(snd_data,1976);
					}
			}
			else{
			    *lcd_control=0x01;
                lcd_control_wait();
			    print_message((char *)string_data7);
				music(wrong,7667);
				}
	              break;
		case 0x28:a=0x00;
	              break;
		case 0x48://键入 #	表示显示清零
    			if(F_Update==0)
				F_numLED_Status(0);		//显示清零
				else{
			    print_message((char *)string_data7);
				music(snd_data,1976);
				}
	              break;
		case 0x88:		//键入 D	表示密码输入确认,对比输入的密码是否正确
    			if(F_Update==0){
				j = Com_Password((unsigned int *)G_Password,(unsigned int *)G_Password_Get);		//比效密码
    			if(j==1)				//返回值为1则表示通过对比
    			{
    				F_Pass = 1;			//置当前状态为"开门"
    				F_numLED_Status(1);	//改变显示 ======
       			}				
    			else
    			{
    				F_Pass = 0;
    				F_numLED_Status(2);
    				}
				}
				else{
				
			    print_message((char *)string_data7);
				music(snd_data,1976);
				}
			    break;
		default:
	              break;
		}
	if(a>=0&&a<10)
	{
	  if(i>=6){
	  for(k=0;k<6;k++)
	  	{
	  	   G_Password_Get[k]='*';
	  	}
	      *lcd_control=0x01;
          lcd_control_wait();
	     *lcd_control=0x80;
		 lcd_control_wait();
		 i=0;
		 }
	i++;
  if(F_Update==0){	
	*lcd_data='*';
	lcd_data_wait();
	G_Password_Get[i-1]=a;}
   else  {
   *lcd_data=a+'0';
	lcd_data_wait();
	if(Flag==1)
	Update_Password[i-1]=a;
	else
	G_Password_Get[i-1]=a;}
  }
}

void initialize_ppi(void)
{
 ppi_ctrl=PPI_1_CT;
 key=PPI_1_PC;
*ppi_ctrl=0x90;
*key=0x00;
}

void delay(int d1,int d2)
{
   int i,j;
   for(i=0;i<d1;i++)
   {
     for(j=0;j<d2;j++);
   }
}

void initialize_text_lcd(void)
{
  lcd_control=TLCD_CTRL;
  lcd_data=TLCD_DATA;
  lcd_control_wait();
  *lcd_control=0x38;
  lcd_control_wait();
    *lcd_control=0x02;
  lcd_control_wait();
  *lcd_control=0x01;
  lcd_control_wait();
  *lcd_control=0x06;
  lcd_control_wait();
  *lcd_control=0x0f;
  lcd_control_wait();
}
void lcd_control_wait(void)
{
  delay(1000,100);
}
void lcd_data_wait(void)
{
  delay(1000,10);
}
unsigned int Com_Password(unsigned int *a,unsigned int *b)
{
	unsigned int uiBack=0,i;

	for(i=0;i<6;i++)
	{
		if(a[i]!=b[i]) break;
	}
	if(i==6) uiBack = 1;
	else uiBack = 0;
	return uiBack;
}
void F_numLED_Status(unsigned int temp)
{
	unsigned char b;
	switch(temp)
	{
		case 0:
			b= '0';
			break;
		case 1:
		    b= '=';
			break;
		case 2:
			 b='-';
			break;
		default:
			break;
	}
	*lcd_control=0x80;
	lcd_control_wait();
	for(i=0;i<6;i++){
	  *lcd_data=b;
	  lcd_data_wait();
	}
	if(b=='=')
	 {print_message((char *)string_data0);
	 music(right,22427);}
	else if(b=='-'){
	 print_message((char *)string_data1);
	  music(snd_data,1976);
	 }
	else
	 print_message((char *)string_data2);	
}
void print_message(char *message)
{
		 *lcd_control=0xc0;
		 lcd_control_wait();
		 for(i=0;i<16;i++){
		 *lcd_data=message[i];
		 lcd_data_wait();}
}
void music(unsigned char __attribute__ ((progmem)) *snd_data,unsigned long int n)
{
    unsigned char *ppi_pb,*ppi_ctrl;
	
	MCUCR|=(1<<SRE);
	ppi_ctrl=PPI_1_CT;
	ppi_pb=PPI_1_PB;
	*ppi_ctrl=0x80;
	for(cnt=0;cnt<=n;cnt++)
	   {*ppi_pb=PRG_RDB(&snd_data[cnt]);
	     delay(10,40);}
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
EEAR = uiAddress;/* 设置地址和数据寄存器 */
EEDR = ucData;
EECR |= (1<<EEMWE);/* 置位EEMWE */
EECR |= (1<<EEWE);/* 置位EEWE以启动写操作E */
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
EEAR = uiAddress;/* 设置地址寄存器 */
EECR |= (1<<EERE);/* 设置EERE以启动读操作 */
return EEDR;/* 自数据寄存器返回数据 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -