📄 final.c
字号:
#include <msp430x44x.h>
int key_val = 0xFF; //全局变量,按键的值
int day = 1; //day
int hour = 0; //hour
int min = 0; //min
int sec = 0; //sec
int enable=1; //时钟是否走
int is_a_new = 0; //是否为一个新的按键
int key_val_last = 0xff; //最后一按键的键值
int led[6]={0,0,0,0,1,0}; //初始化LED
int key_map[12] = {1,2,3,10,4,5,6,0,7,8,9,11}; //设置键盘逻辑键值与程序计算键值的映射
int digit_led[11] = {0XD7,0X14,0XCD,0X5D,0X1E,0X5B,0XDB,0X15,0XDF,0X5F,0x40}; //led的字型编码
int digit_lcd[10] = {0x7B,0x12,0x4F,0x1F,0x36,0x3D,0x7D,0x13,0x7F,0x3F}; //lcd的字型编码
unsigned long code[32][2] = {123,456,123456,123456,234567,234567,378901,678905}; //用户名和密码数组
void init_lcd() //初始化lcd
{
int i;
LCDCTL = LCDON + LCD4MUX + LCDP2; // 4Mux, S0-S17
BTCTL = BTFRFQ1; // 基本定时器输出
P5SEL = 0xFF; // 公共极和Rxx选择
for(i = 9;i >= 0;i--)
LCDMEM[i] = 0x00;
}
void init_led()
{
P4DIR |= 0X03;
P3DIR = 0XFF;
P3OUT = 0X00;
P4OUT = 0X03;
P4OUT = 0X00;
}
void init_Keyboard()
{
P1DIR = 0x0F; //设置P1.4~P1.8 设置为输入模式,P1.0~P1.3 设置为输出模式
P1OUT = 0x0E; //P1.1~P1.3 输出值清零
}
void check_key()
{
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;
for(col =0;col<4;col++)
{ // 列检测
if((P1IN & tmp2)==0x00)
{ // 是否是该列
key_val =key_map[ row*4 +col] ; // 获取键值
if(key_val != key_val_last)
{
is_a_new = 1;
key_val_last = key_val;
return;// 退出循环
}
else
{
is_a_new = 0;
return;
}
}
tmp2 /= 2; // tmp2右移
}
}
}
key_val_last=0xff;
}
void passin()
{
unsigned temp;
unsigned long username = 0;
unsigned long password = 0;
int key;
int i=6;
LCDMEM[i--] = 0x7a;
LCDMEM[i] = 0x80; //显示“U”,表示USERNAME;
while(1)
{
while(is_a_new)
{
is_a_new = 0;
key = key_val;
if(key == 11) //按了“确认”
{
i=-1;
break;
}
else if(key == 10) //按了“back”
{
if(i==5) ;
else
{
username /=10;
LCDMEM[i] = 0x00;
LCDMEM[++i] = 0x08;
}
}
else if(key < 10) //按了数字键
{
username = username*10 + key;
LCDMEM[i--] = digit_lcd[key];
if(i==-1) break;
LCDMEM[i] = 0x08;
}
}
if(i==-1) break;
}
for(i = 6;i >= 0;i--) LCDMEM[i] = 0x00;
i=6;
LCDMEM[i--] = 0x67;
LCDMEM[i] = 0x08; //显示“P”,表示PASSWORD;
while(1)
{
while(is_a_new)
{
is_a_new = 0;
key = key_val;
if(key == 11) //按了“确认”
{
i=-1;
break;
}
else if(key == 10) //按了“back”
{
if(i==5);
else
{
password /=10;
LCDMEM[i] = 0x00;
LCDMEM[++i] = 0x08;
}
}
else if(key < 10) //按了数字键
{
password = password*10 + key_val;
LCDMEM[i--] = 0xff;
if(i==-1) break;
LCDMEM[i] = 0x08;
}
}
if(i ==-1) break;
}
for(i = 0;i < 4;i++)
{
if(code[i][0] != username) continue;
else if(code[i][1] == password) break;
}
if(i == 4)
{
for(temp = 7;temp > 0;temp--)
LCDMEM[temp - 1] = 0xFF;
}
else
{
P1OUT |= 0x01; //小灯亮
//可能做UART
}
for(temp = 0xffff;temp>0;temp--);
for(temp = 0xffff;temp>0;temp--);
for(temp = 0xffff;temp>0;temp--); //延时,即开门的时间或者是报告出错信息的时间//要改//;
for(temp = 7;temp > 0;temp--)
LCDMEM[temp - 1] = 0x00;
P1OUT &= 0XFE;
}
void display()
{
int intd,k;
int temp = 0x01;
for(intd = 6;intd>0;intd--)
{
P3OUT = ~temp;
P4OUT = 0x01;
P4OUT = 0x00;
P3OUT = digit_led[led[intd-1]];
P4OUT = 0x02;
P4OUT = 0x00;
for(k=0xFF;k>0;k--);
temp = temp*2;
}
}
void set_clock()
{
int i=5;
int tc[6];
int key;
enable=0;
for(i=0;i<6;i++) tc[i]=led[i];
i=5;
led[i] = 10; //显示“_”
while(1)
{
while(is_a_new)
{
is_a_new = 0;
key=key_val;
if(key == 11) //按了“确认”
{
led[i]=tc[i];
i=-1;
break;
}
else if(key == 10) //按了“back”
{
if(i==5);
else
{
led[i]=tc[i];
led[++i]=10;
}
}
else if(key < 10) //按了数字键
{
switch(i)
{
case 5:
if(key < 4)
{
led[i--] = key;
led[i] = 10;
}
else
{
led[i--] = 0;
led[i--] = key;
led[i] = 10;
}
break;
case 4:
if(led[5] ==3)
{
if(key > 1)
{
led[i--] = 1;
led[i] = 10;
}
else
{
led[i--] = key;
led[i] = 10;
}
}
else
{
led[i--] = key;
led[i] = 10;
}
break;
case 3:
if(key < 3)
{
led[i--] = key;
led[i] = 10;
}
else
{
led[i--] = 0;
led[i--] = key;
led[i] = 10;
}
break;
case 2:
if(led[3] ==2)
{
if(key > 3)
{
led[i--] = 3;
led[i] = 10;
}
else
{
led[i--] = key;
led[i] = 10;
}
}
break;
case 1:
if(key < 6)
{
led[i--] = key;
led[i] = 10;
}
else
{
led[i--] = 0;
led[i--] = key;
led[i] = 10;
}
break;
case 0:
led[i--] = key;
break;
default :
break;
}
}
if(i==-1) break;
} if(i==-1) break;
}
sec = 0;
enable=1;
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
init_led();
init_lcd();
init_Keyboard();
BTCTL = BTSSEL+BT_ADLY_32+BTFRFQ1; //BT 1/32秒中断 //频率:32768/256/16=1/8HZ;
IE2 |= BTIE; //BT中断允许
WDTCTL = WDT_ADLY_250; //开看门狗中断
IE1 |= WDTIE; //看门狗中断允许
_EINT(); //开系统中断
while(1)
{
display();
while(is_a_new)
{
is_a_new = 0;
if(key_val == 11) passin();
if(key_val == 10) set_clock();
}
}
}
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer()
{
check_key();
}
#pragma vector = BASICTIMER_VECTOR
__interrupt void basic_timer()
{
display();
if(enable!=0)
{
if(++sec<32) //是否到了60秒
{
return;
}
sec = 0;
min = led[1] * 10 + led[0]; //分钟数
if(++min<60) //是否到了60分
{
led[1] = min / 10;
led[0] = min % 10;
return;
}
min = 0;
led[0] = 0;
led[1] = 0;
hour = led[3] * 10 + led[2]; //小时数
if(++hour<24) //是否到了24小时
{
led[3] = hour / 10;
led[2] = hour % 10;
return;
}
hour = 0;
led[2] = 0;
led[3] = 0;
day = led[5] * 10 + led[4]; //天数
if(++day<32) //是否到了31天
{
led[5] = day / 10;
led[4] = day % 10;
return;
}
day = 1;
led[4] = 1;
led[5] = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -