毕业设计。希望一个大神来教教我。。。。真心求谢。 QQ 444894059 26号就答辩,就2个晚上可以学习了。救命。。先把代码贴上来~
/************
两长声表示操作错误,要重新操作
************/
#include <msp430x14x.h>
#include "flash.h" //flash文件
#define BUZ P3OUT|=BIT0//蜂鸣器端口
#define BUZ0 P3OUT&=~BIT0//控制蜂鸣器响与不响
unsigned char z_mima[5]={1,1,1,1,1};//主密码
unsigned char c_mima[5];//次密码
unsigned char read[6];//读取的密码存放在该数组
unsigned char number,lock;
void delay_ms(unsigned int ms)//延时函数
{
unsigned char i;
for(;ms>0;ms--)
for(i=0;i<200;i++);
}
void read_key()//按键读取函数,按键输入
{
unsigned char i=0;
if((P1IN&BIT0)==0)//数字按键1按下 没按是高电平 0就是按下
{
BUZ;//蜂鸣器响
//P3OUT=0xfe;开 1111 1110
read[number]=1;//则记下该位密码为1
number++;//转到下一位密码
delay_ms(100);
while((P1IN&BIT0)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
} //按键1的判断函数
else
if((P1IN&BIT1)==0) //数字按键2按下
{
BUZ; //蜂鸣器响
//P3OUT=0xfd;//关 1111 1101
read[number]=2; //记下该位密码为2
number++; //转到下一位密码
delay_ms(100);
while((P1IN&BIT1)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
} //按键2处理函数
else
if((P1IN&BIT2)==0)
{
BUZ;//蜂鸣器响
//P2OUT=0xfd;//关
read[number]=3;//记下该位密码为3
number++;//转向下位密码
delay_ms(100);
while((P1IN&BIT2)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
}
if(number>=6)//输入密码超过五位则重新输入
{
number=0;
read[0]=4;//初始密码位
read[1]=4;//初始密码位
read[2]=4;//初始密码位
read[3]=4;//初始密码位
read[4]=4;//初始密码位
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
delay_ms(500);
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
}
if((P1IN&BIT3)==0)//确认键按下
{
if(number==5)
{
if((lock&BIT1)==BIT1)//修改密码 xxxx xx1x & 0000 0010 = 0000 0010
{
BUZ;
c_mima[0]=read[0];
c_mima[1]=read[1];
c_mima[2]=read[2];
c_mima[3]=read[3];
c_mima[4]=read[4];
EraseSectorFlash(0x3000);//擦除
WriteFlash(0x3000,c_mima,5);//保存密码(掉电保存)
//0x3000,是Flash块的初始地址
lock&=(~BIT1);//0000 0010 -> 1111 1101 清空lock第二位 取反
delay_ms(50);
while((P1IN&BIT3)==0);//确认键按下
BUZ0;//不响
delay_ms(50);
}
else//lock不等于2并且number=5,最后一个按键是按下状态下
{
if((z_mima[0]==read[0])&&(z_mima[1]==read[1])&&(z_mima[2]==read[2])&&(z_mima[3]==read[3])&&(z_mima[4]==read[4]))//如果5位密码都上主密码可以控制次密码
{//判断输入的密码已近与主密码匹配,LOCK值没有被改变
delay_ms(50);
while((P1IN&BIT3)==0 );//按键是否还是按下状态,
delay_ms(50);
while((P1IN&BIT3)==BIT3)//按键松开
{
delay_ms(50);
i++;
if(i>=20)break;
} //此时按一下的状态I=20.按两下i是<20
if(i>=20)//表示按一下
{
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
lock^=BIT0;//0000 0001 ^ 0000 0001=0000 0000异或
while((P1IN&BIT3)==0);
delay_ms(50);
}
else//按两下,i<20
{
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//停止蜂鸣器
delay_ms(500);
BUZ;//蜂鸣器响
delay_ms(200);
BUZ0;//不响
lock|=BIT1;//表示修改密码 0x xxxx xxxx |= 0x000 2(0010)=0x xxxx xx1x char 0000 0000
}
}
else//主密码不匹配
if((lock&BIT0)==0)//没有锁定次密码
{
if((c_mima[0]==read[0])&&(c_mima[1]==read[1])&&(c_mima[2]==read[2])&&(c_mima[3]==read[3])&&(c_mima[4]==read[4]))//如果5位密码都对上则开锁
{
BUZ;
delay_ms(200);
BUZ0;//不响
P2OUT=0xfe;//开锁,P2.0输出低电平
delay_ms(500);
P2OUT=0xf0;//p2.0-2.3都输出低电平
delay_ms(10000);//等待一段时间
P2OUT=0xfd;//关锁 p2.1输出低电平 其他输出高电频
delay_ms(500);
P2OUT=0xf0;//p2.0-2.3都输出低电平
}
else
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}}
else
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}
}
}
else//number不等于5情况下
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}
read[0]=4;//初始密码位
read[1]=4;//初始密码位
read[2]=4;//初始密码位
read[3]=4;//初始密码位
read[4]=4;//初始密码位
number=0;
}
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//关看门狗
P2OUT=0x00;//初始P2化端口
P2DIR=0xff;//配置P2端口为输出
P3DIR=0xff;//配置P3端口为输出
P3OUT=0;
ReadFlash(0x3000,c_mima,5);//读Flash
while(1)
{
read_key();//调用读按键函数
}
}
void ReadFlash(USHORT wAddr,UCHAR *bBuf,UCHAR bLen)//读取flash数据,地址、数据、数据长度
{
while (bLen--)//不能超过制定长度
{
*bBuf++=*(UCHAR *)wAddr++;
}
return;
}
/***FUNC+*********************************************************************/
/* Name : Init_Led */
/* Descrp : init led I/O */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
BOOL WriteFlash(USHORT wAddr,UCHAR *bBuf,UCHAR bLen)//写flash数据,地址、数据、数据长度
{
UCHAR reg1,reg2;
reg1=_BIC_SR(GIE);
reg2=IE1;
IE1=0;
while (bLen--) //不能超过制定长度
{
while (FCTL3&WAIT_BUSY)//检测忙
{
;
}
FCTL3 = FWKEY;
FCTL1 =FWKEY+WRT;
*(UCHAR *)wAddr++=*(bBuf++);//向地址里写数据
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;
}
if(reg1&GIE)
{
_BIS_SR(GIE);
}
IE1=reg2;
return TRUE;
}
/***FUNC+*********************************************************************/
/* Name : Init_Led */
/* Descrp : init led I/O */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void EraseSectorFlash(USHORT wAddr)//擦除
{
UCHAR reg1,reg2;
reg1=_BIC_SR(GIE); //Global Interrupt Enable
reg2=IE1;
IE1=0;
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL3 = FWKEY;
FCTL1 = FWKEY+ERASE;
*(UCHAR *)wAddr=0;
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;
if(reg1&GIE)
{
_BIS_SR(GIE);
}
IE1=reg2;
return;
}
/************
两长声表示操作错误,要重新操作
************/
#include <msp430x14x.h>
#include "flash.h" //flash文件
#define BUZ P3OUT|=BIT0//蜂鸣器端口
#define BUZ0 P3OUT&=~BIT0//控制蜂鸣器响与不响
unsigned char z_mima[5]={1,1,1,1,1};//主密码
unsigned char c_mima[5];//次密码
unsigned char read[6];//读取的密码存放在该数组
unsigned char number,lock;
void delay_ms(unsigned int ms)//延时函数
{
unsigned char i;
for(;ms>0;ms--)
for(i=0;i<200;i++);
}
void read_key()//按键读取函数,按键输入
{
unsigned char i=0;
if((P1IN&BIT0)==0)//数字按键1按下 没按是高电平 0就是按下
{
BUZ;//蜂鸣器响
//P3OUT=0xfe;开 1111 1110
read[number]=1;//则记下该位密码为1
number++;//转到下一位密码
delay_ms(100);
while((P1IN&BIT0)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
} //按键1的判断函数
else
if((P1IN&BIT1)==0) //数字按键2按下
{
BUZ; //蜂鸣器响
//P3OUT=0xfd;//关 1111 1101
read[number]=2; //记下该位密码为2
number++; //转到下一位密码
delay_ms(100);
while((P1IN&BIT1)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
} //按键2处理函数
else
if((P1IN&BIT2)==0)
{
BUZ;//蜂鸣器响
//P2OUT=0xfd;//关
read[number]=3;//记下该位密码为3
number++;//转向下位密码
delay_ms(100);
while((P1IN&BIT2)==0);//等待按键松开
BUZ0;//不响
delay_ms(100);
}
if(number>=6)//输入密码超过五位则重新输入
{
number=0;
read[0]=4;//初始密码位
read[1]=4;//初始密码位
read[2]=4;//初始密码位
read[3]=4;//初始密码位
read[4]=4;//初始密码位
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
delay_ms(500);
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
}
if((P1IN&BIT3)==0)//确认键按下
{
if(number==5)
{
if((lock&BIT1)==BIT1)//修改密码 xxxx xx1x & 0000 0010 = 0000 0010
{
BUZ;
c_mima[0]=read[0];
c_mima[1]=read[1];
c_mima[2]=read[2];
c_mima[3]=read[3];
c_mima[4]=read[4];
EraseSectorFlash(0x3000);//擦除
WriteFlash(0x3000,c_mima,5);//保存密码(掉电保存)
//0x3000,是Flash块的初始地址
lock&=(~BIT1);//0000 0010 -> 1111 1101 清空lock第二位 取反
delay_ms(50);
while((P1IN&BIT3)==0);//确认键按下
BUZ0;//不响
delay_ms(50);
}
else//lock不等于2并且number=5,最后一个按键是按下状态下
{
if((z_mima[0]==read[0])&&(z_mima[1]==read[1])&&(z_mima[2]==read[2])&&(z_mima[3]==read[3])&&(z_mima[4]==read[4]))//如果5位密码都上主密码可以控制次密码
{//判断输入的密码已近与主密码匹配,LOCK值没有被改变
delay_ms(50);
while((P1IN&BIT3)==0 );//按键是否还是按下状态,
delay_ms(50);
while((P1IN&BIT3)==BIT3)//按键松开
{
delay_ms(50);
i++;
if(i>=20)break;
} //此时按一下的状态I=20.按两下i是<20
if(i>=20)//表示按一下
{
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//不响
lock^=BIT0;//0000 0001 ^ 0000 0001=0000 0000异或
while((P1IN&BIT3)==0);
delay_ms(50);
}
else//按两下,i<20
{
BUZ;//蜂鸣器响
delay_ms(500);
BUZ0;//停止蜂鸣器
delay_ms(500);
BUZ;//蜂鸣器响
delay_ms(200);
BUZ0;//不响
lock|=BIT1;//表示修改密码 0x xxxx xxxx |= 0x000 2(0010)=0x xxxx xx1x char 0000 0000
}
}
else//主密码不匹配
if((lock&BIT0)==0)//没有锁定次密码
{
if((c_mima[0]==read[0])&&(c_mima[1]==read[1])&&(c_mima[2]==read[2])&&(c_mima[3]==read[3])&&(c_mima[4]==read[4]))//如果5位密码都对上则开锁
{
BUZ;
delay_ms(200);
BUZ0;//不响
P2OUT=0xfe;//开锁,P2.0输出低电平
delay_ms(500);
P2OUT=0xf0;//p2.0-2.3都输出低电平
delay_ms(10000);//等待一段时间
P2OUT=0xfd;//关锁 p2.1输出低电平 其他输出高电频
delay_ms(500);
P2OUT=0xf0;//p2.0-2.3都输出低电平
}
else
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}}
else
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}
}
}
else//number不等于5情况下
{
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0;//不响
delay_ms(500);
P3OUT|=BIT0;//蜂鸣器响
delay_ms(500);
P3OUT&=~BIT0; //不响
}
read[0]=4;//初始密码位
read[1]=4;//初始密码位
read[2]=4;//初始密码位
read[3]=4;//初始密码位
read[4]=4;//初始密码位
number=0;
}
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;//关看门狗
P2OUT=0x00;//初始P2化端口
P2DIR=0xff;//配置P2端口为输出
P3DIR=0xff;//配置P3端口为输出
P3OUT=0;
ReadFlash(0x3000,c_mima,5);//读Flash
while(1)
{
read_key();//调用读按键函数
}
}
void ReadFlash(USHORT wAddr,UCHAR *bBuf,UCHAR bLen)//读取flash数据,地址、数据、数据长度
{
while (bLen--)//不能超过制定长度
{
*bBuf++=*(UCHAR *)wAddr++;
}
return;
}
/***FUNC+*********************************************************************/
/* Name : Init_Led */
/* Descrp : init led I/O */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
BOOL WriteFlash(USHORT wAddr,UCHAR *bBuf,UCHAR bLen)//写flash数据,地址、数据、数据长度
{
UCHAR reg1,reg2;
reg1=_BIC_SR(GIE);
reg2=IE1;
IE1=0;
while (bLen--) //不能超过制定长度
{
while (FCTL3&WAIT_BUSY)//检测忙
{
;
}
FCTL3 = FWKEY;
FCTL1 =FWKEY+WRT;
*(UCHAR *)wAddr++=*(bBuf++);//向地址里写数据
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;
}
if(reg1&GIE)
{
_BIS_SR(GIE);
}
IE1=reg2;
return TRUE;
}
/***FUNC+*********************************************************************/
/* Name : Init_Led */
/* Descrp : init led I/O */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void EraseSectorFlash(USHORT wAddr)//擦除
{
UCHAR reg1,reg2;
reg1=_BIC_SR(GIE); //Global Interrupt Enable
reg2=IE1;
IE1=0;
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL3 = FWKEY;
FCTL1 = FWKEY+ERASE;
*(UCHAR *)wAddr=0;
while(FCTL3&WAIT_BUSY)
{
;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY+LOCK;
if(reg1&GIE)
{
_BIS_SR(GIE);
}
IE1=reg2;
return;
}