今天寫了一個關于12864類似于的程序,現在貼出來大家共同學習!
上次在論壇里也看過類似的一個程序,他沒有用上E2PROm,這一次我用上了!也是一個山寨的作品吧,哈哈!
程序里實現了修改密碼、取、存、和查詢的功能。在仿真上,出現一些小問題,文中有提過,現在就不多說了。程序雖然不是很好,不過也適合我們初學者學習學者,哈哈!!
51hei.png (9.11 KB, 下載次數: 13)
下載附件
2022-7-18 03:21 上傳
0.png (68.37 KB, 下載次數: 60)
下載附件
2016-9-9 01:18 上傳
仿真及程序下載:
仿真程序 僅供參考.7z
(102.56 KB, 下載次數: 45)
2022-7-18 03:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
問題解決:
問:樓主出來解釋下,為什么我存進去的退了之后就沒了呢,坑爹啊
答:都說了如果你每次夠編譯了第一句,I2C 就初始化一次,你肯定會把初始為0,如果你想保存,你擺第一句注釋了再 編譯。效果肯定不一樣!還有一點,我不保證我的程序是完全正確的,我貼文出來是給大家一個共同學習的平臺!大家都是一個求學習的同伴,說話語氣客氣點,我剛剛發現程序有問題,我改正后會再重復,請各位朋友注意更新! 哈哈,寫這個程序時是一天寫好,寫好了就想和大家分享,所以有錯漏,希望大家見諒見諒
單片機模擬源程序如下:
- /*****************************************************************************************************
- * 作者:Ken *
- * 日期:2012,8,19 *
- * 功能: *
- * 注意:1.由于是軟件仿真的原因,每次仿真時只有卡1在斷電后完全正確,其他卡斷電后可能會在輸入密碼時 *
- * 出現密碼錯誤。 *
- * 2.剛開始我想實現利用定時器實現操作倒計時,但多次試驗后都沒有正常工作,希望有興趣的朋友試試 *
- * 3.其實還有很多的功能可以實現,例如在取時任意取,操作倒計時等,大家有機會可以做做, *
- * 大家共同進步。
- * *
- * *
- ******************************************************************************************************/
- #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[i] != buf2[i] )
- {
- 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;
- }
- }
復制代碼 |