查看: 1567|回复: 0
打印 上一主题 下一主题

传说中的加法器,,让我改了又改啊《《终于好了

[复制链接]
跳转到指定楼层
沙发
发表于 2014-11-19 13:05:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************************
程序:简易加法器
功能: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;
  }
}

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表