实现两位数相加,这里我用到了矩阵键盘和数码管以及独立按键,独立按键控制加法符号和等于符号,矩阵键盘为0-F这16个数,先写十位再写各位,数码管显示,最后,计算出结果以后再利用数码管显示结果,同时蜂鸣器响。
注意,我用的芯片是stc89c52
单片机源程序如下:
- #include"reg52.h"
- //两位数!!!
- int i;
- char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- int number_1,number_2;int m=20;int value;int numberr[5];int g=1;
- sbit a=P2^2;
- sbit b=P2^3;
- sbit c=P2^4;
- int n=0;
- int my;
- int uu=1;
- sbit beep=P1^5;
- int din_K1=0;
- int din_K3=0;
- int yy=990;
- char mm_1;
- char bb;
- char mm_2;
- sbit jia=P3^1;
- sbit deng=P3^2;
- ////////////////
- void Init()
- {
- SCON=0X50; //设置为工作方式1
- TMOD=0X20; //设置计数器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //计数器初始值设置,注意波特率是4800的
- TL1=0XF3;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1; //打开计数器
- }
- //////////////
- void delay(int d)
- {
- while(d)
- {
- d--;
- }
- }
- void check()
- { int z;
- P1=0x0f;
- if(P1!=0x0f)//读取按键是否按下
- {
- delay(3000);//延时10ms进行消抖
- if(P1!=0x0f)//再次检测键盘是否按下
- {
- //测试列
- P1=0X0F;
- switch(P1)
- {
- case(0X07): value=0;break;
- case(0X0b): value=1;break;
- case(0X0d): value=2;break;
- case(0X0e): value=3;break;
- }
- //测试行
- P1=0XF0;
- switch(P1)
- {
- case(0X70): value=value;break;
- case(0Xb0): value=value+4;break;
- case(0Xd0): value=value+8;break;
- case(0Xe0): value=value+12;break;
- }
- while((z<50)&&(P1!=0xf0)) //检测按键松手检测
- {
- delay(1000);
- z++;
- }
- din_K1=1;
- din_K3=1;
- n++;
- numberr[n]=value;
-
-
- }
- }
-
- }
- void oror()
- {
- if(jia==0)
- {
- delay(1000);
- if(jia==0)
- {
- din_K1=0;
-
- }
- }
-
-
- }
- void end()
- {
- if(deng==0||uu==0)
- {
- delay(1000);
- if(deng==0||uu==0)
- {
- din_K3=0;
- g=0;
- value=numberr[1]*10+numberr[2]+numberr[3]*10+numberr[4];
- number_1=value/10;
- number_2=value%10;
- }
- }
-
- }
-
- void main()
- {
- Init();
- while(g)
- {
- check();
-
- while(din_K1&&din_K3&&uu)
- {
- switch(n%2)
- {
- case 0:c=0;b=0;a=0;P0=smgduan[value];delay(1200);P0=smgduan[0];c=0;b=0;a=1;P0=smgduan[numberr[n-1]];delay(1200);P0=smgduan[0]; break;
- case 1:c=0;b=0;a=1;P0=smgduan[value];delay(1200);P0=smgduan[0];break;
-
- }
- break;
- }
- // oror();
- end();
-
-
-
-
- }
- while(yy)
- {
- beep=~beep;
- delay(10);
- yy--;
- }
- while(1)
- { int p=0;
- for(p=0;p<2;p++)
- {
- switch(p)
- {
- case 0:c=0;b=0;a=0;P0=smgduan[number_2];delay(1000);P0=smgduan[0];break;
- case 1:c=0;b=0;a=1;P0=smgduan[number_1];delay(1000);P0=smgduan[0];break;
- }
- }
- }
-
-
- }
- void Usart() interrupt 4
- {
- bb=SBUF;
- RI=0;
- if(bb==0x3d)
- { uu=0;
-
- }
-
- else
- {
- RI=0;
- mm_1=number_1+0x30;
- mm_2=number_2+0x30;
- SBUF=mm_1;
- while(!TI);
- TI=0;
- SBUF=mm_2;
- while(!TI);
- TI=0;
- }
- // RI=0;
- // SBUF=0x30;;//将接收到的数据放入到发送寄存器
- // while(!TI); //等待发送数据完成
- // TI=0; //清除发送完成标志位
- }
复制代码
所有资料51hei提供下载:
计算1111111111器——2位数相加.rar
(26.28 KB, 下载次数: 29)
|