×
单片机 > 单片机程序设计 > 详情

51单片机 带修改错误功能的计算器

发布时间:2020-06-08 发布时间:
|

utilities.h


  1. #ifndef UTILITIES_H_INCLUDED  

  2. #define UTILITIES_H_INCLUDED  

  3.   

  4. typedef unsigned char uchar, BYTE, uint8;  

  5. typedef unsigned int uint, WORD, uint16;  

  6. typedef unsigned long ulong, DWORD, uint32;  

  7. typedef char int8;  

  8. typedef int int16;  

  9. typedef long int32;  

  10. typedef unsigned char * uchar_p;  

  11. typedef unsigned int * uint_p;  

  12. typedef unsigned long * ulong_p;  

  13. typedef char * char_p;  

  14. typedef int * int_p;  

  15. typedef long * long_p;  

  16.   

  17. #endif // UTILITIES_H_INCLUDED  


keyBoard.c


  1. #include   

  2. #include "utilities.h"  

  3.   

  4. sbit KEY_OUT_3 = P2^0;  

  5. sbit KEY_OUT_2 = P2^1;  

  6. sbit KEY_OUT_1 = P2^2;  

  7. sbit KEY_OUT_0 = P2^3;  

  8. sbit KEY_IN_0 = P2^4;  

  9. sbit KEY_IN_1 = P2^5;  

  10. sbit KEY_IN_2 = P2^6;  

  11. sbit KEY_IN_3 = P2^7;  

  12.   

  13. uchar code keyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表  

  14.     {0x31, 0x32, 0x33, 0x26}, //数字键1、数字键2、数字键3、向上键  

  15.     {0x34, 0x35, 0x36, 0x25}, //数字键4、数字键5、数字键6、向左键  

  16.     {0x37, 0x38, 0x39, 0x28}, //数字键7、数字键8、数字键9、向下键  

  17.     {0x30, 0x1B, 0x0D, 0x27}  //数字键0、ESC键、  回车键、 向右键  

  18. };  

  19. uchar pdata keyState[4][4] = {  //全部矩阵按键的当前状态  

  20.     {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}  

  21. };  

  22.   

  23. extern void keyAction(uchar keyCode);  

  24.   

  25. void keyDriver() {  

  26.     uchar i, j;  

  27.     static uchar backup[4][4] = {  

  28.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}  

  29.     };  

  30.   

  31.     for (i=0; i<4; i++)  

  32.         for (j=0; j<4; j++)  

  33.             if (keyState[i][j] != backup[i][j]) {  

  34.                 if (keyState[i][j] == 0)  

  35.                     keyAction(keyCodeMap[i][j]);  

  36.                 backup[i][j] = keyState[i][j];  

  37.             }  

  38. }  

  39.   

  40. void keyScan() {  

  41.     static uchar i = 0;  

  42.     static uchar keyBuf[4][4] = {  

  43.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},  

  44.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}  

  45.     };  

  46.     uchar j;  

  47.   

  48.     keyBuf[i][0] = (keyBuf[i][0] <

  49.     keyBuf[i][1] = (keyBuf[i][1] <

  50.     keyBuf[i][2] = (keyBuf[i][2] <

  51.     keyBuf[i][3] = (keyBuf[i][3] <

  52.     for (j=0; j<4; j++) {  

  53.         if (keyBuf[i][j] == 0x00)  

  54.             keyState[i][j] = 0;  

  55.         else if (keyBuf[i][j] == 0xFF)  

  56.             keyState[i][j] = 1;  

  57.     }  

  58.     switch (i) {  

  59.         case 0: KEY_OUT_0 = 1; KEY_OUT_1 = 0; break;  

  60.         case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;  

  61.         case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;  

  62.         case 3: KEY_OUT_3 = 1; KEY_OUT_0 = 0; break;  

  63.         default : break;  

  64.     }  

  65.     i = ++i & 0x03;  

  66. }  


digitalTube.c


  1. #include   

  2. #include "utilities.h"  

  3.   

  4. uchar code LEDChar[] = {  //数码管显示字符转换表  

  5.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,  

  6.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E  

  7. };  

  8. uchar LEDBuff[6] = {  //数码管显示缓冲区  

  9.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  10. };  

  11.   

  12. void showNumber(ulong num) {  

  13.     char i;  

  14.     uchar buf[6];  

  15.   

  16.     for (i=0; i<6; i++) {  

  17.         buf[i] = num % 10;  

  18.         num /= 10;  

  19.     }  

  20.     for (i=5; i>0; i--) {  

  21.         if (buf[i] == 0)  

  22.             LEDBuff[i] = 0xFF;  

  23.         else  

  24.             break;  

  25.     }  

  26.     for (; i>=0; i--)  

  27.         LEDBuff[i] = LEDChar[buf[i]];  

  28. }  

  29.   

  30. void LEDScan() {  

  31.     static uchar i = 0;  

  32.     P0 = 0xFF;  

  33.     P1 = (P1 & 0xF8) | i;  

  34.     P0 = LEDBuff[i];  

  35.     if (i 

  36.         i++;  

  37.     else  

  38.         i = 0;  

  39. }  


timer.c


  1. #include   

  2. #include "utilities.h"  

  3. #define TIMER0  

  4. #define TIMER0_MOD1  

  5.   

  6. #if defined (TIMER0)  

  7. uchar T0RH = 0;  

  8. uchar T0RL = 0;  

  9.   

  10. #if defined (TIMER0_MOD1)  

  11. void setTmr0(uint ms) {  

  12.     ulong tmp;  

  13.     tmp = 11059326 / 12;  

  14.     tmp = tmp * ms / 1000;  

  15.     tmp = 65536 - tmp;  

  16.     tmp += 28;  

  17.     T0RL = tmp;  

  18.     T0RH = tmp>>8;  

  19. }  

  20. #endif // defined  

  21. #endif // defined  


calculator.c


  1. /********************************************************** 

  2.     加减乘除计算器,能实现连续的运算,并且提供修改功能: 

  3.     对于算符来说,以最后输入的算符为准。 

  4.     测试样例: 

  5.     12 + 256 * 9 - 53 / 2 

  6.     3 + - * 5 

  7.     6 + - 2 / * 7 

  8.  

  9. ***********************************************************/  

  10. #include   

  11. #include "utilities.h"  

  12.   

  13. sbit ADDR0 = P1^0;  

  14. sbit ADDR1 = P1^1;  

  15. sbit ADDR2 = P1^2;  

  16. sbit ADDR3 = P1^3;  

  17. sbit ENLED = P1^4;  

  18.   

  19. extern uchar T0RH;  

  20. extern uchar T0RL;  

  21. extern uchar LEDBuff[6];  

  22. extern uchar code LEDChar[];  

  23. extern void showNumber(ulong num);  

  24. extern void LEDScan();  

  25. extern void keyScan();  

  26. extern void keyDriver();  

  27. extern void setTmr0(uint ms);  

  28.   

  29. void keyAction(uchar keyCode) {  

  30.     static ulong result = 0Lu;  

  31.     static ulong number = 0Lu;  

  32.     static uchar opPre = 0x26;  

  33.     static bit preIsOp = 0;  

  34.   

  35.     if (keyCode >= 0x30 && keyCode <= 0x39) {           //数字键  

  36.         number = number * 10 + keyCode - 0x30;  

  37.         showNumber(number);  

  38.         preIsOp = 0;  

  39.     }  

  40.     else if ((keyCode >= 0x25 && keyCode <= 0x28) || keyCode == 0x0D) {      //上下左右,加减乘除;回车键,相当于等于键  

  41.         if (!preIsOp) {  

  42.             switch (opPre) {  

  43.                 case 0x26: result += number; break;  

  44.                 case 0x28: result -= number; break;  

  45.                 case 0x25: result /= number; break;  

  46.                 case 0x27: result *= number; break;  

  47.                 case 0x0D: result = number; break;  

  48.                 default: break;  

  49.             }  

  50.             number = 0;  

  51.             showNumber(result);  

  52.         }  

  53.         opPre = keyCode;  

  54.         preIsOp = 1;  

  55.     }  

  56.     else if (keyCode == 0x1B) {     //ESC键  

  57.         number = 0Lu;  

  58.         result = 0Lu;  

  59.         showNumber(0Lu);  

  60.         preIsOp = 0;  

  61.     }  

  62.     else {  

  63.         preIsOp = 0;  

  64.     }  

  65. }  

  66.   

  67. void interruptTmr0() interrupt 1 {  

  68.     TH0 = T0RH;  

  69.     TL0 = T0RL;  

  70.     LEDScan();  

  71.     keyScan();  

  72. }  

  73.   

  74. void main() {  

  75.     EA = 1;  

  76.     ENLED = 0;  

  77.     ADDR3 = 1;  

  78.     TMOD = 0x01;  

  79.     setTmr0(1);  

  80.     TH0 = T0RH;  

  81.     TL0 = T0RL;  

  82.     ET0 = 1;  

  83.     TR0 = 1;  

  84.     LEDBuff[0] = LEDChar[0];  

  85.     while (1) {  

  86.         keyDriver();  

  87.     }  

  88. }  


关键字:51单片机  修改错误功能  计算器 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析