运用了模块化编程的方式创了一个function头文件
#ifndef __SLEEP_FUNC__ #define __SLEEP_FUNC__ void sleep(unsigned int bs);//耗时半秒 #endif #ifndef __SMG_FUNC__ #define __SMG_FUNC__ void SMG(int p2,int p0);//数码管显示位置,数字 #endif #ifndef __JZAJ_FUNC__ #define __JZAJ_FUNC__ int JZAJ(void);//获取矩阵键盘第几按键 #endif
和function.c功能文件实现封装和接口
#include#include "function.h" void sleep(unsigned int bs) { int i,j; while(bs--) { i=2,j=200; do { while(--j); }while(--i); } } void SMG(int p2,int p0) { int i=200; switch(p2) { case 1:P2_2=1;P2_3=1;P2_4=1;break; case 2:P2_2=0;P2_3=1;P2_4=1;break; case 3:P2_2=1;P2_3=0;P2_4=1;break; case 4:P2_2=0;P2_3=0;P2_4=1;break; case 5:P2_2=1;P2_3=1;P2_4=0;break; case 6:P2_2=0;P2_3=1;P2_4=0;break; case 7:P2_2=1;P2_3=0;P2_4=0;break; case 8:P2_2=0;P2_3=0;P2_4=0;break; default :P2_2=1;P2_3=1;P2_4=1;break; } switch(p0) { case 0:P0=0x3F;break; case 1:P0=0x06;break; case 2:P0=0x5B;break; case 3:P0=0x4F;break; case 4:P0=0x66;break; case 5:P0=0x6D;break; case 6:P0=0x7D;break; case 7:P0=0x07;break; case 8:P0=0x7F;break; case 9:P0=0x6F;break; default :P0=0x3F;break; } while(--i); P0=0x00; } int JZAJ(void) { P1=0xFF;P1_3=0; if(P1_7==0){sleep(1);while(P1_7==1) return 1;} if(P1_6==0){sleep(1);while(P1_6==1) return 5;} if(P1_5==0){sleep(1);while(P1_5==1) return 9;} if(P1_4==0){sleep(1);while(P1_4==1) return 13;} P1=0xFF;P1_2=0; if(P1_7==0){sleep(1);while(P1_7==1) return 2;} if(P1_6==0){sleep(1);while(P1_6==1) return 6;} if(P1_5==0){sleep(1);while(P1_5==1) return 10;} if(P1_4==0){sleep(1);while(P1_4==1) return 14;} P1=0xFF;P1_1=0; if(P1_7==0){sleep(1);while(P1_7==1) return 3;} if(P1_6==0){sleep(1);while(P1_6==1) return 7;} if(P1_5==0){sleep(1);while(P1_5==1) return 11;} if(P1_4==0){sleep(1);while(P1_4==1) return 15;} P1=0xFF;P1_0=0; if(P1_7==0){sleep(1);while(P1_7==1) return 4;} if(P1_6==0){sleep(1);while(P1_6==1) return 8;} if(P1_5==0){sleep(1);while(P1_5==1) return 12;} if(P1_4==0){sleep(1);while(P1_4==1) return 16;} return 0; }
最后主函数调用 //功能是通过K1K2两个独立按键控制数码管数字变换和移位
#include#include "function.h" int main() { int i=4; SMG(i,i); while(1) { if(P3_1==0) { sleep(1); while(P3_1==1) { if(i==1) i=9; SMG(--i,i);break; } if(i==0) i=8; } if(P3_0==0) { sleep(1); while(P3_0==1) { if(i==8) i=0; SMG(++i,i);break; } if(i==9) i=1; } } return 0; }
矩阵键盘LCD密码锁
#include#include "LCD1602.h" #include "function.h" int key=0; int password=0; int right=6666; int main() { LCD_Init();//LCD初始化 LCD_ShowString(1,1,"password?"); while(1) { key=JZAJ();//矩阵键盘获取key if(key&&key<=10&&password<=999)//1~10号键输入数字 { password*=10; password+=key%10;//在输入4位以内数字情况下移位,10号键取余为0 } if(key==16)//16号键为判断键 { if(password==right) { LCD_ShowString(1,12," OK! "); } else LCD_ShowString(1,12,"error"); sleep(2);password=0;LCD_ShowString(1,12," ");//显示1秒后归零 } if(key==13) password/=10;//13号键是删除键 LCD_ShowNum(2,1,password,4); } return 0; }



