运用了模块化编程的方式创了一个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 <REGX52.H>
#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 <REGX52.H>
#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 <REGX52.H>
#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;
}

被折叠的 条评论
为什么被折叠?



