完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include #include #include #define BITL (0xFFC3) #define uchar unsigned char #define uint unsigned int #define ulong unsigned long int x=0; //位移数 int z; int c=0; int e=0;//用于判断是否输入正确密码 int o=0;//判断输入个数 显示* —— 以及屏蔽显示* —— unsigned int num = 0; int initial[4]={1,2,3,4}; int passward[4]; int t=0;//用于修改initial[4] int flag1=0;//修改密码标志位 void KeySearch();//按键扫描函数 void code_change();//密码修改函数 void Weight_star();//显示星号* void Weight_change(); void Weight_OK(); void Weight_wrong(); void Weight_rst(); void System_init(); void judge();//决策函数 void Weight_change1(); /***************声明部分 开始***************/ void ProgramInit();//系统初始化函数 void delay(); void delay_ms(int x);//延时函数1ms void KeySearch();//按键扫描函数 void Key_invalid();//密码输入错误警告函数 void Beeper();//蜂鸣器报警函数 void Warning();//人体感应模块报警函数 void UART_send_byte(unsigned char dat); void UART_send_string(unsigned char *buf); unsigned char Warning_Flag = 0;//人体感应模块工作标志位 unsigned char RightKey_Flag = 0;//密码输入正确标志位||注意:在按键扫描case16中复位 unsigned char WrongKey_Flag = 0;//密码输入错误标志位 unsigned char module;//人体感应模块变量 高电平检测到人体 unsigned char Buf[]="Warning!!!n"; /***************声明部分 结束***************/ void main() { WDTCTL = WDTPW+WDTHOLD; // Stop WDT System_init();//初始化 ProgramInit();//系统初始化 ui8Task_Status=TASK8; Weight_Graph();//在屏幕上显示基础的东西 如 边框和Please enter code 等 while(1) { KeySearch(); Weight_Num(num); /* Weight_star();*/ // delay_ms(500); /* if(num == 15) { o=5; judge(); } if(num == 14) { code_change(); }*/ // Warning(); //人体感应模块报警函数 } } void KeySearch()//按键扫描函数 { unsigned int n = 0; int a=0; int t=0; int flag=0; flag=0; n=num; for(a=0;a<4;a++) { if(a==0) { P2OUT &= ~BIT2; //给P2.2-2.5循环输出输出低电平(输出的默认值为0) 同时其余三个为高 必须为低 *行* P2OUT |= BIT3; P2OUT |= BIT4; P2OUT |= BIT5; } if(a==1) { P2OUT &= ~BIT3; P2OUT |= BIT2; P2OUT |= BIT4; P2OUT |= BIT5; } if(a==2) { P2OUT &= ~BIT4; P2OUT |= BIT3; P2OUT |= BIT2; P2OUT |= BIT5; } if(a==3) { P2OUT &= ~BIT5; P2OUT |= BIT3; P2OUT |= BIT4; P2OUT |= BIT2; } for(t=0;t<2;t++) //列扫描 { /* P1OUT |= BIT3; P1OUT |= BIT4; P1OUT |= BIT5; P1OUT |= BIT6;*/ if(t==0) { delay_ms(30); if ((P1IN & BIT3)==0) //p1.3为0 { num=a*4+t+1; flag=1; o++; while((P1IN & BIT3) == 0);//等待按键抬起 delay_ms(20);//抬起延时消抖 } } if(t==1) { delay_ms(30); if ((P1IN & BIT4)==0) { num=a*4+t+1; flag=1; o++; while((P1IN & BIT4) == 0);//等待按键抬起 delay_ms(20);//抬起延时消抖 } } /* if(t==2) { delay_ms(30); if ((P1IN & BIT5)==0) { num=a*4+t+1; flag=1; o++; while((P1IN & BIT5) == 0);//等待按键抬起 delay_ms(20);//抬起延时消抖 } } if(t==3) { delay_ms(30); if ((P1IN & BIT6)==0) { num=a*4+t+1; flag=1; o++; while((P1IN & BIT6) ==0);//等待按键抬起 delay_ms(20);//抬起延时消抖 } }*/ if(flag==1) break; } if(flag==1) break; } switch(num) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 10: break; case 11: break; case 12: break; case 13: break; case 14: break; case 15: break;//确定键 case 16: { RightKey_Flag = 0; Weight_rst(); delay_ms(500); break;//显示复位按键 } default:break; } if(n!=num) //检测到按键按下,存密码 { c++; } passward[c-1]=num; } void Weight_star() { GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 if(o!=5) { for(z=2;z<6;z++) { GrStringDrawCentered(&g_sContext, "__", AUTO_STRING_LENGTH,z*18, 50, OPAQUE_TEXT); } if(c>0) { GrStringDrawCentered(&g_sContext, "*", AUTO_STRING_LENGTH,c*18+18, 40, OPAQUE_TEXT); } } GrFlush(&g_sContext); } void Weight_change() //显示功能 { Weight_change1(); //显示:enter new code GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 if(o!=5) { for(z=2;z<6;z++) { GrStringDrawCentered(&g_sContext, "__", AUTO_STRING_LENGTH,z*18, 50, OPAQUE_TEXT); } if(c>0) { GrStringDrawCentered(&g_sContext, "*", AUTO_STRING_LENGTH,c*18+18, 40, OPAQUE_TEXT); } } GrFlush(&g_sContext); } void Weight_OK() { GrClearDisplay(&g_sContext);//清屏功能 GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 if(c>0) { GrStringDrawCentered(&g_sContext, " Welcome! ", AUTO_STRING_LENGTH,65, 35, OPAQUE_TEXT); } GrFlush(&g_sContext); } void Weight_wrong() { GrClearDisplay(&g_sContext);//清屏功能 GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 if(c>0) { GrStringDrawCentered(&g_sContext, " Don't touch! ", AUTO_STRING_LENGTH,65, 35, OPAQUE_TEXT); } GrFlush(&g_sContext); } void judge() { if((passward[0]==initial[0])&&(passward[1]==initial[1])&&(passward[2]==initial[2])&&(passward[3]==initial[3])) { e=1; } if( e==1) { Weight_OK();//显示 成功输入正确密码 RightKey_Flag = 1; P2OUT &= ~BIT0; } else { Weight_wrong();//显示 密码输入错误 P2OUT |= BIT0; WrongKey_Flag = 1; } } void Weight_rst() //复位 { o=0; e=0; c=0; Weight_Graph();//在屏幕上显示基础的东西 如Please enter code 等 GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 if(o!=5) { for(z=2;z<6;z++) { GrStringDrawCentered(&g_sContext, "__", AUTO_STRING_LENGTH,z*18, 50, OPAQUE_TEXT); } if(c>0) { GrStringDrawCentered(&g_sContext, "*", AUTO_STRING_LENGTH,c*18+18, 40, OPAQUE_TEXT); } } GrFlush(&g_sContext); } void code_change() { delay_ms(1500); o=0; c=0; flag1=0; while(1) { t=num; //t=14 KeySearch(); Weight_change(); delay_ms(500); if(num==15) { flag1=1; o=0; break; delay_ms(1500); } if(flag1==1) break; if(o==4) { int k=0; for(k=0;k<4;k++) { initial[k]=passward[k]; } } } } void System_init() { //-----系统相关初始化----- Ports_init(); //初始化IO SysClk_init(); //初始化时钟为25MHz P4SEL = BIT4+BIT5; UCA1CTL1 |= UCSWRST; // **Put state machine in reset** UCA1CTL1 |= UCSSEL_1; // CLK = ACLK UCA1BR0 = 0x0D; // 2400 (see User's Guide) UCA1BR1 = 0x00; // UCA1MCTL |= UCBRS_6+UCBRF_0; // Modulation UCBRSx=6, UCBRFx=0 UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt TA1CCTL0 = CCIE; // CCR0 interrupt enabled TA1CCR0 = 1000-1; TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR delay_ms(100); //延时100ms LED_init(); //初始化LP板上LED Key_init(); //各种按键初始化 //-----显示库函数初始化----- Template_DriverInit(); GrContextInit(&g_sContext, &g_sTemplate_Driver); GrContextForegroundSet(&g_sContext, ClrWhite); GrContextBackgroundSet(&g_sContext, ClrBlack); GrContextFontSet(&g_sContext, &g_sFontCm16b); GrClearDisplay(&g_sContext); } void Weight_change1() //显示:enter new code { //---------Draw Title---------- GrClearDisplay(&g_sContext);//清屏功能 //GrTaskRectDraw();//画边框,已注释 //---------绘制图标------------ // GrStringDrawCentered(&g_sContext, "*C", AUTO_STRING_LENGTH, 75, 40, OPAQUE_TEXT); GrContextFontSet(&g_sContext, &g_sFontCm16b); //设置大字体 GrStringDrawCentered(&g_sContext, " enter new code", AUTO_STRING_LENGTH,65, 10, OPAQUE_TEXT); GrFlush(&g_sContext); // ui8Flush_Flag=FLUSH_OFF; //绘制小数点 } /***************中断服务函数部分 开始***************/ // Timer0 A0 interrupt service routine // 定时器A中断服务程序 #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { P1OUT ^= 0x01; // 反转P1.0口状态 module = P3IN; if(module & BIT0 == 0) { P4OUT &= ~BIT1; } } //外部中断S1服务函数 #pragma vector = PORT2_VECTOR//P2.1按键(S1)外部中断 __interrupt void Port_2(void) { delay_ms(50); if((P2IN & BIT1) == 0) { P4OUT ^= BIT7; P2IFG &= ~BIT1; // 清除P2.1口中断标志位 } } // USCI_A1中断服务程序 #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) { switch(__even_in_range(UCA1IV,4)) { case 0:break; // 中断向量0—无中断 case 2: // 中断向量2—接收中断 while (!(UCA1IFG&UCTXIFG)); // USCI_A1 是否发送完成 UCA1TXBUF = UCA1RXBUF; // 将接收缓冲寄存器的字符传送给发送缓冲寄存器,发送给PC,在串口调试助手中回显。 break; case 4: // 中断向量4-发送中断 break; default: break; } } /***************中断服务函数部分 结束***************/ /***************子程序部分 开始***************/ void ProgramInit()//系统初始化函数 { P1DIR |= BIT0; // P1.0 LED output P2DIR |= BIT0; P2DIR |= ~BITL; // 设P2.2-2.5为输出方式(矩阵键盘) P2OUT &= BITL; //给P2.2-2.5输出低电平(输出的默认值为0)必须为低(矩阵键盘) P4DIR |= BIT1+BIT7; // P4.1 操作蜂鸣器||P4.7 LED output P4REN |= BIT1; P4OUT &= ~BIT1; // P4.1下拉电阻 使能 P2REN |= BIT1; P2OUT |= BIT1; // P2.1上拉电阻 使能 P2IES |= BIT1; // P2.1下降沿触发中断 P2IFG &= ~BIT1; // 清除P2.1口中断标志位 P2IE |= BIT1; // P2.1中断使能 TA1CCTL0 = CCIE; // CCR0 interrupt enabled TA1CCR0 = 2000-1; //1000-1 TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR __bis_SR_register(GIE); // 启用可屏蔽中断 } void delay()//延时函数(蜂鸣器用) { volatile unsigned int i,j; for(i=50000;i>0;i--); // delay } void delay_ms(int x) //延时函数1ms { volatile unsigned int i,j; for(i=0;i } void Beeper()//蜂鸣器报警函数 { P4OUT |= BIT1; delay(1500); P4OUT &= ~BIT1; delay(1500); P4OUT |= BIT1; delay(1500); P4OUT &= ~BIT1; delay(1500); } void Key_invalid()//密码输入错误警告函数 { printf("Password input errorn"); WrongKey_Flag = 0; } void Warning()//人体感应模块报警函数 { if(RightKey_Flag == 0) { if(module & BIT0) { UART_send_string(Buf); Beeper(); } } if(WrongKey_Flag == 1) { Key_invalid(); } } void UART_send_byte(unsigned char dat)//UART 发送一字节 { UCA1TXBUF = dat; while (!(UCA1IFG&UCTXIFG)); UCA1IFG = 0; } void UART_send_string(unsigned char *buf)//UART 发送字符串 { while (*buf != ' |