当前位置:文档之家› 矩阵按键做计算器C程序

矩阵按键做计算器C程序

#include /*可加减乘除*/
#define dataport P0
#define keyboard P3
#define bitsel P2

unsigned char code table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8c};
unsigned char disdata[5];
unsigned char key,keytimes/*,keynum,keycode,checkok,scanok*/;
//unsigned char clrflag; //数据处理标志位
unsigned char addflag=0; //加法标志位
unsigned char subflag=0; //减法标志位
unsigned char mulflag; //乘法标志位
unsigned char divflag; //加法标志位
unsigned char datA1,datB1; //过渡数据
unsigned char dat1;//数据
void delay(unsigned char n)
{
unsigned char i,j;
for(i=0;ifor(j=0;j<115;j++);
}

void display()
{
unsigned char i;
// disdata[1]=table[dat%10];
// disdata[2]=table[dat/10%10];
// disdata[3]=table[dat/100%10];
// disdata[4]=table[dat/1000];
for(i=keytimes;i>0;i--)
{
bitsel=~(0x08>>(keytimes-i));
dataport=disdata[i];
delay(20);
dataport=0xff;
//P2=0x0f;
}
}

unsigned char keyscan()
{
unsigned char rcode;
unsigned char scode;

keyboard=0xf0;
if((keyboard&0xf0)!=0xf0)
{
delay(10);
if((keyboard&0xf0)!=0xf0)
{
scode=0xfe;
while((scode&0x10)!=0)
{
keyboard=scode;
if((keyboard&0xf0)!=0xf0)
{
rcode=keyboard&0xf0;
scode=scode&0x0f;
while((keyboard&0xf0)!=0xf0);

keytimes++;
if(keytimes==5)
keytimes=1;
return(rcode|scode);
}

else
scode=(scode<<1)|0x01;
}
}
}

return(0);
}
/*
void scankeyboard() //scankeyboard()键值扫描
{ //扫描法测键值
key=keyscan();
scanok=1; //键值测完后。。scanok置1
}

void checkkeycode(void)
{
if(scanok) //如果键值测完后,则执行一以下
{
scanok=0; //scanok清零,为下次使用准备
switch(key) //用开关语句查找键值对应的逻辑功能
{
case 0xee: keynum=0 ;break; //数字键
case 0xed: keynum=1 ;break;
case 0xdd: keynum=2 ;break;
case 0xbd: keynum=3 ;break;
case 0xeb: keynum=4 ;break;
case 0xdb: keynum=5 ;break;
case 0xbb: keynum=6 ;break;
case 0xe7: keynum=7 ;break;
case 0xd7: keynum=8 ;break;
case 0xb7: keynum=9 ;break;
case 0x77: keynum=10 ;break; // +
case 0x7b: keynum=11 ;break; // -
case 0x7d: keynum=12 ;break; // *
case 0x7e: keynum=13 ;break; // /
case 0xbe: keynum=14 ;break; // =
case 0xde: keynum=15 ;break; //清零
}
checkok=1; //查完后,checkok置1.

}
}

void add(void)
{
addflag++; //加法标志置1
subflag=mulflag=divflag=0; //将其他运算标志清零(一次只能做一种运算)
clrflag=1; /

/清零标志置1,(当加号键按下后,再按第二个加数时,这是应显示第二加数,所以要清掉第一个加数)
if(addflag>1)
{
dat=dat+datA;
datA=dat;
}
else datA=dat; //如果不是连加,将输入的第一个数保存起来,
}
void equ(void)
{

if(addflag)
{
dat=dat+datA;
}
if(subflag)
{
dat=datA-dat;
}
if(mulflag)
{
dat=datA*dat;
}
if(divflag)
{
dat=datA/dat;
}
addflag=subflag=mulflag=divflag=0; //运算一次完成后将所有标志清零,为下次运算做准备
}
void datpros(void) //数据处理函数
{
if(keynum==15) //如果是15 则认为是清零的 进行清零
{
dat=0;
}
else //否则认为是数字键 进行显示 存储 并运算
{
if(clrflag) //清除标志为1,则执行以下
{
dat=0;
clrflag=0; //为下次使用做准备
}
dat=dat*10+keynum; //将每次按的数字合成整体 比如按下"1","2","3"后就会把他们合成"123"
// if(dat>1000000000) overflow=1; //如果输入值大于65535(所用的为int型数据,最大为65535)则溢出标志置1,可供显示程序查询并显示"EEEEEEE"
// if(divflag&&!dat) illegal=1; //如果做除法时除了0,则非法标志置1,供显示程序查询
}
}

void calculate_handle(void)//计算函数
{
if(checkok)//如果检测键值完。。。则执行以下程序
{
checkok=0;//检测键值标志置0
switch (keynum)//如果是+,-,*,/,=则进入相应函数
{
case 10 : add(); break; //如果按了"+",则进入加法函数
// case 11 : sub(); break; //如果按了"-",则进入减法函数
// case 12 : mul(); break; //如果按了"*",则进入乘法函数
// case 13 : div(); break; //如果按了"/",则进入除法函数
case 14 : equ(); break; //如果按了"=",则进入相应函数
default : datpros(); //如果不是,计算符(即为数字),则进入数据处理函数
}
}
}*/

main()
{
unsigned char key,i,j,add;
while(1)
{
// scankeyboard();
// checkkeycode();
// calculate_handle();
// display();
key=keyscan();
if(key!=0)
{
switch(key)
{
case 0xee:disdata[keytimes]=table[7];break;
case 0xde:disdata[keytimes]=table[8];break;
case 0xbe:disdata[keytimes]=table[9];break;
case 0x7e: {i++;keytimes=0;dat1=disdata[1];addflag=1; //+ 10
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5

;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
if(i>1&&subflag==0){datA1=datA1+dat1;}else if(subflag!=0){datA1=datA1-dat1;subflag=0;}
else if(i<2)datA1=dat1;}
/* if(keytimes==2){i++;keytimes=0;do{j++;dat1=disdata[j];
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;
case 0xa4:dat1=2;break;case 0xb0:dat1=3;break;case 0x99:dat1=4;break;
case 0x92:dat1=5;break;case 0x82:dat1=6;break;case 0xf8:dat1=7;break;
case 0x80:dat1=8;break;case 0x90:dat1=9;break;}
if(j==1)datB1=dat1;else dat1=datB1*10+dat1;}while(j>2);
j=0;addflag=1;
if(i>1&&subflag==0){datA1=datA1+dat1;}else if(subflag!=0){datA1=datA1-dat1;subflag=0;}
else if(i<2)datA1=dat1;}*/
break;
case 0xed:disdata[keytimes]=table[4];break;
case 0xdd:disdata[keytimes]=table[5];break;
case 0xbd:disdata[keytimes]=table[6];break;
case 0x7d:{i++;keytimes=0;subflag=1;dat1=disdata[1]; //- 11
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
if(i>1&&addflag==0){datA1=datA1-dat1;}else if(addflag!=0){datA1=datA1+dat1;addflag=0;}
else if(i<2)datA1=dat1;}break;
case 0xeb:disdata[keytimes]=table[1];break;
case 0xdb:disdata[keytimes]=table[2];break;
case 0xbb:disdata[keytimes]=table[3];break;
case 0x7b:{i++;keytimes=0;mulflag=1;dat1=disdata[1]; //* 12
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
datA1=dat1;i=1;}break;
case 0xe7:disdata[keytimes]=table[0];break;
case 0xd7:{if(addflag==1||add>0){add++;i=0;keytimes=0;dat1=disdata[1]; //+=
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;b

reak;
case 0x90:dat1=9;break;}
if(addflag==0){dat1=dat1+datB1;}if(addflag==1){datB1=dat1;dat1=dat1+datA1;}
if(dat1>9&&dat1<100){keytimes=2;disdata[1]=table[dat1/10];disdata[2]=table[dat1%10];}
else disdata[1]=table[dat1];addflag=0;}
if(subflag==1){i=0;keytimes=0;dat1=disdata[1]; //-=
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
dat1=datA1-dat1;disdata[1]=table[dat1];subflag=0;}
if(mulflag==1){i=0;keytimes=0;dat1=disdata[1]; //*=
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
dat1=datA1*dat1;disdata[1]=table[dat1];i=0;mulflag=0;}
if(divflag==1){i=0;keytimes=0;dat1=disdata[1]; // /=
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
dat1=datA1/dat1;disdata[1]=table[dat1];i=0;divflag=0;} }break;
case 0xb7:{keytimes=0;add=0;}break; //清除键
case 0x77:if(i==0){keytimes=0;divflag=1;dat1=disdata[1]; // '/' 15
switch(dat1)
{case 0xc0:dat1=0;break;case 0xf9:dat1=1;break;case 0xa4:dat1=2;break;
case 0xb0:dat1=3;break;case 0x99:dat1=4;break;case 0x92:dat1=5;break;
case 0x82:dat1=6;break;case 0xf8:dat1=7;break;case 0x80:dat1=8;break;
case 0x90:dat1=9;break;}
datA1=dat1;i=1;}break;
default: break;
}
}
display();
}
}

相关主题
文本预览
相关文档 最新文档