|
这是用STC59C52单片机做的计算器,使用数码管显示,能实现基本的加减乘除和清零
源程序:
- /*****利用单片机设计的简易计算器********/
- /***** 单片机型号:STC59C52 ********/
- /*
- *采用4*4键盘,4行线,4列线
- *键盘行线列线接P1 IO口
- *数码管接P0口
- */
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dula=P2^6;//573段选使能
- sbit wela=P2^7;//573位选使能
- sbit beep=P3^2;//蜂鸣器
- uchar temp,key;//按键变量
- uchar fun;//加,减,乘,除,标志位
- long int num1,num2,res;//num1与num2是2个要运算的变量,res是结果
- uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
- uchar code table[]={
- 0x00,0x3f,0x06,0x5b,
- 0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,
- 0x7c,0x39,0x5e,0x79,0x71};//数码管段码
- uchar code weixuan[]={
- 0xdf,0xef,0xf7,
- 0xfb,0xfd,0xfe};//数码管位码
- void delay(unsigned char i)//延时
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void bee()//蜂鸣器
- {
- beep=0;
- delay(255);
- delay(255);
- beep=1;
- }
- //按键检测
- //如果没有按键按下,则key取Init()函数中所赋值为16
- void key_scan()
- {
- P1=0xfe;//先置第一行线为低,其余为高
- //高四位为列线,低四位为行线
- temp=P1;
- temp=temp&0xf0;
- //进行与运算,把结果赋给temp
- //此时temp = 0xf0
- if(temp!=0xf0) /*判断temp的高四位是否有0,如果有零的话,则此时temp != 0*/
- {
- delay(10);
- temp = P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee: //此时按键坐标为1行1列
- key=1;
- break;
- case 0xde:
- key=2;
- break;
- case 0xbe:
- key=3;
- break;
- case 0x7e:
- key=12;
- break;
- }
- while(temp!=0xf0) //等待按键释放
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfd;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp = P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
- key=4;
- break;
- case 0xdd:
- key=5;
- break;
- case 0xbd:
- key=6;
- break;
- case 0x7d:
- key=13;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfb;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp = P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- key=7;
- break;
- case 0xdb:
- key=8;
- break;
- case 0xbb:
- key=9;
- break;
- case 0x7b:
- key=14;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xf7;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp = P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
- key=10;
- break;
- case 0xd7:
- key=0;
- break;
- case 0xb7:
- key=11;
- break;
- case 0x77:
- key=15;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- }
- /*uchar temp,key;//按键变量
- uchar fun;//加,减,乘,除,标志位
- long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果
- uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
- */
- void Init()//初始化
- {
- num1=0;
- num2=0;
-
- //P0 = 0; //关闭所有段选
- wela=1;
- P0=0xdf;//11011111
- wela=0;
-
- dula=1;
- P0=table[1];//显示0
- dula=0;
-
- key=16;
- aa=0;
- dis=0;
- res=0;
- }
- void dis_play(long int nm)//显示函数
- {
- uchar a1,a6;//a1位段选变量,a6为位选变量
- long int shu;
- shu=nm;
- if(shu==0)
- {
- wela=1;
- P0=0xdf;
- wela=0;
- dula=1;
- P0=table[1];
- dula=0;
- }
- else
- {
- for(a6=0; a6<6; a6++)
- {
- a1=shu%10;//shu%10 shu比10小 a1=shu本身
- if(shu!=0)
- {
- a1=a1+1;
- }
- shu=shu/10;//shu/10 shu比10小 shu为0
- P0=table[a1];
- dula=1;
- dula=0;
- P0=weixuan[a6];
- wela=1;
- wela=0;
- delay(5);
- }
- }
- }
- void display()//显示选择函数,dis 0或1显示运算数,dis为2显示结果
- {
- switch (dis)
- {
- case 0:
- {
- dis_play(num1);
- }
- break;
- case 1:
- {
- dis_play(num2);
- }
- break;
- case 2:
- {
- dis_play(res);
- }
- break;
- }
- }
- void shanshuo()//数码管闪烁
- {
- wela=1;
- P0=0xff;
- wela=0;
- delay(255);
- }
- /*uchar temp,key;//按键变量
- uchar fun;//加,减,乘,除,标志位
- long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果
- uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
- */
- void check()//运算函数
- {
- if(key!=16)
- {
- bee();
- if(key>=10)
- {
- switch (key)
- {
- // CE
- case 10:
- Init();
- break;
- // =
- case 11:
- {
- switch (fun)//加,减,乘,除选择标志位
- {
- case 0:
- res=num1+num2,dis=2;
- break;//加法
- case 1:
- res=num1-num2,dis=2;
- break;//减法
- case 2:res=num1*num2,dis=2;
- break;//乘法
- case 3:res=num1/num2,dis=2;
- break;//除法
- }
- };
- break;
- // +
- case 12:
- fun=0,aa=1,shanshuo();
- break;
- // -
- case 13:
- fun=1,aa=1,shanshuo();
- break;
- // *
- case 14:
- fun=2,aa=1,shanshuo();
- break;
- // /
- case 15:
- fun=3,aa=1,shanshuo();
- break;
- }
- }
- else
- {
- switch (aa)//运算变量赋值标志位
- {
- case 0:
- {
- num1=num1*10+key;//把按键检测到的值赋给num1运算变量1
- };
- break;
- case 1:
- {
- dis=1;
- num2=num2*10+key;//把按键检测到的值赋给num2运算变量2
- };
- …………余下代码请下载附件…………
复制代码
下载:
v1.rar
(32.22 KB, 下载次数: 51)
|
评分
-
查看全部评分
|