📄 12键盘密码锁.txt
字号:
#include <msp430x44x.h>
#define KEY_BOARD 1
unsigned char key_Pressed, // 是否有键值按下
key_val, // 存放键值
key_Flag; // 是否一个按下的按键已经松开,
// 即是按键的键值可以读取
unsigned char key_Map[12] ={ //设置键盘逻辑键值与程序计算键值的映射
1,2,3,10,4,5,
6,0,7,8,9,11
};
/********************************************************
* 初始化键盘设备
********************************************************/
void init_Keyboard(void){
P1DIR &= 0x01; // P1.4~P1.7 设置为输入模式
P1DIR |= 0x0E; // set p1.1~p1.3 设置为输出模式
P1OUT |= 0x0E; // p1.1~p1.3 输出值清零
key_Flag = 0;// 初始化key_Flag
key_Pressed = 0;// 初始化key_Pressed
}
/*********************************************
* Check_Key(),检查按键,确认键值
*********************************************/
void check_Key(void){
unsigned char row ,col,tmp1,tmp2;
// tmp1用来设置P1OUT的值,使P1.1~P1.3中有一个为0
tmp1 = 0x08;
for(row=0;row<3;row++){
P1OUT |= 0x0E; // p1.1~P1.3=1
P1OUT -= tmp1; // P1.1~p1.3中有一个为0
tmp1 = tmp1/2; // tmp1 右移一位
if ((P1IN & 0xf0) < 0xf0){ // 是否P1IN的P1.4~P1.7中有一位为0
tmp2 = 0x80; // tmp2用于检测出那一位为0
for(col =0;col<0x04;col++){ // 列检测
if((P1IN & tmp2)==0x00){ // 是否是该列
key_val =key_Map[ row*4 +col] ; // 获取键值
return; // 退出循环
}
tmp2 /= 2; // tmp2右移
}
}
}
}
void delay(){
unsigned char tmp;
for(tmp=0xff;tmp>0;tmp--);
}
/************************************************************
* key_Event(),检测键盘是否有键按下,如果有获取键值
*************************************************************/
void key_Event(void){
unsigned char tmp;
P1OUT &= 0x01; // 设置P1OUT输出值
tmp = P1IN; // 获取 p1IN
if ((key_Pressed ==0x00)&&((tmp & 0xf0) < 0xf0))
{ //是否有键按下
key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识
delay(); //消除抖动
check_Key(); // 调用check_Key(),获取键值
}else if ((key_Pressed ==1)&&((tmp & 0xf0) == 0xf0))
{ //是否按键已经释放
key_Pressed = 0; // 清除key_Pressed标识
key_Flag = 1; // 设置key_Flag标识
}
}
#define LED_IN_USE 6
const unsigned char NUM_LED[17]=
{0xd7,0x14,0xcd,0x5d,0x1E, // 0 ~ 4
0x5b,0xdb,0x15,0xdf,0x5f, // 5 ~ 9
0x9f,0xda,0xc3,0xcc,0xcf, // a ~ e
0x8b,0x00}; //f,0x00使LED不显示
unsigned char led_Buf[LED_IN_USE]; // LED显示缓冲区 ,
// 存放要显示数据
unsigned char led_Ctrl;
/*******************************************************
* 模块初始化
*******************************************************/
void init_LED(void){
char tmpv;
P3DIR = 0xff; // 设置 p3 输出
P3OUT = 0x00; // 设置 初始值为0
P4DIR |= 0x03; // 设置 p4.0,p4.1 输出
P4OUT &= 0xfc; // 设置初始值
led_Ctrl = 0; // led_Ctrl用于控制那个LED可显示
for(tmpv=0;tmpv<LED_IN_USE;tmpv++)
{ // 初始化缓冲区
led_Buf[tmpv] = 0;
}
}
/****************************************************
* LED 显示 ,该函数可以放到定时器中断中
****************************************************/
void led_Display(){
unsigned tmp ;
tmp = 0x01;
P3OUT = NUM_LED[led_Buf[led_Ctrl]]; // 设置显示值
P4OUT |= 0x02; // 打开数据锁存器
P4OUT &= 0XFD; // 关闭数据锁存
P3OUT = ~(tmp<<led_Ctrl); // 设置那只LED显示
P4OUT |= 0x01; // 打开控制锁存
P4OUT &= 0XFE; // 关闭控制锁存
led_Ctrl= (led_Ctrl +1) % LED_IN_USE; // 设置下一个要显示的LED
}
void main(void)
{
unsigned char keyin[]={1,2,3,4,5,6};
WDTCTL = WDTHOLD + WDTPW ; // 停止看门狗
ggg:P5DIR |= 0x02;
P5OUT &=0X00;
char k[6]={0};
init_Keyboard(); // 初始化键盘
while(1)
{
for(int i=0;i<6;)
{
key_Event(); //检测按键事件
if (key_Flag == 1) // 检测key_val里是否有键值可以读取
{
k[i]=key_val;
i++;
key_Flag= 0;
}
}
if( k[0] == keyin[0])
if( k[1] == keyin[1])
if( k[2] == keyin[2])
if( k[3] == keyin[3])
if( k[4] == keyin[4])
if(k[5] == keyin[5])
{
P5OUT |=0X02;
goto kkk;
}
else
P5OUT &=~0X02;
else
P5OUT &=~0X02;
else
P5OUT &=~0X02;
else
P5OUT &=~0X02;
else
P5OUT &=~0X02;
}
kkk: for(int j=0;j<6;j++)
{
keyin[j]=(( keyin[j]+5)/2)%12;
}
led_Ctrl =0;
init_LED();
for(unsigned char i=99999999;i!=0;i--)
{
for(int i=0;i<6;i++)
{
led_Buf[led_Ctrl]=keyin[i];
led_Display();
delay(500);
}
}
goto ggg;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -