标题:
单片机模拟LCD12864 Proteus仿真及源程序 学习MCU编程作品
[打印本页]
作者:
51黑ff
时间:
2016-9-9 01:21
标题:
单片机模拟LCD12864 Proteus仿真及源程序 学习MCU编程作品
今天写了一个关于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;
}
}
复制代码
作者:
jubaolun
时间:
2016-9-9 10:29
楼主,非常感谢你的分享,如果加个扫描钱的数字,再加个声音,那非常完美了。
作者:
电控11459886
时间:
2018-1-20 12:19
已删除
作者:
qumingfei
时间:
2018-8-4 15:56
喜欢,很好!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1