/*********************************************************************
程序:简易加法器
功能:10以内的加法
作者:XXX 修改日期:2014年11月18日
*********************************************************************/
#include <reg51.h>
unsigned char display1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义数组,存放0~9字型码
unsigned char display2[]={0xf8,0x80,0x90,0x00,0x99,0x92,0x82,0x00,0xf9,0xa4,0xb0,0x00,0x00,0xc0,0x00,0xc0};
unsigned char temp,add1,add2,sum;//定义50ms计数变量msec,定义秒变量sec
char scan_key();
char i=-1;
void delay(unsigned char i)//简单延时函数声明
{
unsigned int k;
for(k=0;k<i;k++)
;
}
void display();
void main() //主函数
{
while(1)
{
if(i!=11)
{
i=scan_key(); //调用键盘扫描函数
}
display();
//if(i==11)break;
}
}
/*函数名:scan_key
函数功能:判断是否有按键按下,如果有按键按下,逐列扫描后得到键值
形参:无
返回值:键值0~15,-1表示无按键按下*/
char scan_key()
{
char i,j,temp,m,n;
bit find=0; //有键按下标志位
P2=0xf0; //向所有的列线上输出低电平
i=P0; //读入行值
i&=0x0f; //屏蔽掉高四位
if(i!=0x0f) //行值不全为1,有键按下
{
delay(1200); //延时去抖
i=P0; //再次读入行值
i&=0x0f; //屏蔽掉高四位
if(i!=0x0f) //第二次判断有键按下
{
for(j=0;j<4;j++)
{
P2=~(0x01<<j); //逐列送出低电平
temp = ~P0; //读行值,并取反,全1变为全0
temp = temp & 0x0f; //屏蔽掉行值高4位
if(temp != 0x00) //判断有无按键按下,为0则无键按下,否则有键按下
{
m=j; //保存列号至m变量
find=1; //置找到按键标志
switch(temp)
{
case 0x01:n=0;break; //第0行有按键按下
case 0x02:n=1;break; //第1行有按键按下
case 0x04:n=2;break; //第2行有按键按下
case 0x08:n=3;break; //第2行有按键按下
default:break;
}
}
}
}
}
if(find ==0) return -1; //无键按下则返回-1
else return(n*4+m); //否则返回键值,键值=行号*4+列号
}
void display()
{
if(i==-1)
{
}
else if(i<=9)
{
temp=i;
P1=0xfe; //选中P0.0控制的数码管
P3=display1[i];//显示个位
delay(10); //参数100为慢动作显示,改为10快速显示
}else if(i==10)
{
add1=temp;
//P1=0xff;
}else if(i==11)
{
add2=temp;
sum=add1+add2;
//sum=16;
if(sum<=9)
{
P1=0xfe; //选中P0.0控制的数码管
P3=display1[sum%10];//显示个位
}
if(sum>9)
{
P1=0xfd; //选中P0.1控制的数码管
P3=display1[sum/10];//显示秒十位
delay(10);
P1=0xfe; //选中P0.0控制的数码管
P3=display1[sum%10];//显示个位
delay(10); //参数100为慢动作显示,改为10快速显示
P3=0xff;
}
}
}
|