资源目录
压缩包内文档预览:
编号:550723
类型:共享资源
大小:872.56KB
格式:RAR
上传时间:2015-12-06
上传人:QQ28****1120
认证信息
个人认证
孙**(实名认证)
辽宁
IP属地:辽宁
6
积分
- 关 键 词:
-
毕业设计论文
- 资源描述:
-
0116、八位数字密码锁设计资料,毕业设计论文
- 内容简介:
-
Skyle整理--有不对之处请来信指正 数字温度传感器DS1820(DS18B20)的应用 一 单线数字温度计DSl820介绍 DSl820数字温度计提供9位(二进制)温度读数指示器件的温度信息经过单线接口送 入DSl820或从DSl820送出因此从主机CPU到DSl820仅需一条线(和地线) DSl820的电源可以由数据线本身提供而不需要外部电源因为每一个DSl820在出厂时已经给定了唯一的序号因此任意多个DSl820可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件DSl820的测量范围从-55到+125增量值为0.5可在l s(典型值)内把温度变换成数字 每一个DSl820包括一个唯一的64位长的序号该序号值存放在DSl820内部的ROM(只读存贮器)中开始8位是产品类型编码(DSl820编码均为10H)接着的48位是每个器件唯一的序号最后8位是前面56位的CRC(循环冗余校验)码DSl820中还有用于贮 存测得的温度值的两个8位存贮器RAM编号为0号和1号1号存贮器存放温度值的符号如果温度为负( )则1号存贮器8位全为1否则全为0 0号存贮器用于存放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-550 125 ) DSl820的引脚如图2 26l所示每只D51820都可以设置成两种供电方式即数据总线供电方式和外部供电方式采取数据总线供电方式可以节省一根导线但完成温度测量的时间较长采取外部供电方式则多用一根导线但测量速度较快 温度计算 1 Ds1820用9位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如 00AAH为+85 ,0032H为25 FF92H为55 2 Ds18b20用12位存贮温值度最高位为符号位下图为18b20的温度存储方式负温度S=1正温度S=0如 0550H为+85 0191H为25.0625 ,FC90H为-55 nts 二DSl820工作过程及时序 DSl820工作过程中的协议如下 初始化RoM操作命令存储器操作命令处理数据 1初始化 单总线上的所有处理均从初始化开始 2 ROM操作品令 总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如 指令 代码 Read ROM(读ROM) 33H Match ROM(匹配ROM) 55H Skip ROM(跳过ROM CCH Search ROM(搜索ROM) F0H Alarm search(告警搜索) ECH 3存储器操作命令 指令 代码 Write Scratchpad(写暂存存储器) 4EH Read Scratchpad(读暂存存储器) BEH Copy Scratchpad(复制暂存存储器) 48H Convert Temperature(温度变换) 44H Recall EPROM(重新调出) B8H Read Power supply(读电源) B4H 4时 序 主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化 时序见图2.25-2主机总线to时刻发送一复位脉冲(最短为480us的低电平信号)接着在tl时刻释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us接着DS1820在t2时刻发出存在脉冲(低电平持续60-240 us)如图中虚线所示 以下子程序在MCS51仿真机上通过其晶振为12M.初始化子程序 RESET ntsPUSH B ;保存B寄存器 PUSH A 保存A寄存器 MOV A,#4 ;设置循环次数 CLR P1.0 ;发出复位脉冲 MOV B,#250 ;计数250次 DJNZ B,$ ;保持低电平500us SETB Pl.0 ;释放总线 MOV B,#6 ;设置时间常数 CLR C ;清存在信号标志 WAITL: JB Pl.0,WH ;若总线释放跳出循环 DJNZ B,WAITL ;总线低等待 DJNZ ACC,WAITL;释放总线等待一段时间 SJMP SHORT WH: MOV B,#111 WH1: ORL C,P1.0 DJNZ B,WH1 ;存在时间等待 SHORT: POP A POP B RET (2)写时间隙 当主机总线t o时刻从高拉至低电平时就产生写时间隙见图2 25 3图2 254从to时刻开始15us之内应将所需写的位送到总线上DSl820在t后15-60us间对总线采样若低电平写入的位是0见图2 25 3若高电平写入的位是1见图2 25 4连续写2位间的间隙应大于1us 写位子程序(待写位的内容在C中) WRBIT: PUSH B ;保存B MOV B,#28 ;设置时间常数 CLR P1.0 ;写开始 NOP ;1us NOP ;1us NOP ;1us NOP ;1us N0P ;1us MOVPl.0,C ;C内容到总线 WDLT: DJNZ B,WDLT;等待56Us POP B ntsSETB Pl.0 ;释放总线 RET ;返回 写字节子程序(待写内容在A中): WRBYTB: PUSH B :保存B MOV B #8H ;设置写位个数 WLOP: RRC A ;把写的位放到C ACALL WRBIT ;调写 1位子程序 DJNZ B WLOP ;8位全写完? POP B RET (3)读时间隙 见图2 25 5主机总线to时刻从高拉至低电平时总线只须保持低电平l 7ts之后在t1时刻将总线拉高产生读时间隙读时间隙在t1时刻后t 2时刻前有效t z距to为15捍s也就是说t z时刻前主机必须完成读位并在t o后的60尸s一120 fzs内释放总线 读位子程序(读得的位到C中) RDBIT: PUSH B ;保存B PUSH A ;保存A MOV B,#23 ;设置时间常数 CLR P1.0 ;读开始图2 25 5的t0时刻 NOP ;1us NOP ;1us NOP ;1us NOP ;1us SETB Pl.0 ;释放总线 MOV A,P1 ;P1口读到A MOV C,EOH ;P1.0内容C NOP ;1us NOP ;1us NOP ;1us NOP ;1us RDDLT: DJNZ B,RDDLT ;等待46us SETB P1.0 POP A ntsPOP B RET 读字节子程序(读到内容放到A中) RDBYTE: PUSH B ;保存B RLOP MOV B,#8H ;设置读位数 ACALL RDBIT ;调读1位子程序 RRC A ;把读到位在C中并依次送给A DJNZ B,RLOP ;8位读完? POP B ;恢复B RET 三多路测量 每一片DSl820在其ROM中都存有其唯一的48位序列号在出厂前已写入片内ROM 中主机在进入操作程序前必须逐一接入1820用读ROM(33H)命令将该l 820的序列号读出并登录 当主机需要对众多在线1820的某一个进行操作时首先要发出匹配ROM命令(55H)紧接着主机提供64位序列(包括该1820的48位序列号)之后的操作就是针对该1820的而所谓跳过ROM命令即为之后的操作是对所有1820的框图中先有跳过ROM即是启动所有1820进行温度变换之后通过匹配ROM再逐一地读回每个1820的温度数据 在1820组成的测温系统中主机在发出跳过ROM命令之后再发出统一的温度转换启动码44H就可以实现所有1820的统一转换再经过1s后就可以用很少的时间去逐一读取这种方式使其T值往往小于传统方式由于采取公用的放大电路和A D转换器只能逐一转换显然通道数越多这种省时效应就越明显 四实际应用 1 ds1820序列号获得 ;|-| ;| 读出ds1820序列号应用程序,P1.6接ds1820 | ;|-| ORG 0000H AJMP MAIN ORG 0020H MAIN: MOV SP,#60H CLR EA ;使用ds1820一定要禁止任何中断产生 LCALL INT ;初始化ds1820 MOV A,#33H nts LCALL WRITE ;送入读ds1820的ROM命令 LCALL READ ;开始读出当前ds1820序列号 MOV 40H,A LCALL READ MOV 41H,A LCALL READ MOV 42H,A LCALL READ MOV 43H,A LCALL READ MOV 44H,A LCALL READ MOV 45H,A LCALL READ MOV 46H,A LCALL READ MOV 47H,A SETB EA SJMP $ INT: ;初始化ds1820子程序 CLR EA L0:CLR P1.6 ;ds1820总线为低复位电平 MOV R2,#200 L1:CLR P1.6 DJNZ R2,L1 ;总线复位电平保持400us SETB P1.6 ;释放ds1820总线 MOV R2,#30 L4:DJNZ R2,L4 ;释放ds1820总线保持60us CLR C ;清存在信号 ORL C,P1.6 JC L0 ;存在吗?不存在则重新来 MOV R6,#80 L5:ORL C,P1.6 JC L3 DJNZ R6,L5 SJMP L0 L3:MOV R2,#240 L2:DJNZ R2,L2 RET WRITE: ;向ds1820写操作命令子程序 CLR EA MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit nts WR1:SETB P1.6 MOV R4,#8 RRC A ;把一个字节data(A)分成8个bit环移给 C CLR P1.6 ;开始写入ds1820总线要处于复位(低)状态 WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us MOV P1.6,C ;写入一个bit MOV R4,#20 WR3:DJNZ R4,WR3 ;等待40us DJNZ R3,WR1 ;写入下一个bit SETB P1.6 ;重新释放ds1820总线 RET READ: CLR EA MOV R6,#8 ;连续读8个bit RE1:CLR P1.6 ;读前总线保持为低 MOV R4,#4 NOP SETB P1.6 ;开始读总线释放 RE2:DJNZ R4,RE2 ;持续8us MOV C,P1.6 ;从ds1820总线读得一个bit RRC A ;把读得的位值环移给 A MOV R5,#30 RE3:DJNZ R5,RE3 ;持续60us DJNZ R6,RE1 ;读下一个bit SETB P1.6 ;重新释放ds1820总线 RET END 2温度转换和读取 ;|-| ;| 获取单个ds1820转化的温度值的应用程序,P1.6接ds1820 | ;|-| ORG 0000H AJMP MAIN ORG 0020H MAIN: MOV SP,#60H LCALL GET_TEMP SJMP $ GET_TEMP: CLR PSW.4 nts SETB PSW.3 ;设置工作寄存器当前所在的区域 CLR EA ;使用ds1820一定要禁止任何中断产生 LCALL INT ;调用初使化子程序 MOV A,#0CCH LCALL WRITE ;送入跳过ROM命令 MOV A, #44H LCALL WRITE ;送入温度转换命令 LCALL INT ;温度转换完全,再次初使化ds1820 MOV A,#0CCH LCALL WRITE ;送入跳过ROM命令 MOV A,#0BEH LCALL WRITE ;送入读温度暂存器命令 LCALL READ MOV R7,A ;读出温度值低字节存入R7 LCALL READ MOV R6,A ;读出谩度值高字节存入R6 SETB EA RET INT: ;初始化ds1820子程序 CLR EA L0:CLR P1.6 ;ds1820总线为低复位电平 MOV R2,#200 L1:CLR P1.6 DJNZ R2,L1 ;总线复位电平保持400us SETB P1.6 ;释放ds1820总线 MOV R2,#30 L4:DJNZ R2,L4 ;释放ds1820总线保持60us CLR C ;清存在信号 ORL C,P1.6 JC L0 ;存在吗?不存在则重新来 MOV R6,#80 L5:ORL C,P1.6 JC L3 DJNZ R6,L5 SJMP L0 L3:MOV R2,#240 L2:DJNZ R2,L2 RET WRITE: ;向ds1820写操作命令子程序 CLR EA MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit WR1:SETB P1.6 nts MOV R4,#8 RRC A ;把一个字节data(A)分成8个bit环移给 C CLR P1.6 ;开始写入ds1820总线要处于复位(低)状态 WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us MOV P1.6,C ;写入一个bit MOV R4,#20 WR3:DJNZ R4,WR3 ;等待40us DJNZ R3,WR1 ;写入下一个bit SETB P1.6 ;重新释放ds1820总线 RET READ: CLR EA MOV R6,#8 ;连续读8个bit RE1:CLR P1.6 ;读前总线保持为低 MOV R4,#4 NOP SETB P1.6 ;开始读总线释放 RE2:DJNZ R4,RE2 ;持续8us MOV C,P1.6 ;从ds1820总线读得一个bit RRC A ;把读得的位值环移给 A MOV R5,#30 RE3:DJNZ R5,RE3 ;持续60us DJNZ R6,RE1 ;读下一个bit SETB P1.6 ;重新释放ds1820总线 RET END Skyle整理--有不对之处请来信指正 nts#include#include#define uchar unsigned char#define uint unsigned intuchar code xuhao28= 0x28 ,0xC5 ,0x39, 0xE1, 0x00 ,0x00 ,0x00 ,0xDB , 0x28 ,0xF0 ,0x2D ,0xE1 ,0x00 ,0x00 ,0x00, 0xBE , /18b20的序号代码,通过另一个软件读出来的; #define read_r 0x33 /读代码 /#define tg_r 0xcc /跳过 /主机检测到18B20的存在时 /#define pipei_r 0x55/匹配 / 所要发出的命令 /#define sousuo_r 0xf0/搜索代码/ /#define gj_r 0xec/告警 /#define start 0x44 /开始温度变换#define xie_r 0x4e/改写ROM#define du_r 0xbe/读温度值sbit DQ=P10;void delay(uchar n) /延时uchar i;for(i=0;ij;shuju=shuju&0x01;write_bit(shuju);delay(2);void chuan_bit(uchar i)/传字节/DQ=0;if(i=1) DQ=1;delay(6);DQ=1;void write(uchar xie)/写数据/uchar i,shuju ;for(i=0;ii;shuju=shuju&0x01;chuan_bit(shuju);delay(2);void main()uchar fuhaowei,wenduzhi,l;/温度值TMOD=0X20 ;TH1=0XFD;TH1=0XFD; /定时益处SCON=0XD8; /11011000PCON=0X00;TR1=1;nts reset();write(tg_r); /发出跳过ROM的命令write(start);/开始转换温度for(l=0;l4; */wenduzhi=(fuhaowei&0x07)4);SBUF=wenduzhi;while(TI=0);TI=0;/P0=wenduzhi; /实际的温度值了/P2=fuhaowei; /判断是正温读值还负温度值;1是负温度。0是正温度 while(1);nts#include #include #include #define uchar unsigned char #define uint unsigned int#define data_IO P2#define Mng 0x80 /用于检测LCM状态字中的Busy标识sbit rs=P30;/指令和数据寄存器 1是数据, 0是指令sbit rw=P31;/读写控制,1读 0写sbit e=P32; /片选信号sbit p=P27;sbit deng=P33;/响音乐的端口sbit md=P34;/修改密码时的灯void WriteDataLCM(unsigned char WDLCM); /写数据void WriteCommandLCM(unsigned char WCLCM,BuysC); /写命令字unsigned char ReadDataLCM(void); /读数据uchar busy(void); uchar pwflag;/密码是否正确的标志位uchar count;/uchar gg=0 ;/只有输入正确的密码才能修改密码uchar cs=3 ;/输入密码的错误次数uchar m=1,1,1,1,1,1,1,1; /初始密码static uchar mbuf8;/输入的密码位数char d32= ,I,M,P,O,R,T, ,C,I,P,H,E,R,:, , , , , ,_,_,_,_,_,_,_,_, , , , ;/输入密码code char ks32=C,O,N,G,R,A,T,U,L,A,T,E, ,Y,O,U, ,O,P,E,N,I,N,G, , ,L,O,C,K,!, ;/开锁code char cw32= ,C,I,P,H,E,R, , ,E,R,R,O,R, , , ;/错误 code char xc32= , ,A,M,E,N,D, ,S,U,C,C,E,E,D, , , , , , ,!,!,!,!,!,!, , , , , ;/修改成功 code char xg32= ,A,M,E,N,D, , ,C,I,P,H,E,R,:, , , , , , ,_,_,_,_,_,_,_, , , , ;/修改密码*/void yanshi(uint n)/延时函数/uint i;for(i=0;in;i+);ntsvoid delay(uint n)/延时函数/uint i,j;for(i=0;i1000;i+)for(j=0;jn;j+)uchar busy(void) /读状态/data_IO=0xff;rs=0; /写指令 /rw=1; /表示读状态 / 三个的状态表示 /e=0;e=0;e=1; /下降延/ / 判忙状态 /while(data_IO & Mng); /return(data_IO); void xiezl(uchar shuju) /*写指令*/busy();/*yanshi(6500);*/data_IO=shuju;rs=0; /写指令 /rw=0; /表示写状态 / 三个的状态表示 /e=1; /下降延/ / 写指令 /e=0; / /void w_dat(uint n)/写数据/busy(); /*yanshi(6500) ;*/data_IO=n;rs=1; /写数据 /rw=0; /表示写状态 / 三个的状态表示 /e=1; /下降延/ /写数据 /e=0; / / return;void xianshi(uchar js) /显示函数/uchar h,v;xiezl(0x01); /清屏显示yanshi(2000) ;xiezl(0x80); / DDRAM地址的设置for(h=0;h16;h+)w_dat(jsh); /n表示有写几位数据yanshi(100) ;nts xiezl(0xc0);/换行for(v=(16);v32;v+)w_dat(jsv); /n表示有写几位数据yanshi(100) ;void chushihua(void)/*液晶模块初始化*/ uchar i;rs=0; /写指令rw=0; /表示写状态e=0; /使能for(i=0;i3;i+)xiezl(0x38); /功能设置,8位,一行显示,5*7点阵yanshi(1000);xiezl(0x38); /两行显示xiezl(0x0f); /显示开关控制位xiezl(0x18); /移位控制,光标和显示一起左移 xiezl(0x06); /设置输入模式xiezl(0x01); /清屏显示xiezl(0x80); / DDRAM地址的设置bit pwcmp(void)bit flag;uchar i;for (i=0;i8;i+)if (mi=mbufi) flag = 1; /*密码正确*/else flag = 0; i=8; /*密码错误*/return(flag);void gb(void)/转移光标 uchar c;xiezl(0xc0);/换行yanshi(3000) ;for(c=0;c4;c+)w_dat( );/n表示有写几位数据yanshi(2000) ; uchar getkey(void)/得到键值 uchar h,l,k;while(P1!=0x0f)h=P1&0x0f;P1=0xf0;l=P1&0xf0;k=h|l;nts return(k);void diaoyong(uchar i)/调用各键的函数/输入密码 uchar lq;switch(i)case 0x7e: if (count8) mbufcount=1; count+; w_dat(1); break; / 01111110 1case 0xbe: if (count8) mbufcount=2; count+; w_dat(2); break; / 10111110 2case 0xde: if (count8) mbufcount=3; count+; w_dat(3); break; / 11011110 3case 0xee: if (count8) mbufcount=4; count+; w_dat(4); break; / 11101110 4case 0x7d: if (count8) mbufcount=5; count+; w_dat(5); break; / 01111101 5case 0xbd: if (count8) mbufcount=6; count+; w_dat(6); break; / 10111101 6case 0xdd: if (count8) mbufcount=7; count+; w_dat(7); break; / 11011101 7case 0xed: if (count8) mbufcount=8; count+; w_dat(8); break; / 11101101 8case 0x7b: if (count8) mbufcount=9; count+; w_dat(9); break; / 01111011 9case 0xbb: if (count8) mbufcount=0; count+; w_dat(0); break; / 10111011 0case 0xdb: if (count=8) pwflag = pwcmp(); else pwflag = 0;/ 只有输入8个密码后按确认键才作密码比较if(pwflag) deng=1; xianshi(ks);gg=1; else cs-;deng=0; xianshi(cw); delay(200); xianshi(d);gb();count = 0; break; / 11011011 a case 0xeb: count = 0;deng=0; xianshi(d); gb();gg=0; /*取消键*/break; / 11101011 b case 0x77: if(gg=1) count=0;xianshi(xg); gb(); /修该密码break; / 01110111 ccase 0xb7: if(count=8)&(gg=1) count=0;for (lq=0;lq8;lq+) mlq=mbuflq; yanshi(10000); md=0; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;/保存密码break; / 10110111 d/*case 0xd7: srjm=e; break; / 11010111 ecase 0xe7: srjm=f; break; / 11100111 f */default: break; void main(void)uchar key;ntschushihua();xianshi(d);/显示函数gb(); /移光标到第二行第六位while(cs)P1=0x0f;if(P1!=0x0f) yanshi(20); key=getkey(); md=1;diaoyong(key); yanshi(20000);md=0;while(1);nts#include #include #include #define uchar unsigned char #define uint unsigned int#define data_IO P2#define Mng 0x80 /用于检测LCM状态字中的Busy标识sbit rs=P30;/指令和数据寄存器 1是数据, 0是指令sbit rw=P31;/读写控制,1读 0写sbit e=P32; /片选信号sbit p=P27;sbit deng=P37;/ 修改密码时的灯sbit md=P34;/响音乐的端口void WriteDataLCM(unsigned char WDLCM); /写数据void WriteCommandLCM(unsigned char WCLCM,BuysC); /写命令字unsigned char ReadDataLCM(void); /读数据uchar busy(void); uchar pwflag;/密码是否正确的标志位uchar count;/uchar gg=0 ;/只有输入正确的密码才能修改密码uchar cs=3 ;/输入密码的错误次数uchar m=1,1,1,1,1,1,1,1; /初始密码static uchar mbuf8;/输入的密码位数char d32= ,I,M,P,O,R,T, ,C,I,P,H,E,R,:, , , , , ,_,_,_,_,_,_,_,_, , , , ;/输入密码code char ks32=C,O,N,G,R,A,T,U,L,A,T,E, ,Y,O,U, ,O,P,E,N,I,N,G, , ,L,O,C,K,!, ;/开锁code char cw32= ,C,I,P,H,E,R, , ,E,R,R,O,R, , , ;/错误 code char xc32= , ,A,M,E,N,D, ,S,U,C,C,E,E,D, , , , , , ,!,!,!,!,!,!, , , , , ;/修改成功 code char xg32= ,A,M,E,N,D, , ,C,I,P,H,E,R,:, , , , , , ,_,_,_,_,_,_,_, , , , ;/修改密码*/void yanshi(uint n)/延时函数/uint i;for(i=0;in;i+);ntsvoid delay(uint n)/延时函数/uint i,j;for(i=0;i1000;i+)for(j=0;jn;j+)uchar busy(void) /读状态/data_IO=0xff;rs=0; /写指令 /rw=1; /表示读状态 / 三个的状态表示 /e=0;e=0;e=1; /下降延/ / 判忙状态 /while(data_IO & Mng); /return(data_IO); void xiezl(uchar shuju) /*写指令*/busy();/*yanshi(6500);*/data_IO=shuju;rs=0; /写指令 /rw=0; /表示写状态 / 三个的状态表示 /e=1; /下降延/ / 写指令 /e=0; / /void w_dat(uint n)/写数据/busy(); /*yanshi(6500) ;*/data_IO=n;rs=1; /写数据 /rw=0; /表示写状态 / 三个的状态表示 /e=1; /下降延/ /写数据 /e=0; / / return;void xianshi(uchar js) /显示函数/uchar h,v;xiezl(0x01); /清屏显示yanshi(2000) ;xiezl(0x80); / DDRAM地址的设置for(h=0;h16;h+)w_dat(jsh); /n表示有写几位数据yanshi(100) ;nts xiezl(0xc0);/换行for(v=(16);v32;v+)w_dat(jsv); /n表示有写几位数据yanshi(100) ;void chushihua(void)/*液晶模块初始化*/ uchar i;rs=0; /写指令rw=0; /表示写状态e=0; /使能for(i=0;i3;i+)xiezl(0x38); /功能设置,8位,一行显示,5*7点阵yanshi(1000);xiezl(0x38); /两行显示xiezl(0x0f); /显示开关控制位xiezl(0x18); /移位控制,光标和显示一起左移 xiezl(0x06); /设置输入模式xiezl(0x01); /清屏显示xiezl(0x80); / DDRAM地址的设置bit pwcmp(void)bit flag;uchar i;for (i=0;i8;i+)if (mi=mbufi) flag = 1; /*密码正确*/else flag = 0; i=8; /*密码错误*/return(flag);void gb(void)/转移光标 uchar c;xiezl(0xc0);/换行yanshi(3000) ;for(c=0;c4;c+)w_dat( );/n表示有写几位数据yanshi(2000) ; uchar getkey(void)/得到键值 uchar h,l,k;while(P1!=0x0f)h=P1&0x0f;P1=0xf0;l=P1&0xf0;k=h|l;nts return(k);void diaoyong(uchar i)/调用各键的函数/输入密码 uchar lq;switch(i)case 0x7e: if (count8) mbufcount=1; count+; w_dat(*); break; / 01111110 1case 0xbe: if (count8) mbufcount=2; count+; w_dat(*); break; / 10111110 2case 0xde: if (count8) mbufcount=3; count+; w_dat(*); break; / 11011110 3case 0xee: if (count8) mbufcount=4; count+; w_dat(*); break; / 11101110 4case 0x7d: if (count8) mbufcount=5; count+; w_dat(*); break; / 01111101 5case 0xbd: if (count8) mbufcount=6; count+; w_dat(*); break; / 10111101 6case 0xdd: if (count8) mbufcount=7; count+; w_dat(*); break; / 11011101 7case 0xed: if (count8) mbufcount=8; count+; w_dat(*); break; / 11101101 8case 0x7b: if (count8) mbufcount=9; count+; w_dat(*); break; / 01111011 9case 0xbb: if (count8) mbufcount=0; count+; w_dat(*); break; / 10111011 0case 0xdb: if (count=8) pwflag = pwcmp(); else pwflag = 0;/ 只有输入8个密码后按确认键才作密码比较if(pwflag) deng=1; xianshi(ks);gg=1; else cs-;deng=0; xianshi(cw); delay(200); xianshi(d);gb();count = 0; break; / 11011011 a case 0xeb: count = 0;deng=0; xianshi(d); gb();gg=0; /*取消键*/break; / 11101011 b case 0x77: if(gg=1) count=0;xianshi(xg); gb(); /修该密码break; / 01110111 ccase 0xb7: if(count=8)&(gg=1) count=0;for (lq=0;lq8;lq+) mlq=mbuflq; yanshi(10000); md=0; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;/保存密码break; / 10110111 d/*case 0xd7: srjm=e; break; / 11010111 ecase 0xe7: srjm=f; break; / 11100111 f */default: break; void main(void)uchar key;ntschushihua();xianshi(d);/显示函数gb(); /移光标到第二行第六位while(cs)P1=0x0f;if(P1!=0x0f) yanshi(20); key=getkey(); md=1;diaoyong(key); yanshi(20000);md=0;while(1);nts #include #define LCM_RW P3_1 /定义引脚#define LCM_RS P3_0#define LCM_E P3_2#define LCM_Data P2#define Busy 0x80 /用于检测LCM状态字中的Busy标识void WriteDataLCM(unsigned char WDLCM); /写数据void WriteCommandLCM(unsigned char WCLCM,BuysC); /写命令字unsigned char ReadDataLCM(void); /读数据unsigned char ReadStatusLCM(void); /读状态字void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);void Delay4s(void);unsigned char code yftech = http:/;unsigned char code www = /www.;unsigned char code net = ;unsigned char code lianxi = TEL:371-63738296;unsigned char code mobile = 13523005136;unsigned char code QQ = QQ:55837550;unsigned char code Email = mail;unsigned char code Email_2 = ;void main(void)Delay400Ms(); /启动等待,等LCM讲入工作状态while(1)LCMInit(); /LCM初始化Delay5Ms(); /延时片刻(可不要)DisplayListChar(3, 0, yftech);DisplayListChar(9, 0, www);DisplayListChar(0, 1, net);/ ReadDataLCM(); /测试用句无意义Delay4s();/延时4秒LCMInit(); /LCM初始化DisplayListChar(0, 0, lianxi);DisplayListChar(4, 1, mobile); /空四格开始显示移动电话号码Delay4s();LCMInit(); /LCM初始化DisplayListChar(0, 0, QQ);DisplayListChar(12,0,Email);DisplayListChar(2,1,Email
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。