|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
51单片机初学密码锁代码
#define uint unsigned int |
#define uchar unsigned char |
uchar old1,old2,old3,old4,old5,old6; //原始密码000000 |
uchar new1,new2,new3,new4,new5,new6; //每次MCU采集到的密码输入 |
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入数码管显示的变量 |
bit allow,genggai,ok,wanbi,retry,close; //各个状态位 |
unsigned char code table[]= |
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, |
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40}; |
/*****************IIC芯片24C02存储器驱动程序************************************/ |
/////////24C02读写驱动程序//////////////////// |
void delay1(unsigned int m) |
for(n=0;n | } | | void init() //24c02初始化子程序 | { | scl=1; | nop(); | sda=1; | nop(); | } | | void start() //启动I2C总线 | { | sda=1; | nop(); | scl=1; | nop(); | sda=0; | nop(); | scl=0; | nop(); | } | | void stop() //停止I2C总线 | { | sda=0; | nop(); | scl=1; | nop(); | sda=1; | nop(); | } | | void writebyte(unsigned char j) //写一个字节 | { | unsigned char i,temp; | temp=j; | for (i=0;i<8;i++) | { | temp=temp<<1; | scl=0; | nop(); | sda=CY; //temp左移时,移出的值放入了CY中 | nop(); | scl=1; //待sda线上的数据稳定后,将scl拉高 | nop(); | } | scl=0; | nop(); | sda=1; | nop(); | } | | unsigned char readbyte() //读一个字节 | { | unsigned char i,j,k=0; | scl=0; nop(); sda=1; | for (i=0;i<8;i++) | { | nop(); scl=1; nop(); | if(sda==1) | j=1; | else | j=0; | k=(k<<1) | j; | scl=0; | } | nop(); | return(k); | } | | void clock() //I2C总线时钟 | { | unsigned char i=0; | scl=1; | nop(); | while((sda==1)&&(i<255)) | i++; | scl=0; | nop(); | } | | ////////从24c02的地址address中读取一个字节数据///// | unsigned char read24c02(unsigned char address) | { | unsigned char i; | start(); | writebyte(0xa0); | clock(); | writebyte(address); | clock(); | start(); | writebyte(0xa1); | clock(); | i=readbyte(); | stop(); | delay1(100); | return(i); | } | | //////向24c02的address地址中写入一字节数据info///// | void write24c02(unsigned char address,unsigned char info) | { | start(); | writebyte(0xa0); | clock(); | writebyte(address); | clock(); | writebyte(info); | clock(); | stop(); | delay1(5000); //这个延时一定要足够长,否则会出错。因为24c02在从sda上取得数据后,还需要一定时间的烧录过程。 | } | /****************************密码锁程序模块********************************************************/ | | void delay(unsigned char i) | { | uchar j,k; | for(j=i;j>0;j--) | for(k=125;k>0;k--); | } | | void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) | { | dula=0; | P0=table[a]; | dula=1; | dula=0; | | wela=0; | P0=0xfe; | wela=1; | wela=0; | delay(5); | | P0=table; | dula=1; | dula=0; | | P0=0xfd; | wela=1; | wela=0; | delay(5); | | P0=table[c]; | dula=1; | dula=0; | | P0=0xfb; | wela=1; | wela=0; | delay(5); | | P0=table[d]; | dula=1; | dula=0; | | P0=0xf7; | wela=1; | wela=0; | delay(5); | | P0=table[e]; | dula=1; | dula=0; | | P0=0xef; | wela=1; | wela=0; | delay(5); | | P0=table[f]; | dula=1; | dula=0; | | P0=0xdf; | wela=1; | wela=0; | delay(5); | } | | | void keyscan() | { | { | P3=0xfe; | temp=P3; | temp=temp&0xf0; | if(temp!=0xf0) | { | delay(10); | if(temp!=0xf0) | { | temp=P3; | switch(temp) | { | case 0xee: | key=0; | wei++; | break; | | case 0xde: | key=1; | wei++; | break; | | case 0xbe: | key=2; | wei++; | break; | | case 0x7e: | key=3; | wei++; | break; | } | while(temp!=0xf0) | { | temp=P3; | temp=temp&0xf0; | beep=0; | } | beep=1; | } | } | P3=0xfd; | temp=P3; | temp=temp&0xf0; | if(temp!=0xf0) | { | delay(10); | if(temp!=0xf0) | { | temp=P3; | switch(temp) | { | case 0xed: | key=4; | wei++; | break; | | case 0xdd: | key=5; | wei++; | break; | | case 0xbd: | key=6; | wei++; | break; | | case 0x7d: | key=7; | wei++; | break; | } | while(temp!=0xf0) | { | temp=P3; | temp=temp&0xf0; | beep=0; | } | beep=1; | } | } | P3=0xfb; | temp=P3; | temp=temp&0xf0; | if(temp!=0xf0) | { | delay(10); | if(temp!=0xf0) | { | temp=P3; | switch(temp) | { | case 0xeb: | key=8; | wei++; | break; | | case 0xdb: | key=9; | wei++; | break; | | case 0xbb: | genggai=1; | wei=0; | break; | | case 0x7b: | if(allow) | ok=1; | break; | } | while(temp!=0xf0) | { | temp=P3; | temp=temp&0xf0; | beep=0; | } | beep=1; | } | } | P3=0xf7; | temp=P3; | temp=temp&0xf0; | if(temp!=0xf0) | { | delay(10); | if(temp!=0xf0) | { | temp=P3; | switch(temp) | { | case 0xe7: | retry=1; | break; | | case 0xd7: | close=1; | break; | } | while(temp!=0xf0) | { | temp=P3; | temp=temp&0xf0; | beep=0; | } | beep=1; | } | } | } | } | | void shumima() //对按键采集来的数据进行分配 | { | if(!wanbi) | { | switch(wei) | { | case 1:new1=key; | if(!allow) a=17; | else a=key; break; | case 2:new2=key; | if(a==17) b=17; | else b=key; break; | case 3:new3=key; | if(a==17) c=17; | else c=key; break; | case 4:new4=key; | if(a==17) d=17; | else d=key; break; | case 5:new5=key; | if(a==17) e=17; | else e=key; break; | case 6:new6=key; | if(a==17) f=17; | else f=key; | |
|
|