找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8096|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机计算器程序代码 数码管显示加矩阵键盘加电路介绍

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-16 03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机做的计算器程序代码 姬家寨电子科技实验室 程序编程:姬学瑞   版权所有,侵权必究!51hei补充:程序采用stc单片机强推挽输出免去了驱动芯片,电路图很简单这里不画了
电路介绍:矩阵键盘接在接在P1口,八位数码管八个段选接p0口,8个位选接p2口,电路简单吧,程序已经测试通过了.

  1. #include <REGX51.H>
  2. #define FOSC    12000000                            //--- 宏定义时钟频率 ---
  3. //=================================================================================================
  4. //--- 数码管显示定义与函数声明区 ---
  5. sfr P0M1    = 0x93;
  6. sfr P0M0    = 0x94;
  7. sfr P2M1    = 0x95;
  8. sfr P2M0    = 0x96;
  9. #define TIMER1MS    1000                            //--- 宏定义定时1ms,1000us ---
  10. unsigned char code SEGLED[] =                       //--- 显示0~9,A~F笔段代码表 ---
  11. {
  12. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,
  13. };
  14. unsigned char code DIGLED[] =                       //--- 数码管显示的位选通段代码表 ---
  15. {
  16.   0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
  17. };
  18. unsigned char LEDBuffer[8] = {0,16,16,16,16,16,16,16};  //--- 定义的显示缓冲区 ---
  19. unsigned char LEDPointer;                               //--- 定义的扫描计数变量 ---
  20. unsigned char GetKeyCount=0;
  21. unsigned char GetKeyMaxFlag=0;
  22. unsigned long NumberA;
  23. unsigned long NumberB;
  24. long Result;
  25. unsigned char NagFlag=0;
  26. unsigned char DotPosition=0;
  27. unsigned char CurrentFunction=0;
  28. unsigned char Signal;
  29. unsigned char code KEYCODE[] =                      //--- 矩阵按键代码表 --
  30. {
  31.   0x7e,0xbe,0xde,0xee,//0 1 2 3
  32.   0x7d,0xbd,0xdd,0xed,//4 5 6 7
  33.   0x7b,0xbb,0xdb,0xeb,//8 9 A b
  34.   0x77,0xb7,0xd7,0xe7,//C d E F
  35. };
  36. void DelaymS(unsigned char t)                       //--- 延时函数 ---
  37. {
  38.   unsigned char i,j;
  39.   while(t --)
  40.     {
  41.       for(j=2;j>0;j--)
  42.         for(i=248;i>0;i--);                         //--- 12MHZ晶振延时约1mS ---
  43.     }
  44. }
  45. //=================================================================================================
  46. //--- main()主程序 ---
  47. void main(void)
  48. {
  49.   char i,j;
  50.   unsigned char Key;
  51.   unsigned char KeyTemp;
  52.   P0M1 = 0x00;                                      //--- 配置P0端口的P0.0~P0.7为推挽输出模式 ---
  53.   P0M0 = 0xFF;
  54.   P2M1 = 0x00;                                      //--- 配置P2端口的P2.0~P2.7为推挽输出模式 ---
  55.   P2M0 = 0xFF;

  56.   TMOD = 0x01;                                      //--- 配置T0为16位的定时方式 ---
  57.   TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256;       //--- 初始化T0定时1mS ---
  58.   TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
  59.   TR0 = 1;                                          //--- 启动T0工作 ---
  60.   ET0 = 1;                                          //--- 使能T0的溢出中断 ---
  61.   EA = 1;                                           //--- CPU开中断 ---

  62.   while(1)
  63.     {
  64.       P1 = 0xF0;
  65.       if((P1 & 0xF0) != 0xF0)                       //--- 判断是否有键按下 ---
  66.         {
  67.           DelaymS(5);                               //--- 去抖动 ---
  68.           if((P1 & 0xF0) != 0xF0)                   //--- 再判断是否真得按下 ---
  69.             {
  70.               KeyTemp = P1 & 0xF0;                  //--- 反转一次 ---
  71.               P1 = 0x0F;
  72.               KeyTemp |= (P1 & 0x0F);               //--- 读取按键的内容 ---
  73.               Key = 0;
  74.               while(KeyTemp != KEYCODE[Key])Key ++; //--- 在代码中寻找Key的数值 ---
  75.             
  76.               switch(CurrentFunction)
  77.                 {
  78.                   case 0:                           //--- 输入第1个数据 ---
  79.                     if((Key >= 0) && (Key <= 9))
  80.                       {
  81.                         if(0 == GetKeyMaxFlag)
  82.                           {
  83.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  84.                             LEDBuffer[0] = Key;
  85.                             GetKeyCount++;
  86.                             if(5 == GetKeyCount)GetKeyMaxFlag = 1;
  87.                           }
  88.                       }
  89.                     else if((Key >= 10) && (Key <= 13))
  90.                       {
  91.                         NumberA = 0;
  92.                         i = 4;
  93.                         while(i >= 0)
  94.                           {
  95.                             if(16 != LEDBuffer[i])
  96.                               NumberA = NumberA * 10 + LEDBuffer[i];
  97.                             i --;
  98.                           }
  99.                         CurrentFunction = 1;
  100.                         Signal = Key;
  101.                         GetKeyMaxFlag = 0;
  102.                         GetKeyCount = 0;
  103.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  104.                         LEDBuffer[0] = 0;
  105.                       }
  106.                     else if(14 == Key)
  107.                       {
  108.                         CurrentFunction = 0;
  109.                         GetKeyMaxFlag = 0;
  110.                         GetKeyCount = 0;
  111.                         NagFlag = 0;
  112.                         DotPosition = 0;
  113.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  114.                         LEDBuffer[0] = 0;
  115.                       }
  116.                     else
  117.                       {
  118.                        
  119.                       }
  120.                     break;
  121.                   case 1:
  122.                     if((Key >= 0) && (Key <= 9))
  123.                       {
  124.                         if(0 == GetKeyMaxFlag)
  125.                           {
  126.                             for(i=GetKeyCount;i>0;i--)LEDBuffer[i] = LEDBuffer[i - 1];
  127.                             LEDBuffer[0] = Key;
  128.                             GetKeyCount++;
  129.                             if(5 == GetKeyCount)GetKeyMaxFlag = 1;
  130.                           }
  131.                       }
  132.                     else if(15 == Key)
  133.                       {
  134.                         NumberB = 0;
  135.                         i = 4;
  136.                         while(i >= 0)
  137.                           {
  138.                             if(16 != LEDBuffer[i])
  139.                               NumberB = NumberB * 10 + LEDBuffer[i];
  140.                             i --;
  141.                           }
  142.                         switch(Signal)
  143.                           {
  144.                             case 10:
  145.                               Result = NumberA;
  146.                               Result += NumberB;
  147.                               break;
  148.                             case 11:
  149.                               Result = NumberA;
  150.                               Result -= NumberB;
  151.                               break;
  152.                             case 12:
  153.                               Result = NumberA;
  154.                               Result *= NumberB;
  155.                               break;
  156.                             case 13:
  157.                               Result = NumberA;
  158.                               Result *= 10000;
  159.                               Result /= NumberB;
  160.                               break;
  161.                           }
  162.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  163.                         LEDBuffer[0] = 0;
  164.                         DotPosition = 0;
  165.                         NagFlag = 0;
  166.                         if(Result < 0)
  167.                           {
  168.                             Result = ~Result;
  169.                             Result ++;
  170.                             NagFlag = 1;
  171.                           }
  172.                         if(13 == Signal)//除法运算中除得结果小于0的处理
  173.                           {
  174.                             if(Result >= 1000)DotPosition = 4;
  175.                             else if(Result >= 100)DotPosition = 3;
  176.                             else if(Result >= 10)DotPosition = 2;
  177.                             else if(Result >= 1)DotPosition = 1;
  178.                             for(i=DotPosition;i<5;i++)LEDBuffer[i] = 0;
  179.                             DotPosition = 4;
  180.                           }
  181.                         else DotPosition = 0;
  182.                         i = 0;//将运算结果送出显示缓冲区
  183.                         while(Result)
  184.                           {
  185.                             LEDBuffer[i] = Result % 10;
  186.                             Result /= 10;
  187.                             i ++;
  188.                           }
  189.                         if(1 == NagFlag)LEDBuffer[i] = 17;//运算结果为负的处理
  190.                         if(13 == Signal)//除法运算中最后位"0"的处理
  191.                           {
  192.                             j = 0;
  193.                             while(0 == LEDBuffer[j])
  194.                               {
  195.                                 for(i=0;i<sizeof(LEDBuffer);i++)
  196.                                   LEDBuffer[i] = LEDBuffer[i+1];
  197.                                 LEDBuffer[sizeof(LEDBuffer)-1]=16;
  198.                                 DotPosition--;
  199.                               }
  200.                           }
  201.                         CurrentFunction = 2;
  202.                       }
  203.                     break;
  204.                   case 2:
  205.                     if(14 == Key)
  206.                       {
  207.                         CurrentFunction = 0;
  208.                         GetKeyMaxFlag = 0;
  209.                         GetKeyCount = 0;
  210.                         NagFlag = 0;
  211.                         DotPosition = 0;
  212.                         for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i] = 16;
  213.                         LEDBuffer[0] = 0;
  214.                       }
  215.                     break;
  216.                 }
  217.             
  218.               while((P1 & 0x0F)!=0x0F);             //--- 等待按键释放 ---
  219.             }
  220.         }
  221.       
  222.     }
  223. }
  224. //=================================================================================================
  225. //--- 定时器T0溢出中断服务程序 ---
  226. void T0_ISR(void) interrupt 1
  227. {
  228.   TH0 = (65536 - FOSC / 12 / TIMER1MS) / 256;       //--- 重装T0的定时初值 ---
  229.   TL0 = (65536 - FOSC / 12 / TIMER1MS) % 256;
  230.   P0 = SEGLED[LEDBuffer[LEDPointer]];                   //--- 显示数字 ---
  231.   if((0 != DotPosition) && (DotPosition == LEDPointer))
  232.     P0 |= 0x80;                                         //--- 显示小数点 ---
  233.   P2 = DIGLED[LEDPointer];                              //--- 数码管的位选段选择 ---
  234.   LEDPointer++;                                         //--- 动态扫描计数变量加1 ---
  235.   if(sizeof(LEDBuffer) == LEDPointer)LEDPointer = 0;    //--- 所有数码管扫描完,计数归0 ---
  236. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:43559 发表于 2015-4-16 21:57 | 只看该作者
感谢分享。
回复

使用道具 举报

板凳
ID:126027 发表于 2016-6-9 22:49 | 只看该作者
本帖最后由 Blackadmin 于 2016-6-9 22:51 编辑

unsigned char LEDPointer;为何初不用始化?????
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表