矩阵键盘和数码管制作计算器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
z=x+y;
}
if (flag_dec==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0] ; //构造被减数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0] ; //构造减数
uchar code lab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x80,0x00,0x76,0x3e}; //点暗H U
uchar buffer[4]; // ={}
}
/************************************************************
************************************************************/
void digitin(uchar val) //移动
{
case 0x00 : digitin(1); break; // 0 4 8 c
case 0x04 : digitin(2); break; // 1 5 9 d
case 0x08 : digitin(3); break; // 2 6 a e
case 0x01 : digitin(4); break; // 3 7 b f
case 0x0a : digitin(9); break; // 7 8 9 ×
case 0x07 : digitin(0); break; // 0 =/
case 0x0c : savex(); //加号键
clr();
flag_add=1;
digitin(0x0a);
digitin(0x0d);
是否有键按下?
************************************************************/
uchar keysearch()
{
uchar k;
P0=0xf0;
k=P0;
k=~k;
k=k&0xf0;
return k; //k=0x10 , 0x20 ,0x40,0x80列
z=x*y;
}
if (flag_chu==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0]; //构造被除数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0]; //构造除数
display();
clr();
break;
case 0x0e : savex(); //乘号键
clr();
digitin(0x0);
digitin(0x12);//对应十进制18,对应显示H
digitin(0x0e);
flag_che=1;
for(i=0;i<100;i++)
display();
clr();
void clr()
{
uint i;
for(i=0;i<4;i++)
{
buffer[i]=0x11;//
}
}
/************************************************************
显示函数
************************************************************/
{
P0=a;
c=P0; //得到键值如下:
if((c&0x10)==0) keynumb=kr+0x00; // 0 4 8 c
if((c&0x20)==0) keynumb=kr+0x04;// 1 5 9 d
if((c&0x40)==0) keynumb=kr+0x08;// 2 6 a e
if((c&0x80)==0) keynumb=kr+0x0c;//3 7 b f
savex();
savey();
break;
case 0x0b : savey();//等号键
if (flag_add==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0] ; //构造被加数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0] ; //构造加数
a=_crol_(a,1);
}
}
do
{
a=keysearch();
display();
}
while(a!=0); //等待按键释放
return keynumb; //0~f
}
/************************************************************
按键处理函数
uchar keys()
{
uchar a,c,kr,keynumb;
a=keysearch();
if(a==0) //按键检测
return 0xff;
else display();//延时消抖
a=keysearch();
if(a==0) //再次检测
return 0xff;
else
{
a=0xfe;
for(kr=0;kr<4;kr++)
************************************************************/
void keybranch(uchar k)// k为返回的键值keynumb
{
uchar i,j,flag_add,flag_dec,flag_che,flag_chu;
switch(k)
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************Biblioteka Baidu***************
************************************************************/
z=x/y;//
}
buffer[3]=z/1000;
buffer[2]=z%1000/100;
buffer[1]=z%100/10;
buffer[0]=z%10;
for(i=0;i<4;i++) //j的初值为0
{
if(buffer[i]!=0)
j=i+1;
if(j==0) j=1; //处理缓冲区,使数码管显示最高位非零
break;
case 0x0f : savex(); //chu号键
clr();
digitin(0x0c);
digitin(0x012);
digitin(0x13);
flag_chu=1;
for(i=0;i<100;i++)
display();
clr();
break;
case 0x03: clr(); //清零键
z=x-y;
}
if (flag_che==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0]; //构造被乘数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0]; //构造乘数
************************************************************/
}
for(;j<4;j++)//最高位零不显示
buffer[j] = 0x11; // buffer[0x11]对应的显示值是空屏
break;
default: break;
}
}
/************************************************************
主函数
void display()//显示程序
{
uchar i,temp;
temp =0xef;
for(i=4;i>0;i--)
{
P2=lab[buffer[i-1]];
P1=temp;
temp=(temp<<1)|0x01;
delay(3);
}
}
/************************************************************
************************************************************/
void savey()
{
uint i;
for(i=0;i<4;i++)
{
if(buffer[i]==0x11)
buffery[i]=0;
else
buffery[i]=buffer[i];
case 0x05 : digitin(5); break; //
case 0x09 : digitin(6); break; //数码管显示
case 0x02 : digitin(7); break; // 1 2 3 +
case 0x06 : digitin(8); break; // 4 5 6 -
void savex()
{
uint i;
for(i=0;i<4;i++)
{
if(buffer[i]==0x11)
bufferx[i]=0;
else
bufferx[i]=buffer[i];
}
}
/************************************************************
digitin(0x0d);
for(i=0;i<100;i++)
display();
clr();
break;
case 0x0d : savex(); //减号键
clr();
digitin(0x0d);
digitin(0x0e);
digitin(0x0c);
flag_dec=1;
for(i=0;i<100;i++)
{
int i;
for(i=3;i>0;i--)
buffer[i]=buffer[i-1];
buffer[0]=val;
}
/************************************************************
按键函数
************************************************************/
/************************************************************
制作人:火柴
2011-07-14
************************************************************
************************************************************
uchar bufferx[4],buffery[4];
uint x,y,z;
/************************************************************
延时函数
************************************************************/
计算器+ -×/
使用说明:4×4矩阵键盘+数码管
P0:矩阵键盘p1:位选P2:段选
矩阵键盘示意图如下:
123+
456-
789×
清屏0 = /
************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/************************************************************
查表
************************************************************/
}
}
/************************************************************
清零函数0x11->十进制17,lab[17]=0x00数码管暗,无显示
************************************************************/
}
if (flag_dec==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0] ; //构造被减数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0] ; //构造减数
uchar code lab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x80,0x00,0x76,0x3e}; //点暗H U
uchar buffer[4]; // ={}
}
/************************************************************
************************************************************/
void digitin(uchar val) //移动
{
case 0x00 : digitin(1); break; // 0 4 8 c
case 0x04 : digitin(2); break; // 1 5 9 d
case 0x08 : digitin(3); break; // 2 6 a e
case 0x01 : digitin(4); break; // 3 7 b f
case 0x0a : digitin(9); break; // 7 8 9 ×
case 0x07 : digitin(0); break; // 0 =/
case 0x0c : savex(); //加号键
clr();
flag_add=1;
digitin(0x0a);
digitin(0x0d);
是否有键按下?
************************************************************/
uchar keysearch()
{
uchar k;
P0=0xf0;
k=P0;
k=~k;
k=k&0xf0;
return k; //k=0x10 , 0x20 ,0x40,0x80列
z=x*y;
}
if (flag_chu==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0]; //构造被除数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0]; //构造除数
display();
clr();
break;
case 0x0e : savex(); //乘号键
clr();
digitin(0x0);
digitin(0x12);//对应十进制18,对应显示H
digitin(0x0e);
flag_che=1;
for(i=0;i<100;i++)
display();
clr();
void clr()
{
uint i;
for(i=0;i<4;i++)
{
buffer[i]=0x11;//
}
}
/************************************************************
显示函数
************************************************************/
{
P0=a;
c=P0; //得到键值如下:
if((c&0x10)==0) keynumb=kr+0x00; // 0 4 8 c
if((c&0x20)==0) keynumb=kr+0x04;// 1 5 9 d
if((c&0x40)==0) keynumb=kr+0x08;// 2 6 a e
if((c&0x80)==0) keynumb=kr+0x0c;//3 7 b f
savex();
savey();
break;
case 0x0b : savey();//等号键
if (flag_add==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0] ; //构造被加数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0] ; //构造加数
a=_crol_(a,1);
}
}
do
{
a=keysearch();
display();
}
while(a!=0); //等待按键释放
return keynumb; //0~f
}
/************************************************************
按键处理函数
uchar keys()
{
uchar a,c,kr,keynumb;
a=keysearch();
if(a==0) //按键检测
return 0xff;
else display();//延时消抖
a=keysearch();
if(a==0) //再次检测
return 0xff;
else
{
a=0xfe;
for(kr=0;kr<4;kr++)
************************************************************/
void keybranch(uchar k)// k为返回的键值keynumb
{
uchar i,j,flag_add,flag_dec,flag_che,flag_chu;
switch(k)
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************Biblioteka Baidu***************
************************************************************/
z=x/y;//
}
buffer[3]=z/1000;
buffer[2]=z%1000/100;
buffer[1]=z%100/10;
buffer[0]=z%10;
for(i=0;i<4;i++) //j的初值为0
{
if(buffer[i]!=0)
j=i+1;
if(j==0) j=1; //处理缓冲区,使数码管显示最高位非零
break;
case 0x0f : savex(); //chu号键
clr();
digitin(0x0c);
digitin(0x012);
digitin(0x13);
flag_chu=1;
for(i=0;i<100;i++)
display();
clr();
break;
case 0x03: clr(); //清零键
z=x-y;
}
if (flag_che==1)
{
x=bufferx[3]*1000+bufferx[2]*100+bufferx[1]*10+bufferx[0]; //构造被乘数
y=buffery[3]*1000+buffery[2]*100+buffery[1]*10+buffery[0]; //构造乘数
************************************************************/
}
for(;j<4;j++)//最高位零不显示
buffer[j] = 0x11; // buffer[0x11]对应的显示值是空屏
break;
default: break;
}
}
/************************************************************
主函数
void display()//显示程序
{
uchar i,temp;
temp =0xef;
for(i=4;i>0;i--)
{
P2=lab[buffer[i-1]];
P1=temp;
temp=(temp<<1)|0x01;
delay(3);
}
}
/************************************************************
************************************************************/
void savey()
{
uint i;
for(i=0;i<4;i++)
{
if(buffer[i]==0x11)
buffery[i]=0;
else
buffery[i]=buffer[i];
case 0x05 : digitin(5); break; //
case 0x09 : digitin(6); break; //数码管显示
case 0x02 : digitin(7); break; // 1 2 3 +
case 0x06 : digitin(8); break; // 4 5 6 -
void savex()
{
uint i;
for(i=0;i<4;i++)
{
if(buffer[i]==0x11)
bufferx[i]=0;
else
bufferx[i]=buffer[i];
}
}
/************************************************************
digitin(0x0d);
for(i=0;i<100;i++)
display();
clr();
break;
case 0x0d : savex(); //减号键
clr();
digitin(0x0d);
digitin(0x0e);
digitin(0x0c);
flag_dec=1;
for(i=0;i<100;i++)
{
int i;
for(i=3;i>0;i--)
buffer[i]=buffer[i-1];
buffer[0]=val;
}
/************************************************************
按键函数
************************************************************/
/************************************************************
制作人:火柴
2011-07-14
************************************************************
************************************************************
uchar bufferx[4],buffery[4];
uint x,y,z;
/************************************************************
延时函数
************************************************************/
计算器+ -×/
使用说明:4×4矩阵键盘+数码管
P0:矩阵键盘p1:位选P2:段选
矩阵键盘示意图如下:
123+
456-
789×
清屏0 = /
************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/************************************************************
查表
************************************************************/
}
}
/************************************************************
清零函数0x11->十进制17,lab[17]=0x00数码管暗,无显示
************************************************************/