# 实验说明
## 动态数码管
## 矩阵按键
#### 线翻转法
#软件设计
##main函数代码
# 实验总结
实验说明
按键对应为
1234
5678
9+-0
清零*/=
动态数码管
因为就是两位数的加减乘除我用到的是最右边的四个数码管,通过在函数里加if语句可以使高位不显示零,再封装一个数组将对应数字的段选码存入,方便数码管显示函数调用
矩阵按键
线翻转法就是先将行线全部置零,再去检测是哪一根列线按下,然后将列线置零,再去检测是哪一根行线按下,行列交叉就是按下的键
软件设计
延时函数相信大家都会的,就不给出代码了
#include <REGX52.H>
#include "delay.h"
unsigned int MKey()
{
static unsigned int key_value=0;
P1=0x0f;
if(P1!=0x0f)
{
Delay(1);
if(P1!=0x0f)
{
P1=0x0f;
switch(P1)
{
case 0x07: key_value=1;break;
case 0x0b: key_value=2;break;
case 0x0d: key_value=3;break;
case 0x0e: key_value=4;break;
}
P1=0xf0;
switch(P1)
{
case 0x70: key_value=key_value;break;
case 0xb0: key_value=key_value+4;break;
case 0xd0: key_value=key_value+8;break;
case 0xe0: key_value=key_value+12;break;
}
while(P1!=0xf0);
}
}
else
key_value=0;
return key_value;
}
main函数代码
#include <REGx52.H>
#include "juzheng.h"
#include "delay.h"
int key,z=0;
void display(int b );
int a[4];
int i=0;
int c[2];
int sign=0;
int num=0;
unsigned char n[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//存0-9的段选码
void main()
{
while(1)
{
key=MKey();//获取键值
if(key>=1&&key<=9)
{
num=key;//将键值存取
z=z*10+num;//初始的z为0,如果一位数就是z=num,两位数就是z=z*10+num
}
else if(key==12)//key=12 代表0,两位数第二位为0的话就是原先数乘10
z=z*10;
else if(key==13)//代表清零,c[0]则是用来存取第一个数的值
{
z=0;
c[0]=0;
}
else if(key==10)// +
{
sign=1;
c[0]=z;
z=0;
}
else if(key==11)// -
{
sign=2;
c[0]=z;
z=0;
}
else if(key==14)// *
{
sign=3;
c[0]=z;
z=0;
}
else if(key==15)// 代表除
{
sign=4;
c[0]=z;
z=0;
}
else if(key==16&&sign==1)// = sign是加减乘除的标志位,代表不同算法
{
z=z+c[0];
c[0]=0;
sign=0;
}
else if(key==16&&sign==2)
{
z=c[0]-z;
c[0]=0;sign=0;
}
else if(key==16&&sign==3)
{
z=z*c[0];
c[0]=0;sign=0;
}
else if(key==16&&sign==4)
{
z=c[0]/z;
c[0]=0;sign=0;
}
display(z );//数码管则是一直显示z的值
}
}
void display(int b )
{
/*两位乘法最多也就用到四个数码管,然后高位不显示零的话,我是用数组去存的,将b的每一位都存在数组里去
只要本位和高位有一个不为零就显示在数码管上*/
i=3;
while(i!=-1)
{
a[i]=b%10;
b=b/10;
i--;
}
P2_4=0;P2_3=1;P2_2=1;//位选数码管
if(a[0]!=0)
{
P0=n[a[0]];
Delay(1);
P0=0x00;//消隐
}
P2_4=0;P2_3=1;P2_2=0;
if(a[0]!=0||a[1]!=0)
{
P0=n[a[1]];
Delay(1);
P0=0x00;
}
P2_4=0;P2_3=0;P2_2=1;
if(a[0]!=0||a[1]!=0||a[2]!=0)
{
P0=n[a[2]];
Delay(1);
P0=0x00;
}
P2_4=0;P2_3=0;P2_2=0;
{
P0=n[a[3]];
Delay(1);
P0=0x00;
}
}
实验总结
没有去处理除法的小数和负数,只能实现正数,写到这里我就没继续研究了,最后代码有不足和需要完善的地方希望各位大神博主指出,这是我发的第一篇博客,如果有人觉得好的话,可以点赞,评论支持一下,最后谢谢大家!
工程链接可以看看这里哔哩哔哩工房 (bilibili.com)