程序實現內容為:
1、通過矩陣鍵盤輸入和數碼管顯示可以實現簡易計算器的功能。
2、計算器功能有基本的加減乘除外,還實現了累加累乘的功能。
3、矩陣鍵盤從第一排往右的案件功能分別為1、2、3、+、4、5、6、-、7、8、9、*、0、清零、等于、除
4、在第一二獨立按鍵按下切換還可以實現電子琴和計算器切換的功能5、程序包含數碼管顯示函數。
51hei圖片_20230326155432.jpg (700.53 KB, 下載次數: 39)
下載附件
普中A2開發板
2023-3-26 15:54 上傳
普中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;
- }
-
- }
- }
復制代碼
|