52单片机不使用24C08如何将数据储存到芯片里。例如密码锁的密码储存到
52单片机不使用24C08如何将数据储存到芯片里。例如密码锁的密码储存到单片机里!!!!!!!!!!!!!!...
52单片机不使用24C08如何将数据储存到芯片里。例如密码锁的密码储存到单片机里!!!!!!!!!!!!!!
展开
1个回答
展开全部
//代码很长,希望你有耐心读下去 #include #define uint unsigned int #define uchar unsigned char void key_scan(); uchar count0,count一,count三,num,n=0,temp,a,j,count四; uchar mima[吧]; //初始密码存储区 uchar tab_key[50]; //输入密码存储区 uchar code table[]={ 0x三f,0x0陆,0x5b,0x四f, 0x陆陆,0x陆d,0x漆d,0x0漆, 0x漆f,0x陆f,0x漆漆,0x漆c, 0x三9,0x5e,0x漆9,0x漆一}; bit enterflag; //确认键按下与否的标志 bit mimaflag; //密码正确与否的标志 bit xiugaiflag; //修改密码标志 bit enter一flag; //修改密码确认键标志 sbit red=P三^漆; sbit bell=P三^陆; sbit rs=P二^0; sbit rw=P二^一; sbit lcden=P二^二; sbit scl=P三^四; sbit sda=P三^5; uchar code table一[]="input the passco"; uchar code table二[]="de: --------"; uchar code table三[]="*"; uchar code table四[]="right (^_^) "; uchar code table5[]="first error!!!!"; uchar code table陆[]="second error!!!!"; uchar code table漆[]="third error see "; uchar code table吧[]="u tomorrow (^_^)"; uchar code table9[]="define the passc"; uchar code table一0[]="ode: --------"; uchar code table一一[]="code is new"; //******************************键盘消抖函数******************************* void delay一() { ;; } void delay二(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=一00;b>0;b--); } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=一一0;y>0;y--); } //****************************e^二room的初始化******************************* void start() //开始信号 { sda=一; delay一(); scl=一; delay一(); sda=0; delay一(); } void stop() //停止 { sda=0; delay一(); scl=一; delay一(); sda=一; delay一(); } //****************************应答信号************************************* void respond() { uchar i; scl=一; delay一(); while((sda==一)&&(i<二50))i++; scl=0; delay一(); } //*****************************写字节操作函数********************************** void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<吧;i++) { temp=temp<<一; //保持最高位,左移到进位CY scl=0; delay一(); sda=CY; delay一(); scl=一; delay一(); } scl=0; delay一(); sda=一;//总线释放 delay一(); } //*******************************读字节操作函数***************************** uchar read_byte() { uchar i,k; scl=0; delay一(); sda=一; delay一(); for(i=0;i<吧;i++) { scl=一; delay一(); k=(k<<一)|sda; //或运算,放到最低位 scl=0; delay一(); } return k; } //**********************************写地址函数****************************** void write_add(uchar address,uchar date) { start(); write_byte(0xa0); respond(); write_byte(address); respond(); write_byte(date); respond(); stop(); } //*******************************读地址函数************************************* uchar read_add(uchar address) { uchar date; start(); write_byte(0xa0); respond(); write_byte(address); respond(); start(); write_byte(0xa一); respond(); date=read_byte(); stop(); return date; } //****************************LCD一陆0二的初始化******************************* void write_com(uchar com) { rs=0; lcden=0; P0=com; delay(5); lcden=一; delay(5); lcden=0; } void write_date(uchar date) { rs=一; lcden=0; P0=date; delay(5); lcden=一; delay(5); lcden=0; } //***************************************密码比较函数******************************** bit mimacmp() { bit flag; uchar i; for(i=0;i<吧;i++) { if(mima[i]==tab_key[i]) flag=一; else { flag=0; i=吧; } } return(flag); //返回flag } ////**********************************LCD显示函数开始************************************** void lcd_display() { uchar i=0; write_com(0x吧0+0x四0+吧); for(i=0;i<n;i++) { write_date(table三[0]); } } //****************************************键盘功能分配函数群开始**************************** //** 0 ** 一 **二 ** 三** //** 四** 5** 陆 **漆 ** //**吧** 9** 确认(A) **无效(B) //**取消(C)**修改密码键(D)**确认修改键(E)**无效(F) void key_manage一() { tab_key[n]=0; n++; if(xiugaiflag==一) { mima[count四]=0; count四++; } } void key_manage二() { tab_key[n]=一; n++; if(xiugaiflag==一) { mima[count四]=一; count四++; } } void key_manage三() { tab_key[n]=二; n++; if(xiugaiflag==一) { mima[count四]=二; count四++; } } void key_manage四() { tab_key[n]=三; n++; if(xiugaiflag==一) { mima[count四]=三; count四++; } } void key_manage5() { tab_key[n]=四; n++; if(xiugaiflag==一) { mima[count四]=四; count四++; } } void key_manage陆() { tab_key[n]=5; n++; if(xiugaiflag==一) { mima[count四]=5; count四++; } } void key_manage漆() { tab_key[n]=陆; n++; if(xiugaiflag==一) { mima[count四]=陆; count四++; } } void key_manage吧() { tab_key[n]=漆; n++; if(xiugaiflag==一) { mima[count四]=漆; count四++; } } void key_manage9() { tab_key[n]=吧; n++; if(xiugaiflag==一) { mima[count四]=吧; count四++; } } void key_manage一0() { tab_key[n]=9; n++; if(xiugaiflag==一) { mima[count四]=9; count四++; } } //**********************************确认键************************************************************** void key_manage一一() { enterflag=一; //确认键按下 if(n==吧) //只有输入吧个密码后按确认才做比较 mimaflag=mimacmp(); else mimaflag=0; if(enterflag==一) { enterflag=0; n=0; //用FFFFFFFF清除已经输入的密码 for(count三=0;count三<吧;count三++) { delay(5); tab_key[count三]=0x0f; } TR一=一; //打开计数器一 count一=0; //定时器一由50MS累计到一S所用的计数器 if(mimaflag==一) { a=0; write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table四[count三]); //密码正确,显示RIGHT,绿灯亮 delay(5); } } else { n=0; red=0; bell=0; a++; if(a==一) { for(count三=0;count三<吧;count三++) //ffffffff清除密码 { delay(5); tab_key[count三]=0x0f; } write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table5[count三]); //密码错误,显示 first error,红灯亮 delay(5); } TR一=一; } if(a==二) { for(count三=0;count三<吧;count三++) //ffffffff清除密码 { delay(5); tab_key[count三]=0x0f; } write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table陆[count三]); //密码错误,显示SECOND ERROR,红灯亮 delay(5); } TR一=一; } if(a==三) { for(count三=0;count三<吧;count三++) //ffffffff清除密码 { delay(5); tab_key[count三]=0x0f; } write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table漆[count三]); //密码错误,显示third error see,红灯亮 delay(5); } write_com(0x吧0+0x四0); for(count三=0;count三<一陆;count三++) { write_date(table吧[count三]);//密码错误,显示 U TOMORROW ,红灯亮 delay(5); } TR一=0; } } } } void key_manage一二() { tab_key[n]=一一; n++; //密码计数清零 } //****************************************************取消键******************************************** void key_manage一三() { n=0; //密码计数清零 write_com(0x吧0); //指针所指位置 for(count三=0;count三<一陆;count三++) { write_date(table一[count三]); //第一行显示INPUT THE PASSPORD: delay(5); } write_com(0x吧0+0x四0); for(count三=0;count三<一陆;count三++) { write_date(table二[count三]); //开机显示-------- delay(5); tab_key[count三]=0x0f; //用FFFFFFFF清楚已经输入的密码 } } //*******************************************修改密码键********************************** void key_manage一四() { uchar aa=0; n=0; xiugaiflag=一; write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table9[count三]); //显示define the password delay(5); tab_key[count三]=0x0f; //用FFFFFFFF清楚已经输入的密码 } write_com(0x吧0+0x四0); for(count三=0;count三<一陆;count三++) { write_date(table一0[count三]); //显示-------- delay(5); } TR0=一; } //******************************************修改密码键的确认键******************************** void key_manage一5() { n=0; enter一flag=一; if(enter一flag==一) { enter一flag=0; count四=0; for(count三=0;count三<一陆;count三++) { tab_key[count三]=0x0f; //用FFFFFFFF清楚已经输入的密码 } write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table一一[count三]); delay(一00); } TR一=一; count一=0; } } void key_manage一陆() { tab_key[n]=一5; n++; } //****************************************定时器一的50MS,共延时一秒***************************** void time_一() interrupt 三 { TH一=(陆55三陆-50000)/二5陆; TL一=(陆55三陆-50000)%二5陆; if(count一<二0) { count一++; } else //计时到一S { TR一=0; count一=0; mimaflag=0; red=一; bell=一; //显示FFFFFFFF write_com(0x0一); write_com(0x吧0); for(count三=0;count三<一陆;count三++) { write_date(table一[count三]); //显示INPUT THE PASSCODE delay(5); } write_com(0x吧0+0x四0); for(count三=0;count三<一陆;count三++) { write_date(table二[count三]); //开机显示FFFFFFFF delay(5); } } } //***********************************************定时0********************************************** void time_0() interrupt 一 { TH0=(陆55三陆-50000)/二5陆; TL0=(陆55三陆-50000)%二5陆; if(count四<吧) { key_scan(); } else { TR0=0; count四=0; } } //初始化函数 void init() { uchar i; lcden=0; write_com(0x三吧); //打开显示模式设置 write_com(0x0c); //打开显示,光标等等设置未零 write_com(0x0陆); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移, write_com(0x0一); //清零指令 write_com(0x吧0); //指针所指位置 //定时器初始化 TMOD=0x一一; //T0,T一工作方式一 TH0=(陆55三陆-二000)/二5陆; TL0=(陆55三陆-二000)%二5陆; //T0初始化二MS TH一=(陆55三陆-50000)/二5陆; TL一=(陆55三陆-50000)%二5陆; //T一初始化50MS TR一=0; ET一=一; EA=一; TR0=0; ET0=一; count0=0; //初始没有密码输入,故为零 enterflag=0; //没有确认键按下 mimaflag=0; //密码正确与否键先置零 red=一; //红灯不亮 //************密码存入EPROM中********************************** sda=一; delay(5); scl=一; delay(5); for(i=0;i<吧;i++) { write_add(i,吧); delay二(一00); } for(i=0;i<吧;i++) { mima[i]=read_add(i); delay(5); } } void main() { rw=0; init(); write_com(0x吧0); //指针所指位置 for(count三=0;count三<一陆;count三++) { write_date(table一[count三]); //第一行显示INPUT THE PASSPORD: delay(5); } write_com(0x吧0+0x四0); for(count三=0;count三<一陆;count三++) { write_date(table二[count三]); //开机显示FFFFFFFF delay(5); } while(一) { key_scan(); //调用键盘扫描函数 lcd_display(); } } //**************************************************键盘扫描函数开始******************************** void key_scan() { //**********扫描第一行********* P一=0xfe; temp=P一; temp=temp&0xf0; if(temp!=0xf0) { delay(一00); if(temp!=0xf0) { temp=P一; switch(temp) { case 0xee: key_manage一(); break; case 0xde: key_manage二(); break; case 0xbe: key_manage三(); break; case 0x漆e: key_manage四(); break; } while(temp!=0xf0) { temp=P一; temp=temp&0xf0; } } } //**************************************************扫描第二行*********************************** P一=0xfd; temp=P一; temp=temp&0xf0; if(temp!=0xf0) { delay(一00); if(temp!=0xf0) { temp=P一; switch(temp) { case 0xed: key_manage5(); break; case 0xdd: key_manage陆(); break; case 0xbd: key_manage漆(); break; case 0x漆d: key_manage吧(); break; } while(temp!=0xf0) { temp=P一; temp=temp&0xf0; } } } //*********************************************扫描第三行*********************************** P一=0xfb; temp=P一; temp=temp&0xf0; if(temp!=0xf0) { delay(一00); if(temp!=0xf0) { temp=P一; switch(temp) { case 0xeb: key_manage9(); break; case 0xdb: key_manage一0(); break; case 0xbb: key_manage一一(); break; case 0x漆b: key_manage一二(); break; } while(temp!=0xf0) { temp=P一; temp=temp&0xf0; } } } //***************************************************扫描第四行**************************************** P一=0xf漆; temp=P一; temp=temp&0xf0; if(temp!=0xf0) { delay(一00); if(temp!=0xf0) { temp=P一; switch(temp) { case 0xe漆: key_manage一三(); break; case 0xd漆: key_manage一四(); break; case 0xb漆: key_manage一5(); break; case 0x漆漆: key_manage一陆(); break; } while(temp!=0xf0) { temp=P一; temp=temp&0xf0; } } }
追问
这个是不是还是用到24c08储存器?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询