📄 键盘显示.c
字号:
#include<reg51.h>
sbit a0=P2^0;
sbit a1=P2^1;
sbit a2=P2^2;
sbit a3=P2^3;
sbit a4=P2^4;
sbit a5=P2^5;
sbit a6=P2^6;
sbit a7=P2^7;
unsigned char i,j,k,l,m,n,temp,function,shijian=0;
unsigned char key,count,num[8],bh[8];
void delay(count) //延时count MS//
{
for(i=0;i<5*count;i++)
for(j=0;j<100;j++);
}
unsigned char KEYZHI() //按键扫描程序//
{
k=0;
while(k==0) //扫描//
{
do
{
P1=0xf0;
}
while ((0xf0&P1)==0xf0) ; //有按下?有则跳出do……while循环//
delay(5); //延时,防干扰//
if((0xf0&P1)==0xf0) k=0; //真的按下去了吗?延时后再作判断//
else k=1;
}
P1=0x0f;
//扫描行,得出行号j//
switch(P1)
{
case 0x0e: j=0;break;
case 0x0d: j=1;break;
case 0x0b: j=2;break;
case 0x07: j=3;break;
default: break;
}
P1=0xf0; //扫描列,得出列号i//
switch(P1)
{
case 0xe0: i=0;break;
case 0xd0: i=1;break;
case 0xb0: i=2;break;
case 0x70: i=3;break;
default: break;
}
return(i+4*j); //返回键值,供下面作数据处理//
}
void DF() //等待按键释放程序//
{
n=0;
while(n==0)
{
do
{
P1=0x0f;
}
while((0x0f&P1)!=0x0f); //等待按键释放,即若没有放开则一直循环//
delay(5); //放开键后消抖//
P1=0x0f;
if((0x0f&P1)!=0x0f) //真的放开了吗?延时后再次判断//
n=0;
else
n=1;
}
}
void timer0_ISR() interrupt 1 //中断服务 完成选通及显示//
{
EA=0; //关中断//
TH0=0xf9 ;
TL0=0x17 ;
//一次中断只完成一个数码管的扫描//
if((function==0)|(function==1)) //function变量专为闪烁配置//
{
if(function==1) //function为1将实现闪烁//
{
++shijian;
if(shijian==200) function=2; //时间从0加到100后function变为2,进入下面的else if(…)//
}
m=P2;
m=0x70 & m; //m为位选通变量//
switch(m) //扫描显示;a6,a5,a4为下次选通先给P2高位赋值//
{
case 0x60 : P2=num[7];a6=1; a5=1; a4=1; break;
case 0x70 : P2=num[0];a6=0; a5=0; a4=0; break;
case 0x00 : P2=num[1];a6=0; a5=0; a4=1; break;
case 0x10 : P2=num[2];a6=0; a5=1; a4=0; break;
case 0x20 : P2=num[3];a6=0; a5=1; a4=1; break;
case 0x30 : P2=num[4];a6=1; a5=0; a4=0; break;
case 0x40 : P2=num[5];a6=1; a5=0; a4=1; break;
case 0x50 : P2=num[6];a6=1; a5=1; a4=0; break;
}
}
else if(function==2)
{
P2=0x0a; //为灭掉数码管赋值//
++shijian;
if(shijian==200)
{
shijian=0;
function=1;
} //shijian从0加到200后function为1,为下次闪烁给出条件//
}
EA=1; //开中断//
}
void main()
{
EA=1; //开中断//
TMOD=0x01; //定时器模式1//
ET0=1;
TR0=1;
P3=0x00;
TH0=0xfe ;
TL0=0x17 ;
P3=0x00;
for(i=0;i<=7;i++)
num[i]=0; //数组作为显示缓存,预先赋初值0//
P0=0x01;
while(1)
{
P1=0x0f;
key=KEYZHI();
DF();
switch(key) //由键值进入数据处理,最后数据存入数组中,待显示//
{
case 10 : function=0;temp=num[0];for(i=0;i<7;i++) {num[i]=num[i+1];}num[7]=temp;break; //左移//
case 11 : function=0;temp=num[7];for(i=7;i>0;i--) {num[i]=num[i-1];}num[0]=temp;break; //右移//
case 12 : function=1;break; //闪烁//
case 13 : function=0;break; //控制闪烁//
case 14 : function=0;for(i=0;i<8;i++)num[i]=0; break; //清零//
case 15 : function=0;for(i=0;i<8;i++)num[i]=10;break; //消隐:数组存入10,数码管无显示//
default : function=0;
for(i=0;i<7;i++) //0-9数字直接显示//
{ j=i+1; num[i]=num[j]; } num[7]=key; break; //num[7]存放右边第一块数码管的将要显示的数值,依次类推//
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -