今天写了一个关于12864类似于的程序,现在贴出来大家共同学习!
上次在论坛里也看过类似的一个程序,他没有用上E2PROm,这一次我用上了!也是一个山寨的作品吧,哈哈!
程序里实现了修改密码、取、存、和查询的功能。在仿真上,出现一些小问题,文中有提过,现在就不多说了。程序虽然不是很好,不过也适合我们初学者学习学者,哈哈!!
仿真及程序下载:
仿真程序 仅供参考.7z
(102.56 KB, 下载次数: 45)
问题解决:
问:楼主出来解释下,为什么我存进去的退了之后就没了呢,坑爹啊
答:都说了如果你每次够编译了第一句,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;
- }
- }
复制代码 |