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

51单片机简易加法计算器

发布时间:2024-11-04 发布时间:
|
  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR0 = P1^0;  

  8. sbit ADDR1 = P1^1;  

  9. sbit ADDR2 = P1^2;  

  10. sbit ADDR3 = P1^3;  

  11. sbit ENLED = P1^4;  

  12. sbit KEY_IN_0 = P2^4;  

  13. sbit KEY_IN_1 = P2^5;  

  14. sbit KEY_IN_2 = P2^6;  

  15. sbit KEY_IN_3 = P2^7;  

  16. sbit KEY_OUT_0 = P2^3;  

  17. sbit KEY_OUT_1 = P2^2;  

  18. sbit KEY_OUT_2 = P2^1;  

  19. sbit KEY_OUT_3 = P2^0;  

  20.   

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

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

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

  24. };  

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

  26.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  27. };  

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

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

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

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

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

  33. };  

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

  35.     {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}  

  36. };  

  37. uchar T0RH = 0;  

  38. uchar T0RL = 0;  

  39.   

  40. void ShowNumber(ulong num)  

  41. {  

  42.     char i;  

  43.     uchar buf[6];  

  44.     for (i=0; i<6; i++)  

  45.     {  

  46.         buf[i] = num % 10;  

  47.         num /= 10;  

  48.     }  

  49.     for (i=5; i>=0; i--)  

  50.     {  

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

  52.             LEDBuff[i] = 0xFF;  

  53.         else  

  54.             break;  

  55.     }  

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

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

  58. }  

  59.   

  60. void KeyAction(uchar keyCode)  

  61. {  

  62.     static ulong result = 0;  

  63.     static ulong number = 0;  

  64.     if (keyCode >= 0x30 && keyCode <= 0x39)  

  65.     {  

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

  67.         ShowNumber(number);  

  68.     }  

  69.     else if (keyCode == 0x26 || keyCode == 0x0D)  

  70.     {  

  71.         result += number;  

  72.         number = 0;  

  73.         ShowNumber(result);  

  74.     }  

  75.     else if (keyCode == 0x1B)  

  76.     {  

  77.         number = 0;  

  78.         result = 0;  

  79.         ShowNumber(number);  

  80.     }  

  81. }  

  82.   

  83. void KeyDriver()  

  84. {  

  85.     uchar i, j;  

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

  87.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}  

  88.     };  

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

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

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

  92.             {  

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

  94.                     KeyAction(keyCodeMap[i][j]);  

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

  96.             }  

  97. }  

  98.   

  99. void KeyScan()  

  100. {  

  101.     static uchar i = 0;  

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

  103.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},  

  104.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}  

  105.     };  

  106.     uchar j;  

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

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

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

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

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

  112.     {  

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

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

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

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

  117.     }  

  118.     switch (i)  

  119.     {  

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

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

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

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

  124.         default : break;  

  125.     }  

  126.     i = ++i & 0x03;  

  127. }  

  128.   

  129. void LEDScan()  

  130. {  

  131.     static uchar i = 0;  

  132.     P0 = 0xFF;  

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

  134.     P0 = LEDBuff[i];  

  135.     if (i 

  136.         i++;  

  137.     else  

  138.         i = 0;  

  139. }  

  140.   

  141. void SetTimer0(uint ms)  

  142. {  

  143.     ulong tmp;  

  144.     tmp = 11059326 / 12;  

  145.     tmp = tmp * ms / 1000;  

  146.     tmp = 65536 - tmp;  

  147.     tmp += 28;  

  148.     T0RL = tmp;  

  149.     T0RH = tmp>>8;  

  150. }  

  151.   

  152. void InterruptTimer0() interrupt 1  

  153. {  

  154.     TH0 = T0RH;  

  155.     TL0 = T0RL;  

  156.     LEDScan();  

  157.     KeyScan();  

  158. }  

  159.   

  160. void main()  

  161. {  

  162.     EA = 1;  

  163.     ENLED = 0;  

  164.     ADDR3 = 1;  

  165.     TMOD = 0x01;  

  166.     SetTimer0(1);  

  167.     TH0 = T0RH;  

  168.     TL0 = T0RL;  

  169.     ET0 = 1;  

  170.     TR0 = 1;  

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

  172.     while (1)  

  173.     {  

  174.         KeyDriver();  

  175.     }  

  176. }  




我想加一个效果,在按加号的时候同时显示数字和加号,我使用了第二个定时器定时,可是实验结果是中断服务函数执行得太慢了,扫描很慢,看不到连续的画面,效果不好,而且影响下一个按键的判断。。


[cpp] view plain copy

  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR0 = P1^0;  

  8. sbit ADDR1 = P1^1;  

  9. sbit ADDR2 = P1^2;  

  10. sbit ADDR3 = P1^3;  

  11. sbit ENLED = P1^4;  

  12. sbit KEY_IN_0 = P2^4;  

  13. sbit KEY_IN_1 = P2^5;  

  14. sbit KEY_IN_2 = P2^6;  

  15. sbit KEY_IN_3 = P2^7;  

  16. sbit KEY_OUT_0 = P2^3;  

  17. sbit KEY_OUT_1 = P2^2;  

  18. sbit KEY_OUT_2 = P2^1;  

  19. sbit KEY_OUT_3 = P2^0;  

  20.   

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

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

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

  24. };  

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

  26.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  27. };  

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

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

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

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

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

  33. };  

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

  35.     {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}  

  36. };  

  37. uchar code image[] = {  

  38.     0xFF,0xE7,0xE7,0x81,0x81,0xE7,0xE7,0xFF  

  39. };  

  40.   

  41. uchar T0RH = 0;  

  42. uchar T0RL = 0;  

  43.   

  44. void showNumber(ulong num){  

  45.     char i;  

  46.     uchar buf[6];  

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

  48.         buf[i] = num % 10;  

  49.         num /= 10;  

  50.     }  

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

  52.         if(buf[i] == 0) LedBuff[i] = 0xFF;  

  53.         else break;  

  54.     }  

  55.     for(; i>=0; i--){  

  56.         LedBuff[i] = LedChar[buf[i]];  

  57.     }  

  58. }  

  59.   

  60. void showPicture(){  

  61.     TR0 = 0;  

  62.     ET0 = 0;  

  63.     ADDR3 = 0;  

  64.     TMOD &= 0x0F;  

  65.     TMOD |= 0x10;  

  66.     TH1 = 0xFF;  

  67.     TL1 = 0xFE;  

  68.     ET1 = 1;  

  69.     TR1 = 1;  

  70. }  

  71.   

  72. void closePicture(){  

  73.     TR1 = 0;  

  74.     ET1 = 0;  

  75.     ADDR3 = 1;  

  76.     ET0 = 1;  

  77.     TR0 = 1;  

  78. }  

  79.   

  80. void keyAction(uchar keyCode){  

  81.     static ulong result = 0;  

  82.     static ulong number = 0;  

  83.     static bit flag = 0;  

  84.     if(keyCode >= 0x30 && keyCode <= 0x39){  

  85.         if(flag == 1){  

  86.             closePicture();  

  87.             flag = 0;  

  88.         }  

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

  90.         showNumber(number);  

  91.     }  

  92.     else if(keyCode == 0x26 || keyCode == 0x0D){  

  93.         result += number;  

  94.         number = 0;  

  95.         showNumber(result);  

  96.         showPicture();  

  97.         flag = 1;  

  98.     }  

  99.     else if(keyCode == 0x1B){  

  100.         if(flag == 1){  

  101.             closePicture();  

  102.             flag = 0;  

  103.         }  

  104.         number = 0;  

  105.         result = 0;  

  106.         showNumber(number);  

  107.     }  

  108. }  

  109.   

  110. void keyDriver(){  

  111.     uchar i, j;  

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

  113.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}  

  114.     };  

  115.     for(i=0; i<4; i++){  

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

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

  118.                 if(keyState[i][j] == 0){  

  119.                     keyAction(KeyCodeMap[i][j]);  

  120.                 }  

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

  122.             }  

  123.         }  

  124.     }  

  125. }  

  126.   

  127. void keyScan(){  

  128.     static uchar i = 0;  

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

  130.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},  

  131.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}  

  132.     };  

  133.     uchar j;  

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

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

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

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

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

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

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

  141.         }  

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

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

  144.         }  

  145.     }  

  146.     switch(i){  

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

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

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

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

  151.         default: break;  

  152.     }  

  153.     i = ++i & 0x03;  

  154. }  

  155.   

  156. void LEDScan(){  

  157.     static uchar i = 0;  

  158.     P0 = 0xFF;  

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

  160.     P0 = LedBuff[i];  

  161.     if(i 

  162.     else i = 0;  

  163. }  

  164.   

  165. void setTimer0(uint ms){  

  166.     ulong tmp;  

  167.     tmp = 11059326 / 12;  

  168.     tmp = tmp * ms / 1000;  

  169.     tmp = 65536 - tmp;  

  170.     tmp += 28;  

  171.     T0RL = tmp;  

  172.     T0RH = tmp>>8;  

  173. }  

  174.   

  175. void interruptTimer0() interrupt 1{  

  176.     TH0 = T0RH;  

  177.     TL0 = T0RL;  

  178.     LEDScan();  

  179.     keyScan();  

  180. }  

  181.   

  182. void interruptTimer1() interrupt 3{  

  183.     static uchar i = 0, j = 0;  

  184.     static bit flag = 1;  

  185.     if(flag){  

  186.         ADDR3 = 0;  

  187.         P0 = 0xFF;  

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

  189.         P0 = image[i];  

  190.         if(i 

  191.         else{  

  192.             i = 0;  

  193.             flag = 0;  

  194.         }  

  195.     }  

  196.     else{  

  197.         ADDR3 = 1;  

  198.         P0 = 0xFF;  

  199.         P1 = (P1 & 0xF8) | j;  

  200.         P0 = LedBuff[j];  

  201.         if(j 

  202.         else{  

  203.             j = 0;  

  204.             flag = 1;  

  205.         }  

  206.     }  

  207.     keyScan();  

  208. }  

  209.   

  210. void main(){  

  211.     EA = 1;  

  212.     ENLED = 0;  

  213.     ADDR3 = 1;  

  214.     TMOD = 0x01;  

  215.     setTimer0(1);  

  216.     TH0 = T0RH;  

  217.     TL0 = T0RL;  

  218.     ET0 = 1;  

  219.     TR0 = 1;  

  220.     LedBuff[0] = LedChar[0];  

  221.     while(1){  

  222.         keyDriver();  

  223.     }  

  224. }  



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

热门文章 更多
STC89C52RC单片机的NRF24L01无线通信程序.收发一体