密码锁程序修改-

  • 格式:doc
  • 大小:76.00 KB
  • 文档页数:10

由此键盘 改为 列1 列2 列3 列4 行1 1 2 3 A 行2 4 5 6 B 行3 7 8 9 C 行4 * 0 # D

对应上面的键盘及键盘的键值编码方法,各按键及其编码的对应关系如下表所示: 按键 行号 列号 键值编码 1 1 1 11H(00010001) 2 1 2 21H(00100001) 3 1 3 41H(01000001) A 1 4 81H(10000001) 4 2 1 12H(00010010 ) 5 2 2 22H(00100010) 6 2 3 42H(01000010) B 2 4 82H(10000010) 7 3 1 14H(00010100) 8 3 2 24H(00100100) 9 3 3 44H(01000100) C 3 4 84H(10000100) * 4 1 18H(00011000) 0 4 2 28H(00101000) # 4 3 48H(01001000) D 4 4 88H(10001000) 四位共阴 数码管 SM420564管脚图 C4 a f C3 C2 b 12 11 10 9 8 7

SM420564 1 2 3 4 5 6 e d Dp c g C1

六 .程序详解 #ifndef _PWLOCK_H // 防止PWLock.h被重复引用 #define _PWLOCK_H #include #include #include #include

#define uchar unsigned char #define uint unsigned int

uchar digbit; // 字位 uchar wordbuf[4]; // 字型码缓冲区 uchar t1count; // 定时器1由50ms累积到1s所用的计数器 uchar count; // 密码位计数 uchar pw[4]; // 初始密码存储区 uchar pwbuf[4]; // 输入密码存储区 bit enterflag; // 确认键按下与否标志 bit pwflag; // 密码正确与否标志 bit showflag; // 数码管显示与否标志 sbit green=P2^6; sbit red=P2^7;

void display(void); // 显示函数 #endif #include "PWLock.h" /* 键消抖延时函数 */ void delay(void) { uint i; for (i=10000;i>0;i--); }

/* 键扫描函数 */ uchar keyscan(void) { uchar scancode,tmpcode; P1 = 0xf0; // 发全0行扫描码 if ((P1&0xf0)!=0xf0) // 若有键按下 { delay(); // 延时去抖动 if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响 { scancode = 0xfe; while((scancode&0x10)!=0) // 逐行扫描 { P1 = scancode; // 输出行扫描码 if ((P1&0xf0)!=0xf0) // 本行有键按下 { tmpcode = (P1&0xf0)|0x0f;

/* 返回特征字节码,为1的位即对应于行和列 */ return((~scancode)+(~tmpcode)); } else scancode = (scancode<<1)|0x01; // 行扫描码左移一位 } } } return(0); // 无键按下,返回值为0 }

/* 定时器0中断服务子程序,2ms定时动态扫描显示 */ void time0_int(void) interrupt 1 { /* 重置2ms定时 */ TH0 =-2000/256; TL0 = -2000%256; if (showflag==1) display(); // 调用显示函数 }

/* 定时器1中断服务子程序,50ms*/ void time1_int(void) interrupt 3 { uchar k; /* 重置50ms定时 */ TH1 = -50000/256; TL1 = -50000%256;

if (t1count<20) { t1count++; } else // 计时到1s { TR1 = 0; // 关闭计数器1 t1count = 0; green = 1; // 绿灯不亮 red = 1; // 红灯不亮 showflag = 1; // 打开数码管显示 digbit = 0x01; // 从数码管第1位开始动态显示 for (k=0;k<4;k++) // 显示8888 wordbuf[k] = 8; } }

/* 根据共阴极字型编码表获取0~9,A~B字型代码 */ uchar getcode(uchar i) { uchar p; switch (i) { case 0: p=0x3f; break; /* 0 */ case 1: p=0x06; break; /* 1 */ case 2: p=0x5B; break; /* 2 */ case 3: p=0x4F; break; /* 3 */ case 4: p=0x66; break; /* 4 */ case 5: p=0x6D; break; /* 5 */ case 6: p=0x7D; break; /* 6 */ case 7: p=0x07; break; /* 7 */ case 8: p=0x7F; break; /* 8 */ case 9: p=0x67; break; /* 9 */ case 10: p=0x77; break; /* A */ case 11: p=0x7C; break; /* B */ case 12: p=0x39; break; /* C */ case 13: p=0x5E; break; /* D */ case 14: p=0x79; break; /* E */ case 15: p=0x71; break; /* F */ default: break; } return(p); }

/* 显示函数 */ void display(void) { uchar i; switch (digbit) { case 1: i=0; break; case 2: i=1; break; case 4: i=2; break; case 8: i=3; break; default: break; }

P2 = 0xC0; // 关闭显示 P0 = getcode(wordbuf[i]); // 送字型码 P2 = digbit|0xC0; // 送字位码

if (digbit<0x08) // 共4位 digbit = digbit*2; // 左移一位 else digbit = 0x01; }

/* 密码比较函数 */ bit pwcmp(void) { bit flag; uchar i; for (i=0;i<4;i++) { if (pw[i]==pwbuf[i]) flag = 1; else { flag = 0; i = 4; } } return(flag); }

/* 主程序 */ void main() { uchar j,key;

P2 = 0xC0; // 关闭数码管显示 TMOD = 0x11; // T0,T1工作方式1 /* 2ms 定时设置 */ TH0 = -2000/256; TL0 =-2000%256;

/* 50ms 定时设置 */ TH1 = -50000/256; TL1 = -50000%256;

/* 启动计数器0,关闭计数器1 */ TR0 = 1; ET0 = 1; TR1 = 0; ET1 = 1; EA = 1;

count = 0; // 初始没有输入密码,计数器设为0 enterflag = 0; // 没有按下确认键 pwflag = 0; // 密码标志先置为0 green = 1; // 绿灯不亮 red = 1; // 红灯不亮

/* 假设内定密码为9376 */ pw[0] = 9; pw[1] = 3; pw[2] = 7; pw[3] = 6;