程序实现内容为:
1、通过矩阵键盘输入和数码管显示可以实现简易计算器的功能。
2、计算器功能有基本的加减乘除外,还实现了累加累乘的功能。
3、矩阵键盘从第一排往右的案件功能分别为1、2、3、+、4、5、6、-、7、8、9、*、0、清零、等于、除
4、在第一二独立按键按下切换还可以实现电子琴和计算器切换的功能5、程序包含数码管显示函数。
普中A2单片机源程序如下:- #include <reg52.h>
- #include <string.h>
- //strcmp(tempName, names[i]) == 0
- #define KEYS P1
- typedef signed long u16; //对数据类型进行声明定义
- typedef unsigned int u12;
- typedef unsigned char u8;
- unsigned char chice = 0;
- int find;
- long view = 0; //计算器最终数字定义
- int s = 0; //按键次数
- int num = 1;
- long temp,temp1; //计算器用到的数值
- long sum = 0;
- long totalsum = 0;
- int tect = 0; //测试是否按下等号
- sbit KEY1 = P3^1;
- sbit KEY2 = P3^0;
- int ZE; //选择模式
- int sound;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit beep=P2^5;
- void delay(int t)
- {
- while(t--); //大概等于十微秒
- }
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40};// 显 示 0~F 的值
- void Display(int i)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0): LSA=1;LSB=1;LSC=1; break;//显示第 0 位
- case(1): LSA=0;LSB=1;LSC=1; break;//显示第 1 位
- case(2): LSA=1;LSB=0;LSC=1; break;//显示第 2 位
- case(3): LSA=0;LSB=0;LSC=1; break;//显示第 3 位
- case(4): LSA=1;LSB=1;LSC=0; break;//显示第 4 位
- case(5): LSA=0;LSB=1;LSC=0; break;//显示第 5 位
- case(6): LSA=1;LSB=0;LSC=0; break;//显示第 6 位
- case(7): LSA=0;LSB=0;LSC=0; break;//显示第 7 位
- }
- }
- void Displaynum(long num)
- {
- long temp ;
- int nums[8];
- long i,j;
- u16 sum;
- int m = 0;
- for(sum = 1,j = 0;j < 8;j++)
- {
- if ( num >= 0 )
- {
- if(sum <= num && num >= 0 )
- {
- temp = num / sum;
- temp = temp % 10;
- nums[j] = temp;
- m++;
- }
- else if(num == 0)
- {
- nums[j] = 0;
- m++;
- break;
- }
- sum *= 10;
- }
- else if(num < 0)
- {
- if(num < 0 && sum <= (-num))
- {
- temp = (-num) / sum;
- temp = temp % 10;
- nums[j] = temp;
- m++;
- }
- else
- {
- nums[j] = 16;
- m++;
- break;
- }
- sum *= 10;
- }
- }
- for(i = 7;i >= 0;i--)
- {
- j = nums[i];
- if(i < m)
- {
- Display(7 - i);
- P0=smgduan[j];
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- else
- {
- P0 = 0X00;
- }
-
- }
- }
- void Mkey()
- {
- int a = 0;
- KEYS = 0X0f;
- if(KEYS != 0X0f)
- {
- delay(1000);
- if(KEYS != 0Xff)
- {
- KEYS=0X0F;
- switch(KEYS) //判断列
- {
- case(0X07): chice=0;break;
- case(0X0b): chice=1;break;
- case(0X0d): chice=2;break;
- case(0X0e): chice=3;break;
- }
- KEYS=0XF0;
- switch(KEYS)
- {
- case(0X70): chice=chice;break;
- case(0Xb0): chice=chice+4;break;
- case(0Xd0): chice=chice+8;break;
- case(0Xe0): chice=chice+12;break;
- }
- switch(chice) //对每个按键进行功能定义
- {
- case(0):find = 1;break; case(1):find = 2;break; case(2):find = 3;break; case(3):find = 10;break; //加
- case(4):find = 4;break; case(5):find = 5;break; case(6):find = 6;break; case(7):find = 11;break; //减
- case(8):find = 7;break; case(9):find = 8;break; case(10):find = 9;break; case(11):find = 12;break;//乘
- case(12):find = 0;break; case(13):find = 14;break; case(14):find = 15;break; case(15):find = 13;break;//除
-
- }
- switch(find) //音频频率
- {
- case(1):sound = 70;break;
- case(2):sound = 65;break;
- case(3):sound = 60;break;
- case(4):sound = 55;break;
- case(5):sound = 50;break;
- case(6):sound = 45;break;
- case(7):sound = 40;break;
- case(8):sound = 35;break;
- }
-
- }
- while(KEYS!=0xf0)
- {
- if(ZE == 2 && sound > 35)
- {
- beep = ~beep;delay(sound);
- }
- } //检测按键松手检测
- sound = 0;
- if(sum == 0)
- {
- view = 0;
- }
- view = (view *= 10) + find; //累加
- if(find < 10 && s == 0) //第一次加
- {
- sum = 1;
- temp = view;
-
- }
- else if(find >= 10)
- {
- if(tect == 0 && s > 0) //累算
- {
- switch(find)
- {
- case(10):temp = temp + temp1;break;
- case(11):temp = temp - temp1;break;
- case(12):temp = temp * temp1;break;
- case(13):temp = temp / temp1;break;
- }
- }
- view = 0;
- switch(find)
- {
- case(10):s=1;break;
- case(11):s=2;break;
- case(12):s=3;break;
- case(13):s=4;break;
- }
- }
- if(find < 10 && s != 0) //第二次加
- {
- sum = 1;
- temp1 = view;
- }
-
- }
-
- }
- void Comp()
- {
-
- if(find == 15)
- {
-
- switch(s)
- {
- case(1):view = temp + temp1;break;
- case(2):view = temp - temp1;break;
- case(3):view = temp * temp1;break;
- case(4):view = temp / temp1;break;
- }
- temp = view;
- find = 0;
- sum = 0;
- s = 0;
- tect = 1;
- }
- else if(find == 14)
- {
- view=0;
- temp = 0;
- temp1 = 0;
- s = 0;
- find = 0;
- sum = 0;
- totalsum = 0;
- tect = 0;
- }
- }
- void XUAN()
- {
- if(KEY1 == 0 || KEY2 == 0)
- {
- delay(100);
- if(KEY1 == 0)
- {
- ZE = 1;
- }
- if(KEY2 == 0)
- {
- ZE = 2;
- }
- while(!KEY1 || !KEY2);
- }
- }
- void main()
- {
- while(1)
- {
- XUAN();
- Mkey();
- if(ZE != 2)
- {
- Comp();
- Displaynum(view);
- }
- if(ZE == 2)
- {
- view = 0;
- }
-
- }
- }
复制代码
|