/*
目的:使用试验箱的 5 个键盘和 LED,设计一个 5 按键的密码锁。
输入密码正确 LED1 灯连续亮,产生一个开门信号 P1.1=1;输入密码不正确,
5 个 LED 灯同时闪烁,同时蜂鸣器鸣叫,保持开门信号为关闭 P1.0=0
*/
#include "msp430f6638.h"
//包含 msp430f6638.h 头文件
void delay(void);
void Alert(void);
void init(void);
//延迟函数的声明
//输入错误密码时的警报函数的声明
//初始化函数声明
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
init();
unsigned char i;
unsigned char flag;
unsigned char EnterPassword[5];
/*
//关闭看门狗
//设置循环变量 i
//设置标志变量
//用数组装输入的 5 个数
初始化密码,每个数字用 ASCII 码保存,分别对应 55,54,53,52,51
设置为依次按下 S7,S6,S5,S4,S3,S2,S1 为该密码
*/
unsigned char Password[5] = {"76543"};
//输入密码
for (i = 0; i < 5; i++)
{
flag = 1;
while (flag)
{
//循环 5 次,即输入 5 个值
//用标志变量 flag 来检测是否按下了一次键
if ((P4IN & BIT0) == 0)
{
EnterPassword[i] = 55;
flag = 0;
delay();
}
else if ((P4IN & BIT1) == 0)
{
EnterPassword[i] = 54;
flag = 0;
delay();
}
else if ((P4IN & BIT2) == 0)
//S7 按下
//7 对应 ASCII 码里的 55
//S6 按下
//6 对应 ASCII 码里的 54
//S5 按下
{
EnterPassword[i] = 53;
flag = 0;
delay();
}
else if ((P4IN & BIT3) == 0)
{
EnterPassword[i] = 52;
flag = 0;
delay();
}
else if ((P4IN & BIT4) == 0)
{
EnterPassword[i] = 51;
flag = 0;
delay();
//5 对应 ASCII 码里的 53
//S4 按下
//4 对应 ASCII 码里的 52
//S3 按下
//3 对应 ASCII 码里的 51
}
}
}
//将输入的密码与原密码进行比较
flag = 1;
for (i = 0; i < 5; i++)
{
if (EnterPassword[i] != Password[i])
flag = 0;
//如果 5 个值中,出现任一个值不一样,flag 就会被置 0
}
/*
输入密码正确 LED1 灯连续亮,产生一个开门信号 P1.1=1
输入密码不正确,5 个 LED 灯同时闪烁,同时蜂鸣器鸣叫,保持开门信号为关闭 P1.0=0
*/
if (flag)
{
while (1)
{
P8OUT |= BIT0;
P1OUT |= BIT1;
//LED1 连续亮
//开门信号 P1.1=1
}
}
else
{
while(1)
{
Alert();
P1OUT &= ~BIT0;
//调用警报函数
//开门信号为关闭 P1.0=0
}
}
return 0;
}
//端口初始化函数
void init()
{
//端口 P4,P5,P8, P1.5 的初始化
P4OUT = 0x00;
P5OUT = 0x00;
P8OUT = 0x00;
P1OUT &= ~BIT5;
P8DIR |= BIT0;
P1DIR |= BIT1;
P1DIR |= BIT0;
P1DIR |= BIT5;
//设置 P8.0 为输出
//设置 P1.1 为输出
//设置 P1.0 为输出
//设置 P1.5 为输出
P4REN |= BIT4;
P4REN |= BIT3;
P4REN |= BIT2;
P4REN |= BIT1;
P4REN |= BIT0;
P4OUT |= BIT4;
P4OUT |= BIT3;
P4OUT |= BIT2;
P4OUT |= BIT1;
P4OUT |= BIT0;
//S3 拉电阻;
//S4 拉电阻;
//S5 拉电阻;
//S6 拉电阻;
//S7 拉电阻;
//S3 上拉电阻;
//S4 上拉电阻;
//S5 上拉电阻;
//S6 上拉电阻;
//S7 上拉电阻;
P4DIR |= BIT5;
P4DIR |= BIT6;
P4DIR |= BIT7;
//设置 P4.5 为输出,LED5
//设置 P4.6 为输出,LED4
//设置 P4.7 为输出,LED3
P5SEL &= ~BIT7;
P5DIR |= BIT7;
//设置 P5.7 为 I/O
//设置 P5.7 为输出,LED2
P8SEL &= ~BIT0;
P8DIR |= BIT0;
//设置 P8.0 为 I/o
//设置 P8.0 为输出,LED1
}
//延迟函数
void delay()
{
unsigned int i;
for (i = 0; i < 0xffff; i++);
for (i = 0; i < 0xffff; i++);
}
//警报函数
void Alert()
{
P1OUT |= BIT5;
P4OUT |= BIT5;
P4OUT |= BIT6;
P4OUT |= BIT7;
P5OUT |= BIT7;
P8OUT |= BIT0;
delay();
P8OUT &= ~BIT0;
P5OUT &= ~BIT7;
P4OUT &= ~BIT7;
P4OUT &= ~BIT6;
P4OUT &= ~BIT5;
delay();
//LED1 亮
//LED2 亮
//LED3 亮
//LED4 亮
//LED5 亮
//LED1 灭
//LED2 灭
//LED3 灭
//LED4 灭
//LED5 灭
}