- #include<main.h>
- #include<i2c.h>
- #include<12864.h>
- #include<font.h>
- #include<key.h>
- #include<ffont.h>
- sbit key_leave=P2^7; //退出鍵
- sbit beep=P1^7;
- uchar buf[PASSWORD_NUM]; //密碼暫存器
- typedef struct
- {
- uchar codes[PASSWORD_NUM]; //密碼1
- uint money;
- }PASSWORD ;
- uchar ka_flag=0; //判斷卡號
- bit password_flag=0;
- uchar deal_flag=0; //卡相關操作
- bit new_password_flag=0; //新密碼正確性標志位
- bit qukuan_flag=0; //存款標志
- PASSWORD password1,password2,password3,password4; //定義結構體變量
- void soft_reset(void)
- {
- ((void (code *) (void)) 0x0000) ();
- }
- /***
- *******延時1Ms函數
- ***/
- void delay(uint x)
- {
- uint m,n;
- for(m=x;m>0;m--)
- for(n=110;n>0;n--);
- }
- /***
- *******蜂鳴器函數
- ****/
- void buzzer()
- {
- beep=0;
- delay(100);
- beep=1;
- }
- /***
- ******密碼對比函數
- *****返回值:1 密碼錯誤
- 返回值:0 密碼正確
- ***/
- bit password_check(uchar *buf1,uchar *buf2)
- {
- uchar i;
- for(i=0;i<PASSWORD_NUM;i++)
- {
- if( buf1 != buf2 )
- {
- return 1;
- }
- }
- return 0;
- }
- /*****
- *******顯示函數
- *****/
- void display(uint MONey)
- {
- uchar date[5];
- lcd_hanzi_str(1,1,nideyue,5);
- date[0]=MONey/10000%10;
- date[1]=MONey/1000%10;
- date[2]=MONey/100%10;
- date[3]=MONey/10%10;
- date[4]=MONey%10;
- lcd_ch(2,4,num+16*date[0]);
- lcd_ch(2,5,num+16*date[1]);
- lcd_ch(2,6,num+16*date[2]);
- lcd_ch(2,7,num+16*date[3]);
- lcd_ch(2,8,num+16*date[4]);
- lcd_hanzi(2,5,yuan);
- lcd_hanzi_str(3,2,anjinhaotuichu,7);
- while( key_leave==1);
- buzzer();
- }
- /***
- ******密碼輸入函數
- ***/
- void password_input(uchar *date )
- {
- uchar count;
- char key_val;
- lcd_clear_scr();
- lcd_hanzi_str(0,0,qingshurumima,7);
- lcd_ch_str(2,4,hengxian,6);
- lcd_hanzi_str(3,3,anjinhaoqueren,5);
- count=0;
- while( count<PASSWORD_NUM )
- {
- key_val=key();
- if(key_val == -1)
- continue;
- else if( (key_val>=0)&&(key_val<=9) )
- {
- buzzer();
- date[count]=key_val;
- lcd_ch(2,4+count,xinghao);
- count++;
- }
- }
- while( key() != KEY_ENTER);
- buzzer();
- }
- /***
- ******存款函數
- ******說明:user:用戶名
- ***/
- void Cunkuan(uchar user )
- {
- ulong ac=0;
- lcd_clear_scr();
- lcd_hanzi_str(2,0,qingxuanzequchejine,8);
- delay(1000);
- lcd_clear_scr();
- lcd_ch_str(0,0,yibai,3);
- lcd_ch_str(0,13,erbai,3);
- lcd_ch_str(3,0,yiqian,4);
- lcd_ch_str(3,13,wubai,3);
- while( (k5!=0)&&(k6!=0)&&(k7!=0)&&(k8!=0) );
- buzzer();
- while(1)
- {
- if(k5==0)
- {
- delay(2);
- if(k5==0)
- {
- while(!k5);
- ac+=200;
- }
- }
- if(k6==0)
- {
- delay(2);
- if(k6==0)
- {
- while(!k6);
- ac+=500;
- }
- }
- if(k7==0)
- {
- delay(2);
- if(k7==0)
- {
- while(!k7);
- ac+=1000;
- }
- }
- if(k8==0)
- {
- delay(2);
- if(k8==0)
- {
- while(!k8);
- ac+=100;
- }
- }
- //存錢出來
- switch(user)
- {
- case 1:
- I2C_read_buf(PASSWORD_ADD,(uchar*)&password1,sizeof(PASSWORD)); //卡1
- ac=ac+password1.money;
- password1.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD,(uchar *)&password1,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 2:
- I2C_read_buf(PASSWORD_ADD1,(uchar*)&password2,sizeof(PASSWORD)); //卡1
- ac=ac+password2.money;
- password2.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD1,(uchar *)&password2,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 3:
- I2C_read_buf(PASSWORD_ADD2,(uchar*)&password3,sizeof(PASSWORD)); //卡1
- ac=ac+password3.money;
- password3.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD2,(uchar *)&password3,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 4:
- I2C_read_buf(PASSWORD_ADD3,(uchar*)&password4,sizeof(PASSWORD)); //卡1
- ac=ac+password4.money;
- password4.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD3,(uchar *)&password4,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- }
- lcd_clear_scr();
- if(qukuan_flag==1)
- {
- lcd_hanzi_str(1,1,caozuochenggong,5);
- lcd_hanzi_str(2,1,anjinhaotuichu,7);
- }
- else
- {
- lcd_hanzi_str(1,1,caozuoshibai,5);
- lcd_hanzi_str(2,1,anjinhaotuichu,7);
- }
- while(key_leave!=0);
- buzzer();
- break;
- }
- }
- /***
- ******取款函數
- ******說明:user:用戶名
- ***/
- void Qukuan(uchar user )
- {
- int ac=0;
- lcd_clear_scr();
- lcd_hanzi_str(2,0,qukuanjine,8);
- delay(1000);
- lcd_clear_scr();
- lcd_ch_str(0,0,yibai,3);
- lcd_ch_str(0,13,erbai,3);
- lcd_ch_str(3,0,yiqian,4);
- lcd_ch_str(3,13,wubai,3);
- while( (k5!=0)&&(k6!=0)&&(k7!=0)&&(k8!=0) );
- buzzer();
- while(1)
- {
- if(k5==0)
- {
- delay(2);
- if(k5==0)
- {
- while(!k5);
- ac=ac-200;
- }
- }
- if(k6==0)
- {
- delay(2);
- if(k6==0)
- {
- while(!k6);
- ac=ac-500;
- }
- }
- if(k7==0)
- {
- delay(2);
- if(k7==0)
- {
- while(!k7);
- ac=ac-1000;
- }
- }
- if(k8==0)
- {
- delay(2);
- if(k8==0)
- {
- while(!k8);
- ac=ac-100;
- }
- }
- ac=-ac;
- //存錢出來
- switch(user)
- {
- case 1:
- I2C_read_buf(PASSWORD_ADD,(uchar*)&password1,sizeof(PASSWORD)); //卡1
- ac=password1.money-ac;
- // 余額不足100,禁止操作
- if(ac<100)
- {
- lcd_clear_scr();
- lcd_hanzi_str(1,1,yuebuzu,6);
- lcd_hanzi_str(1,2,jinzhicaozuo,5);
- break;
- }
- password1.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD,(uchar *)&password1,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 2:
- I2C_read_buf(PASSWORD_ADD1,(uchar*)&password2,sizeof(PASSWORD)); //卡1
- ac=password2.money-ac;
- // 余額不足100,禁止操作
- if(ac<100)
- {
- lcd_clear_scr();
- lcd_hanzi_str(1,1,yuebuzu,6);
- lcd_hanzi_str(1,2,jinzhicaozuo,5);
- break;
- }
- password2.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD1,(uchar *)&password2,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 3:
- I2C_read_buf(PASSWORD_ADD2,(uchar*)&password3,sizeof(PASSWORD)); //卡1
- ac=password3.money-ac;
- // 余額不足100,禁止操作
- if(ac<100)
- {
- lcd_clear_scr();
- lcd_hanzi_str(1,1,yuebuzu,6);
- lcd_hanzi_str(1,2,jinzhicaozuo,5);
- break;
- }
- password3.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD2,(uchar *)&password3,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- case 4:
- I2C_read_buf(PASSWORD_ADD3,(uchar*)&password4,sizeof(PASSWORD)); //卡1
- ac=password4.money-ac;
- // 余額不足100,禁止操作
- if(ac<100)
- {
- lcd_clear_scr();
- lcd_hanzi_str(1,1,yuebuzu,6);
- lcd_hanzi_str(1,2,jinzhicaozuo,5);
- break;
- }
- password4.money=ac;
- if( !I2C_write_buf(PASSWORD_ADD3,(uchar *)&password4,sizeof(PASSWORD)) )
- qukuan_flag=1; //取款成功
- else
- qukuan_flag=0;
- ac=0;
- break;
- }
- lcd_clear_scr();
- if(qukuan_flag==1) //操作成功!
- {
- lcd_hanzi_str(1,1,caozuochenggong,5);
- lcd_hanzi_str(2,1,anjinhaotuichu,8);
- }
- else
- {
- lcd_hanzi_str(1,1,caozuoshibai,5);
- lcd_hanzi_str(2,1,anjinhaotuichu,7);
- }
- while(key_leave!=0);
- buzzer();
- break;
- }
- }
- /***
- ******重設密碼的地址和金錢
- ***/
- void set_eeprom_init()
- {
- uchar ad=0;
- for(ad=0;ad<6;ad++)
- {
- password4.codes[ad]=buf[ad];
- }
- I2C_write_buf(PASSWORD_ADD3,(uchar *)&password4,sizeof(PASSWORD));
- for(ad=0;ad<6;ad++)
- {
- password1.codes[ad]=buf[ad];
- }
- I2C_write_buf(PASSWORD_ADD,(uchar *)&password1,sizeof(PASSWORD));
- for(ad=0;ad<6;ad++)
- {
- password2.codes[ad]=buf[ad];
- }
- I2C_write_buf(PASSWORD_ADD1,(uchar *)&password2,sizeof(PASSWORD));
- for(ad=0;ad<6;ad++)
- {
- password3.codes[ad]=buf[ad];
- }
- I2C_write_buf(PASSWORD_ADD2,(uchar *)&password3,sizeof(PASSWORD));
- }
- /***
- ******重設密碼函數
- ******說明:user:用戶名
- ***/
- void input_new_password(uchar user)
- {
- while(1)
- {
- //第一次輸入密碼
- password_input(buf);
- delay(50);
- lcd_clear_scr();
- lcd_hanzi_str(2,1,set_again,6);
- delay(1000);
- lcd_clear_scr();
- //第二次輸入密碼
- switch(user)
- {
- case 1:
- password_input(password1.codes); //第二次輸入密碼
- if( !(password_check(buf,password1.codes) ) ) //判斷密碼正確性
- {
- if( !I2C_write_buf(PASSWORD_ADD,(uchar *)&password1,sizeof(PASSWORD)) ) //判斷寫入I2C信息是否成功
- {
- new_password_flag=1; //重設密碼成功
- }
- else
- new_password_flag=0; //重設密碼失敗
- }
- else
- // 設置密碼不成功
- new_password_flag=0;
- break;
- case 2:
- password_input(password2.codes); //第二次輸入密碼
- if( !(password_check(buf,password2.codes) ) ) //密碼正確
- {
- if( !I2C_write_buf(PASSWORD_ADD1,(uchar *)&password2,sizeof(PASSWORD)) ) //判斷寫入I2C信息是否成功
- {
- new_password_flag=1;
- }
- else
- new_password_flag=0;
- }
- else
- // 設置密碼不成功
- new_password_flag=0;
- break;
- case 3:
- password_input(password3.codes); //第二次輸入密碼
- if( !(password_check(buf,password3.codes) ) ) //密碼正確
- {
- if( !I2C_write_buf(PASSWORD_ADD2,(uchar *)&password3,sizeof(PASSWORD)) )//判斷寫入I2C信息是否成功
- {
- new_password_flag=1;
- }
- else
- new_password_flag=0;
- }
- else
- // 設置密碼不成功
- new_password_flag=0;
- break;
- case 4:
- password_input(password4.codes); //第二次輸入密碼
- if( !(password_check(buf,password4.codes) ) ) //密碼正確
- {
- if( !I2C_write_buf(PASSWORD_ADD3,(uchar *)&password4,sizeof(PASSWORD)) ) //判斷寫入I2C信息是否成功
- {
- new_password_flag=1;
- }
- else
- new_password_flag=0;
- }
- else
- // 設置密碼不成功
- new_password_flag=0;
- break;
- }
- //兩次輸入密碼正確處理
- if(new_password_flag==1)
- {
- lcd_clear_scr();
- lcd_hanzi_str(2,1,set_success,8); //設置密碼成功!
- delay(1000);
- break;
- }
- //兩次輸入密碼不一樣處理
- else
- {
- lcd_clear_scr();
- lcd_hanzi_str(2,1,set_fail,7); //顯示密碼錯誤
- }
- }
- }
- /****
- ******** 密碼處理函數
- ******* 說明:user為用戶名
- *****/
- void password_deal(uchar user)
- {
- ulong T_money;
- while(1)
- {
- // 1.讀入密碼,做成判斷
- switch(user)
- {
- case 1:
- I2C_read_buf(PASSWORD_ADD,(uchar*)&password1,sizeof(PASSWORD)); //卡1
- T_money=password1.money;
- if(password_check(buf,password1.codes))
- password_flag=0; //密碼錯誤
- else
- password_flag=1; //密碼正確
- break;
- case 2:
- I2C_read_buf(PASSWORD_ADD1,(uchar*)&password2,sizeof(PASSWORD)); //卡2
- T_money=password2.money;
- if(password_check(buf,password2.codes))
- password_flag=0; //密碼錯誤
- else
- password_flag=1; //密碼正確
- break;
- case 3:
- I2C_read_buf(PASSWORD_ADD2,(uchar*)&password3,sizeof(PASSWORD)); //卡3
- T_money=password3.money;
- if(password_check(buf,password3.codes))
- password_flag=0; //密碼錯誤
- else
- password_flag=1; //密碼正確
- break;
- case 4:
- I2C_read_buf(PASSWORD_ADD3,(uchar*)&password4,sizeof(PASSWORD)); //卡4
- T_money=password4.money;
- if(password_check(buf,password4.codes))
- password_flag=0; //密碼錯誤
- else
- password_flag=1; //密碼正確
- break;
- default: break;
- }
- if(password_flag==0) //密碼錯誤跳出while
- {
- lcd_clear_scr();
- lcd_hanzi_str(2,2,mimacuowu,4); //顯示密碼錯誤
- delay(1500);
- break;
- }
- lcd_clear_scr();
- lcd_hanzi_str(0,0,cunkuan,2); //顯示
- lcd_hanzi_str(0,4,chaxunyue,4);
- lcd_hanzi_str(3,0,qukuan,2);
- lcd_hanzi_str(3,4,xiugaimima,4);
- // 根據按鍵選擇操作的種類
- while( (k5==1)&&(k6==1)&&(k7==1)&&(k8==1) )
- {
- if(key_leave==0)
- {
- buzzer();
- soft_reset();
- }
- }
- buzzer();
- while(1)
- {
- if(key_leave==0)
- {
- delay(2);
- if(key_leave==0)
- {
- while(!key_leave);
- break;
- }
- }
- if(k5==0)
- {
- delay(2);
- if(k5==0)
- {
- while(!k5);
- deal_flag=1; //查詢余額
- }
- }
- if(k6==0)
- {
- delay(2);
- if(k6==0)
- {
- while(!k6);
- deal_flag=2; //修改密碼
- }
- }
- if(k7==0)
- {
- delay(2);
- if(k7==0)
- {
- while(!k7);
- deal_flag=3; //取款
- }
- }
- if(k8==0)
- {
- delay(2);
- if(k8==0)
- {
- while(!k8);
- deal_flag=4; //存款
- }
- }
- lcd_clear_scr();
- /**************具體用戶具體操作******************/
- switch(user) //判斷用戶
- {
- case 1: //卡1
- {
- if(deal_flag==1) //查詢余額
- {
- display(T_money);
- }
- if(deal_flag==2) //修改密碼
- {
- input_new_password(1) ;
- }
- if(deal_flag==3) //取款
- {
- Qukuan(1);
- }
- if(deal_flag==4) //存款
- {
- Cunkuan(1 );
- }
- }
- break;
- case 2: //卡2
- {
- if(deal_flag==1) //查詢余額
- {
- display(T_money);
- }
- if(deal_flag==2) //修改密碼
- {
- input_new_password(2) ;
- }
- if(deal_flag==3) //取款
- {
- Qukuan(2);
- }
- if(deal_flag==4) //存款
- {
- Cunkuan(2 );
- }
- }
- break;
- case 3: //卡2
- {
- if(deal_flag==1) //查詢余額
- {
- display(T_money);
- }
- if(deal_flag==2) //修改密碼
- {
- input_new_password(3) ;
- }
- if(deal_flag==3) //取款
- {
- Qukuan(3);
- }
- if(deal_flag==4) //存款
- {
- Cunkuan(3);
- }
- }
- break;
- case 4: //卡2
- {
- if(deal_flag==1) //查詢余額
- {
- display(T_money);
- }
- if(deal_flag==2) //修改密碼
- {
- input_new_password(4) ;
- }
- if(deal_flag==3) //取款
- {
- Qukuan(4);
- }
- if(deal_flag==4) //存款
- {
- Cunkuan(4);
- }
- }
- break;
- default :break;
- }
- }
- }
- }
- void main()
- {
- /*******改變這里可以改變初始密碼值**************/
- set_eeprom_init(); //不要每次都開啟這條語句,不然你設了的新密碼沒用
- lcd_init();
- lcd_clear_scr();
- lcd_hanzi_str(0,2,hy,4);
- lcd_hanzi_str(1,1,china_bank,6);
- lcd_hanzi_str(3,2,qingcharukapian,6);
- //////while///////////////////
- // 1.插入卡片
- while( (k1!=0)&&(k2!=0)&&(k3!=0)&&(k4!=0) );
- buzzer();
- lcd_clear_scr();
- // 2判斷卡
- if(k1==0)
- {
- delay(2);
- if(k1==0)
- {
- ka_flag=1; //卡1
- }
- }
- if(k2==0)
- {
- delay(2);
- if(k2==0)
- {
- ka_flag=2; //卡2
- }
- }
- if(k3==0)
- {
- delay(2);
- if(k3==0)
- {
- ka_flag=4; //卡3
- }
- }
- if(k4==0)
- {
- delay(2);
- if(k4==0)
- {
- ka_flag=4; //卡4
- }
- }
- // 3.輸入密碼
- password_input(buf);
- // 4判斷密碼
- switch(ka_flag)
- {
- case 1:
- password_deal(1);break;
- case 2:
- password_deal(2);break;
- case 3:
- password_deal(3);break;
- case 4:
- password_deal(4);break;
- }
- }
復制代碼
|