📄 1.txt
字号:
#include <reg52.h>
// P0口连接数码管段控信号
// P1口连接数码管片选信号
sbit Sel0 = P1 ^ 0;
sbit Sel1 = P1 ^ 1;
sbit Sel2 = P1 ^ 2;
sbit Sel3 = P1 ^ 3;
sbit Sel4 = P1 ^ 4;
sbit Sel5 = P1 ^ 5;
// P2口连接4×4键盘
sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;
sbit P2_3 = P2 ^ 3;
sbit P2_4 = P2 ^ 4;
sbit P2_5 = P2 ^ 5;
sbit P2_6 = P2 ^ 6;
sbit P2_7 = P2 ^ 7;
// P3口连接发光二极管、蜂鸣器和外部存储器
sbit Green = P3 ^ 0;
sbit Yellow = P3 ^ 1;
sbit Red = P3 ^ 2;
sbit Beep = P3 ^ 3;
// 共阳数码管编码
code const unsigned char LED_CODE[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
// 六个数码管显示内容
unsigned char LED[5];
//两组密码:智能门锁密码Password_1[5]和键盘上锁密码Password_2[5]
unsigned char Password_1[5], Password_2[5];
//输入时密码错误次数
unsigned char Wrong;
// 数码管动态扫描索引
unsigned char LedSel;
// 10毫秒,500毫秒,10秒定时标志
volatile unsigned char Flag10ms, Flag500ms, Flag1s, Flag10s, Flag60s;
unsigned char halfCount;
// 蜂鸣器鸣叫时间(5毫秒为单位)
unsigned char BeepCount;
// 发光二极管点亮时间(5毫秒为单位)
unsigned char LightCount;
// 发光二极管电路工作状态
unsigned char LightType;
#define LightingRed 0 // 点亮红灯
#define LightingGreen 1 // 点亮绿灯
#define LightingYellow 2 // 点亮黄灯
// 蜂鸣器鸣叫类型
unsigned char BeepType;
#define BT_BUTTON 0 // 按键声
#define BT_ALARM_1 1 // 报警声1(60秒)
#define BT_ALARM_2 2 // 报警声2(500毫秒)
// 系统工作状态
unsigned char WorkState;
#define SETPassWord 0 // 修改密码模式
#define OPEN 1 // 开锁模式
#define L_KEYBORD 2 // 键盘上锁模式
#define UL_KEYBORD 3 // 键盘解锁模式
#define NONE 4 // 空操作模式
//键盘列扫描
unsigned char ScanLine;
#define line_1 0; // 扫描第1列
#define line_2 1; // 扫描第2列
#define line_3 2; // 扫描第3列
#define line_4 3; // 扫描第4列
//按键定义
#define BTN_NONE 0x00 // 没有按键动作
// 按键当前扫描值,按键上次扫描值
unsigned char CurKey, OldKey;
// 按键当前扫描值的译码
unsigned char C_CurKey ;
// 数码管动态扫描
void UpdateLed(void) {
// 关显示
Sel0 = Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1;
P0 = LED[LedSel]; // 设置显示内容
switch (LedSel)
{
case 0: Sel0 = 0; Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1; break;
case 1: Sel1 = 0; Sel0 = Sel2 = Sel3 = Sel4 = Sel5 = 1; break;
case 2: Sel2 = 0; Sel1 = Sel0 = Sel3 = Sel4 = Sel5 = 1; break;
case 3: Sel3 = 0; Sel1 = Sel2 = Sel0 = Sel4 = Sel5 = 1; break;
case 4: Sel4 = 0; Sel1 = Sel2 = Sel0 = Sel3 = Sel5 = 1; break;
case 5: Sel5 = 0; Sel1 = Sel2 = Sel0 = Sel4 = Sel3 = 1; break;
default: Sel0 = Sel1 = Sel2 = Sel3 = Sel4 = Sel5 = 1; LedSel = 0; break;
}
// 切换数码管选通索引
if (LedSel >= 5)
LedSel = 0;
else
++ LedSel;
}
// 蜂鸣器鸣叫设置
void BeepSet(unsigned char type)
{
switch (type)
{
case BT_BUTTON:
BeepType = BT_BUTTON;
BeepCount = 20; // 按键声响0.1秒
break;
case BT_ALARM_1:
BeepType = BT_ALARM_1;
BeepCount = 12000; //报警音1响60秒
break;
case BT_ALARM_2:
BeepType = BT_ALARM_2;
BeepCount = 100; // 报警音2响0.5秒
break;
default:
BeepCount = 0;
break;
}
}
// 蜂鸣器声音控制
void BeepCtrl(unsigned char iCount)
{
switch (BeepType)
{
case BT_BUTTON: // 按键声音
if (BeepCount > 0)
{
-- BeepCount;
Beep = 1;
}
else
{
Beep = 0;
}
break;
case BT_ALARM_1: // 报警60秒(蜂鸣器叫5毫秒,停5毫秒)
if (0 == iCount)
{
if (BeepCount > 0)
{
Beep = BeepCount % 2;
-- BeepCount;
}
else
{
Beep = 0;
}
}
break;
case BT_ALARM_2: // 报警500毫秒
if (0 == (iCount % 100)) // 500毫秒定时到
{
if (BeepCount > 0)
{
Beep = BeepCount % 2;
-- BeepCount;
}
else
{
Beep = 0;
}
}
break;
default:
{
Beep = 0;
BeepCount = 0;
break;
}
}
}
// 发光二极管电路点亮控制
void LightCtrl(unsigned char iCount)
{
switch (LightType)
{
case LightingRed: // 点亮红灯
LightCount = 12000;
if (0 == iCount)
{
if (LightCount > 0)
{
-- LightCount;
Red = 0;
}
}
else
Red = 1;
break;
case LightingGreen: // 点亮绿灯
LightCount = 200;
if (0 == (iCount % 200))
{
if (LightCount > 0)
{
-- LightCount;
Green = 0;
}
}
else
Green = 1;
break;
case LightingYellow: // 点亮黄灯
LightCount = 200;
if (0 == (iCount % 200))
{
if (LightCount > 0)
{
-- LightCount;
Yellow = 0;
}
}
else
Yellow = 1;
break;
default:
{
Yellow = Green = Red = 1;
LightCount = 0;
break;
}
}
}
// 系统初始化
void InitSys(void)
{
// 定时器2初始化
TH2 = 0xEC; //计数装载,向上计数
TL2 = 0x78;
RCAP2H = 0xEC; //两个16位无符号整数
RCAP2L = 0x78;
ET2 = 1; //允许定时或计数
// 系统状态默认设置
CurKey = 11;
// 设置两组原始密码
Password_1[5] = Password_2[5] = {0x00,0x00,0x00,0x00,0x00,0x00};
// 6个数码管显示内容清空
LED[0] = LED[1] = LED[2] = LED[3] = LED[4] = LED[5] = 0xFF;
//发光二极管灭
Red = Green = Yellow = 1;
// 数码管动态扫描索引置0
LedSel = 0;
//密码输入错误次数置0
Wrong = 0;
// 10毫秒,500毫秒,1秒,10秒,60秒定时标志
Flag10ms = Flag500ms = Flag10s = Flag1s = Flag60s = 0;
// 蜂鸣器关闭
Beep = 0;
// 蜂鸣器鸣叫时间(5毫秒为单位)
BeepCount = 0;
//发光二极管点亮时间(5毫秒为单位)
LightCount = 0;
}
// 定时器2中断服务函数
void T2_int(void) interrupt 5 using 1
{
static unsigned char iCount = 0;
BeepCtrl(iCount);
++ iCount;
if ((iCount % 2) == 0) // 10毫秒定时到
{
Flag10ms = 1;
if ((iCount % 100) == 0) // 500毫秒定时到
{
Flag500ms = 1;
if ((iCount % 200) == 0) // 1秒定时到
{
Flag1s = 1;
if ((iCount % 2000) == 0) // 10秒定时到
{
Flag10s = 1;
if (iCount >= 12000) // 60秒定时到
{
Flag60s = 1;
iCount = 0;
}
}
}
}
}
TF2 = 0; // 定时器2溢出标志清零
}
//键盘扫描,按列顺序循环扫描(从第一列到第四列), 并返回当前扫描值
unsigned char KeyScan(void)
{
switch (ScanLine)
{
case line_1: P2_7 = P2_6 = P2_5 = 1; P2_4 = 0; break; //第1列:在P2.7-P2.4输出“1110”
case line_2: P2_7 = P2_6 = P2_4 = 1; P2_5 = 0; break;
case line_3: P2_7 = P2_5 = P2_4 = 1; P2_6 = 0; break;
case line_4: P2_7 = P2_5 = P2_4 = 1; P2_6 = 0; break;
default: P2_7 = P2_6 = P2_5 = 1; P2_4 = 0; ScanLine = line_1; break;
}
// 切换键盘列选通索引
if (ScanLine == line_1)
{
if (P2_3 = P2_2 = P2_1 = 1 && P2_0 = 0) CurKey = 1; //判断每行是否有键按下
else if (P2_3 = P2_2 = P2_0 = 1 && P2_1 = 0) CurKey = 4;
else if (P2_3 = P2_1 = P2_0 = 1 && P2_2 = 0) CurKey = 7;
else if (P2_2 = P2_1 = P2_0 = 1 && P2_3 = 0) CurKey = 15;
else
_nop_();
ScanLine = line_2; // 切换键盘列选通索引 //从第1列切换到第二列
}
else if (ScanLine == line_2)
{
if (P2_3 = P2_2 = P2_1 = 1 && P2_0 = 0) CurKey = 2;
else if (P2_3 = P2_2 = P2_0 = 1 && P2_1 = 0) CurKey = 5;
else if (P2_3 = P2_1 = P2_0 = 1 && P2_2 = 0) CurKey = 8;
else if (P2_2 = P2_1 = P2_0 = 1 && P2_3 = 0) CurKey = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -