📄 password.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 + -