立即注册 登录
返回首页

uid:257886的个人空间

日志

简单拨号键盘设计

已有 752 次阅读2017-12-5 21:00

#include<Reg52.h>
int SELECT[8]={0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE}; //位选数组
int LED[17]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X40};
//LED数码管字形码集合数组
int SELECT1[2][4]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//筛选异或结果集合数组
int DISPLAY[8]={0X40,0X40,0X40,0X40,0X40,0X40,0X40,0X40};//初始化显示数组
int flag;

void delay(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//延时函数 (1ms)

void display(int wei,int L[])//wei为位选数目
{  
int k;
for(k=0;k<wei;k++){
P0=SELECT[wei-1-k];
P2=L[k];
delay(1);
P2=0X00;//消隐
}
}//显示函数——P0位选,P2段选

int button(int pp,int new)//p1为0X0F(筛选行)或0XF0(筛选列)
{ int a,p,q,m;//new为当前P1端口按键状态,a为异或结果,p、q为循环计数变量,m为所在行、列
if(new==pp)
{flag=0;return flag;} //未有按键按下标志
else{
delay(1);
if(new!=pp)
{
a=new^pp;
for(p=0;p<2;p++)
for(q=0;q<4;q++)
if(SELECT1[p][q]==a) m=q+1; //遍历异或结果集合数组后找到所在行、列
return m;
}//筛选出行或列
}//判断按键所在行列位置,P1为按键接口端

void main()
{ int x,y,sum,n,temp;//x为行,y为列,sum为键值
while(1){
P1=0X0F;temp=P1;
x=button(0X0F,temp);
P1=0XF0;temp=P1;//用于判断是否是新的按键值
y=button(0XF0,temp);
if(y==0)
display(8,DISPLAY);
else{
flag++;
sum=4*(x-1)+(y-1);
if(flag==1)
for(n=0;n<7;n++)
DISPLAY[n]=DISPLAY[n+1];
DISPLAY[7]=LED[sum];//更改显示数组
display(8,DISPLAY) ;
}
}
}
 

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部