📄 键盘显示2.c
字号:
#include <reg52.h>
#include <absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit STR = P3^6;//定义CD4094各端口;
sbit DATA = P3^0;
sbit CLK = P3^1;
void delays(uint); //延时函数
void Out_4094(uchar);//发送代码函数
uchar kbscan(); //判断键是否按下
uchar keyadr(); //得到键位置函数
uchar keyzhi(uchar); //得到键值函数
void led_xs();
int xianshi[]={16,16,16,16};
//int xianshi[]={6,5,2,1};
void main()
{uchar key,get;
int i=0,k=0; //k为按键计数
int sudu=0; //速度控制
led_xs(); //调用4个数码管显示函数
while(1)
{ delays(15000); //上一按键与下一按键间就有一时间差,此时间刚好
i=kbscan(); //判断键是否按下
if(i==1)
{ delays(600); //延时去抖动
// led_xs(); //调用4个数码管显示函数
}
i=kbscan(); //再次判断键是否按下
if(i==1) //表明有键按下,并要清i为0(也可不清)
{ key=keyadr(); //调用得到键位置函数
get=keyzhi(key); //调用得到键值函数
if(0<=get&&get<=9)
{ xianshi[0]=xianshi[1];xianshi[1]=xianshi[2];
xianshi[2]=xianshi[3];xianshi[3]=get;
k++;
if(k==4) k=0;
led_xs(); //调用4个数码管显示函数
}
else if(get==10)
{ sudu=xianshi[3]*1000+xianshi[2]*100+xianshi[1]*10+xianshi[0];
xianshi[3]=sudu%10;
// led_xs(); //调用4个数码管显示函数
// printf("sudu=%d\n",sudu);
}
else if(get==11)
{xianshi[3]=0;xianshi[2]=0;xianshi[1]=0;xianshi[0]=0;
led_xs(); //调用4个数码管显示函数
}
// else {}
}
}
}
void delays(uint a) //延时子函数;
{uint b;
for(b=0;b<a;b++);
}
uchar kbscan() //判断是否有键按下
{ P1=0xf0;
if((P1&0xf0)!=0xf0) //若有键按下
return 1;
else return 0;
}
uchar keyadr() //得到键位置函数
{
uchar sccode,recode,keytemp=0; //取为0是为了keytemp|=(~sccode)+(~recode)不多加keytemp考虑
int i=1; //控制循环
sccode=0xfe;
while(i==1)
// while((sccode|0xf0)!=0xff) // 循环不好控制
// while(sccode!=0xef) 对 // 循环不好控制
// while((sccode&0xf0)!=0) 错
{ P1=sccode;
// if((P1&0xf0)!=0xf0) 错
// if(P1!=sccode) //应该也行
if((P1&sccode)!=sccode)
{ recode=P1&0xf0|0x0f;
keytemp|=(~sccode)+(~recode);
i=0;
// sccode=sccode<<1|0x01; //得到键位置后继续扫描,使循环完成.与上控制对应
}
else
sccode=sccode<<1|0x01;
}
return(keytemp);
}
uchar keyzhi(uchar key2) //读键值
{uchar key1;
switch(key2)
{ case 0x11:key1 =7;break; //P10+P14
case 0x21:key1 =8;break; //P10+P15
case 0x41:key1 =9;break; //P10+P16
case 0x81:key1 =10;break; //P10+P17
case 0x12:key1 =4;break; //P11+P14
case 0x22:key1 =5;break; //P11+P15
case 0x42:key1 =6;break; //P11+P16
case 0x82:key1 =11;break; //P11+P17
case 0x14:key1 =1;break; //P12+P14
case 0x24:key1 =2;break; //P12+P15
case 0x44:key1 =3;break; //P12+P16
case 0x84:key1 =12;break; //P12+P17
case 0x18:key1 =13;break; //P13+P14
case 0x28:key1 =0;break; //P13+P15
case 0x48:key1 =14;break; //P13+P16
case 0x88:key1 =15;break; //P13+P17
}
return(key1);
}
void led_xs() //得到4个数码管字形,并调用函数显示
{ int i;
uchar j;
uchar codec[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, //共阴极数码管字形码,从高位开始发时用。
0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};
for(i=0;i<4;i++)
{
j=codec[xianshi[i]];
// delays(5000); //延时
Out_4094(j); //调用发送代码函数
// delays(5000); //延时
}
}
void Out_4094(uchar data1)
{ int j;
STR=0; //保持然来的状态不变;
for(j=0;j<8;j++)
{ DATA=(data1%2); data1>>=1;
CLK=0; //形成上升延脉冲;
// _nop_();
// _nop_(); //延时;
// _nop_();
CLK=1;
}
STR=1; //数据送完;更新显示;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -