1、程序/*标题:密码锁*日期:2011-12-24*作者: 郑海平占用单片机口线状态:占用了P0口和P30,P31,P35.*密码锁:实现密码的修改,密码的存储,掉电后密码不丢失,使用的24c02模块,根据液晶的提示便可进行操作,其中E键为确认键,输入密码后都要按确认键才能确认,其中密码的长度为八位,初始密码为 88888888超级密码为 12345678修改密码要输入初始密码或超级密码才能修改密码占用口线为P33,P34.其中P33接SCL,P34接SDA.*/#include#include#define uchar unsigned char#define uint unsigned in
2、t#define Ta 500/unsigned int#define OP_READ 0xa1 / 器件地址以及读取操作#define OP_WRITE 0xa0 / 器件地址以及写入操作#define MAX_ADDR 0x7f / AT24C02最大地址sbit SDA = P34; /24C02引脚的控制sbit SCL = P33;sbit LE=P36;sbit rs = P30; /LCD引脚的控制sbit rw = P31;sbit en = P35;uchar command0,data0,count=0;uchar v=0;bit f0=0; /f0,f1退出标志位参数bi
3、t f1=0;bit yy=0; /f0,f1退出标志位参数uchar savein=0;void write(uchar command0); uchar keyscan(void); uchar click_0=0; /定时器1定时中断次数 uchar click_1=0;bit time=0 ;/*定义定时器TO时间常数和方式控制字 */void init_sys(void) TMOD=0x01; TH0=0x3c; TL0=0xb0; /设置时间初值 TR0=0; EA=1; ET0=1; TR1=0; /开启中断,关闭定时器 / IP=0x08; /*延时程序*/void delay
4、(uint m) while(-m); void delayms(uchar ms) / 延时子程序 uchar i; while(ms-) for(i = 0; i 120; i+); uchar code Table=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;uchar code dis_code=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39; /0-9 写入到AT24C01的数据串uchar code dis_code1=0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x3
5、8; /1-8超级密码uchar yuanshimima=0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38; uchar shuzu08;uchar shuzu18;uchar xiugai08;uchar xiugai18; void start() / 开始位 SDA = 1; SCL = 1; _nop_(); _nop_(); SDA = 0; _nop_(); _nop_(); _nop_(); _nop_(); SCL = 0;void stop() / 停止位 SDA = 0; _nop_(); _nop_(); SCL = 1; _n
6、op_(); _nop_(); _nop_(); _nop_(); SDA = 1;uchar shin() / 从AT24Cxx移入数据到单片机 uchar i,read_data; for(i = 0; i 8; i+) SCL = 1; read_data = 1; read_data |= (uchar)SDA; SCL = 0; return(read_data);bit shout(uchar write_data) / 从单片机移出数据到AT24Cxx uchar i; bit ack_bit; for(i = 0; i 8; i+) / 循环移入8个位 SDA = (bit)(
7、write_data & 0x80); _nop_(); SCL = 1; _nop_(); _nop_(); SCL = 0; write_data = 1; SDA = 1; / 读取应答 _nop_(); _nop_(); SCL = 1; _nop_(); _nop_(); _nop_(); _nop_(); ack_bit = SDA; SCL = 0; return ack_bit; / 返回AT24Cxx应答位void write_byte(uchar addr, uchar write_data) / 在指定地址addr处写入数据write_data start(); shou
8、t(OP_WRITE); shout(addr); shout(write_data); stop(); delayms(10); / 写入周期void fill_byte(uchar fill_data) / 填充数据fill_data到EEPROM内 uchar i; for(i = 0; i MAX_ADDR; i+) write_byte(i, fill_data); uchar read_current() / 在当前地址读取 unsigned char read_data; start(); shout(OP_READ); read_data = shin(); stop(); r
9、eturn read_data;uchar read_random(uchar random_addr) / 在指定地址读取 start(); shout(OP_WRITE); shout(random_addr); return(read_current();/*LCD功能设置*/void lcd_set(void) command0=0x30; /功能设定,8位数据传送 write(command0); command0=0x01; /清除显示 write(command0); command0=0x06; /进入点设定,游标的移动方向,显示的移位 write(command0); com
10、mand0=0x0c; /显示状态,D=1,C=0,B=0 write(command0);/*清屏程序*/void lcd_clear(void) command0=0x01; write(command0);/*写指令程序*/void write(uchar command0) delay(100); rs=0; rw=0; P0=command0; en=1; _nop_(); _nop_(); en=0;/*写数据程序*/void read(uchar data0) delay(100); rs=1; rw=0; P0=data0; en=1; _nop_(); _nop_(); en
11、=0;/=字符显示=void display(uchar y, uchar x, uchar *p) switch (y) case 1:write(0x7f+x);break; /X=1,液晶第一行第一个 case 2:write(0x8f+x);break; /0x90+(x-1) case 3:write(0x87+x);break; case 4:write(0x97+x);break; default:break;while(*p) read(*p+); /*键扫子程序*/ uchar keyscan(void) uchar scan,tmp; P1=0xf0; /发全行0扫描码 i
12、f(P1&0xf0)!=0xf0) /若有键按下 delay(1000); / 延时去抖 if(P1&0xf0)!=0xf0) /延时再判键是否还按下 scan=0xfe; while(scan&0x10)!=0) /逐行扫描 P1=scan; /输出行扫描码 if(P1&0xf0)!=0xf0) /本行有键按下 tmp=(P1&0xf0)|0x0f; return (scan)|(tmp); /还回键值 else scan=(scan1)|0x01; /行扫描码左移一位 return (0); /无键按下,返回0/*密码锁菜单界面下的密码修改的密码存入24C02中*/ void save (void) uchar i=0; fill_byte(0xff); for(i=0;i8;i+) write_byte(i,xiugai1i);/写入修改后的密码 write_byte(8, savein); /写入是否修改密码的标志 /*密码锁菜单界面下的密码修改的密码*/ void changemima (void)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1