1、东北大学单片机课设实现一个密码锁的程序#include #include #include #include #define w_c_add XBYTE0x2070 /* 写命令字地址 */#define w_d_add XBYTE0x2071 /* 写数据地址 */#define r_s_add XBYTE0x2072 /* 读状态字地址 */ #define r_d_add XBYTE0x2073 /* 读数据地址 */#define COM XBYTE 0x2021 /* 命令/状态口的地址 */#define DAT XBYTE 0x2020 /* 数据口地址 */#define uc
2、har unsigned char#define uint unsigned int/*设定EEPROM*/sbit SDA=P12;sbit SCL=P15;bdata char com_data; /* 可位寻址片内数据存储器 */sbit mos_bit=com_data7;sbit low_bit=com_data0;unsigned char bdata status; /* 可位寻址片内数据存储器,允许位与字节混合访问 */sbit busy=status7; /*忙线的第7位*/unsigned char key;unsigned char bdata sta_8279;sbit
3、 du=sta_82797; /* 方式设置命令字 */uchar k=8,flag=0,x=0,tflag=0;uchar add,co,count=0; /co是电机转的格数 add显示地址寄存uint times=0;/输错密码次数uchar i=0,j=0,n=0,state;unsigned char code tab16=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71;/* 0F的字型编码*/unsigned char code number16=0,1,2,3,4,5
4、,6,7,8,9,10,11,12,13,14,15;/* 数字015*/ unsigned xdata hz116=0xA1,0xEF,0xc7,0xeb,0xCA,0xE4,0xc8,0xeb,0xc3,0xdc,0xc2,0xeb,0xa1,0xc3,0xA1,0xEF; /* 请 输 入 密 码 : */unsigned xdata hz216=0xc7,0xeb,0xd4,0xd9,0xb4,0xce,0xca,0xe4,0xc8,0xeb,0xc3,0xdc,0xc2,0xeb,0xa1,0xc3; /* 请 再 次 输 入 密 码 : */ unsigned char hz34=
5、0;/存放首次输入密码unsigned char hz44=0;/存放再次输入密码unsigned char code hz516=0xA1,0xF9,0xA1,0xF9,0xB4,0xED,0xCE,0xF3,0xc3,0xdc,0xc2,0xeb,0xA1,0xF9,0xA1,0xF9;/ 错误密码unsigned char code hz1216=0xA1,0xF9,0xA1,0xF9,0xd5,0xFd,0xc8,0xb7,0xc3,0xdc,0xc2,0xeb,0xA1,0xF9,0xA1,0xF9;/ 正确密码unsigned xdata hz1416=0xA1,0xEF,0xc7
6、,0xeb,0xCA,0xE4,0xc8,0xeb,0xd0,0xc2,0xc3,0xdc,0xc2,0xeb,0xA1,0xEF; /输入新密码unsigned char code hz1316=0xA1,0xF9,0xA1,0xF9,0xc9,0xe8,0xd6,0xc3,0xb3,0xc9,0xb9,0xa6,0xA1,0xF9,0xA1,0xF9;/ 设置成功unsigned char code hz616=0xD4,0xA4,0xD6,0xC3,0xc3,0xdc,0xc2,0xeb,0xa1,0xc3,0x20,0x20,0x20,0x20,0x20,0x20;/预置密码unsig
7、ned char code hz716=0xA1,0xEF,0xA1,0xEF,0xD0,0xBB,0xD0,0xBB,0xCA,0xB9,0xD3,0xC3,0xA1,0xEF,0xA1,0xEF;/谢谢使用unsigned char code hz816=0x20,0x20,0xA1,0xEF,0xA1,0xEF,0xD4,0xD9,0xBC,0xFB,0xA1,0xEF,0xA1,0xEF,0x20,0x20;/ 再见unsigned char code hz916=0xA1,0xEF,0xA1,0xEF,0xd3,0xc3,0xbb,0xa7,0xc4,0xfa,0xba,0xc3,0
8、xA1,0xEF,0xA1,0xEF;/ 菜单unsigned char code hz1016=0xA2,0xB1,0xD3,0xC3,0xBB,0xA7,0xD0,0xC5,0xCF,0xA2,0x20,0x20,0x20,0x20,0x20,0x20;/ 一、用户信息unsigned char code hz1116=0xA2,0xB2,0xD0,0xDE,0xB8,0xC4,0xc3,0xdc,0xc2,0xeb,0x20,0x20,0x20,0x20,0x20,0x20;/ 二、修改密码unsigned char code hz1516=0xA1,0xEF,0x31,0x31,0xc
9、4,0xea,0x30,0x37,0xd4,0xc2,0x30,0x39,0xc8,0xd5,0xA1,0xEF;/ 二、修改密码unsigned char code name016=0xd0,0xd5,0xC3,0xfb,0xa1,0xc3,0xce,0xd7,0xb5,0xc2,0xce,0xb0,0x20,0x20,0x20,0x20;/ 姓名:巫德伟unsigned char code name116=0xd0,0xd5,0xc3,0xfb,0xa1,0xc3,0xd3,0xc9,0xb9,0xda,0xd4,0xaa,0x20,0x20,0x20,0x20;/ 姓名:由冠元unsig
10、ned char code id016=0xd1,0xa7,0xba,0xc5,0xa1,0xc3,0x32,0x30,0x30,0x38,0x32,0x37,0x33,0x38,0x20,0x20;/ 学号:20082738unsigned char code id116=0xd1,0xa7,0xba,0xc5,0xa1,0xc3,0x32,0x30,0x30,0x38,0x32,0x37,0x35,0x32,0x20,0x20;/ 学号:20082752void input_code(void);void input_again(void);void wrong_code(void);vo
11、id close_window(void);void menu(void);void yuzhimima(void);void printmessage(void);void set_success();void lcd_init(void);void lcd_busy(void);void ini_8279(void);void check_8279(void) ;void clr_lcd(void);void correct_code(void);void input_newcode();void delay();/*main*/void main() TMOD=0x15; EA=1; E
12、X0=1; /按键中断打开 lcd_init(); /*lcd初始化*/ clr_lcd(); ini_8279(); /*8279初始化*/ state=0; /先进入输入密码界面 while(1) switch(state) case 0: if(hz30&hz31&hz32&hz33)&0x0ff)=0&n=0x00&key=0x09) hz3n=key; add=0x92; lcd_busy(); w_c_add=add; for(i=0;i=0x00&key=0x09) hz4n=key; add=0x92; lcd_busy(); w_c_add=add; for(i=0;i=n;
13、i+) lcd_busy(); w_d_add=hz4i+0x30; lcd_busy(); n=n+1; if(key=15|n=5) state=3; n=0; flag=0; EX0=1; break; case 3: EX0=0; if(hz30=hz40)&(hz31=hz41)&(hz32=hz42)&(hz33=hz43) /对比密码 /显示密码正确 clr_lcd(); correct_code(); delay(); delay(); delay(); delay(); delay(); state=4; else if(times=0&k=9) hz3n=key; add=
14、0x92; lcd_busy(); w_c_add=add; for(i=0;i=n;i+) lcd_busy(); w_d_add=hz3i+0x30; lcd_busy(); n+; if(key=15|n=5) state=10; n=0; flag=0; break; case 10: EX0=0; /关按键中断 clr_lcd(); input_again(); /再次用电机输入密码 TH0=0; TL0=0; TH1=-(50000/256); TL1=-(50000%256); TR0=1; TR1=1; ET1=1; while(x4); x=0; TR1=0;TR0=0;ET
15、1=0; state=12; flag=0; break; case 11: close_window(); delay(); delay(); delay(); delay(); delay(); clr_lcd(); state=1; flag=0; break; /对比密码 不正确跳到state10 正确显示成功返回state4 case 12: if(hz30=hz40)&(hz31=hz41)&(hz32=hz42)&(hz33=hz43) set_success(); delay(); delay(); delay(); delay(); state=4; else if(time
16、s2) clr_lcd(); wrong_code(); delay(); delay(); delay(); delay(); for(i=0;i4;i+) hz4i=0; state=10; else state=11; flag=1; break; default: break; /*子程序*/*输入密码*/void input_code() add=0x80; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz12*i; /* 写数据 ,
17、上半字节*/ /hz1请输入密码: lcd_busy(); w_d_add=hz12*i+1; /* 写数据 ,下半字节*/ / delay(); /*newcode*/void input_newcode() add=0x80; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz142*i; /* 写数据 ,上半字节*/ /hz1请输入密码: lcd_busy(); w_d_add=hz142*i+1; /* 写数据 ,下半字节*/ / del
18、ay(); /*再次输入密码*/void input_again(void) add=0x80; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz22*i; lcd_busy(); /* 写数据 ,上半字节*/ /hz1再次输入密码: w_d_add=hz22*i+1; /* 写数据 ,下半字节*/ /*密码错误*/void wrong_code(void) add=0x88; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_b
19、usy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz52*i; lcd_busy(); /* 写数据 ,上半字节*/ /hz5错误密码 w_d_add=hz52*i+1; /* 写数据 ,下半字节*/ times+;/*密码正确*/void correct_code(void) add=0x88; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz122*i; lc
20、d_busy(); /* 写数据 ,上半字节*/ /hz5错误密码 w_d_add=hz122*i+1; /* 写数据 ,下半字节*/ /*设置成功*/void set_success() add=0x98; /* 设置显示坐标,80H对应字符的第一行第一列 */ lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i8;i+) lcd_busy(); w_d_add=hz132*i; lcd_busy(); /* 写数据 ,上半字节*/ w_d_add=hz132*i+1; /* 写数据 ,下半字节*/ /*关闭显示*/void close_window(v
21、oid) times=0; add=0x80; lcd_busy(); w_c_add=add; for(i=0;i8;i+) lcd_busy(); w_d_add=hz72*i; lcd_busy(); /* 写数据 ,上半字节*/ /谢谢使用 w_d_add=hz72*i+1; /* 写数据 ,下半字节*/ add=0x90; lcd_busy(); w_c_add=add; for(i=0;i8;i+) lcd_busy(); w_d_add=hz82*i; lcd_busy(); /* 写数据 ,上半字节*/ /byebye w_d_add=hz82*i+1; /* 写数据 ,下半字节*/ /*界面显示*/void menu(void)/*界面*/ add=0x90; lcd_busy(); w_c_add=add; /* 写数据 */ for(i=0;i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1