找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5770|回复: 7
收起左侧

带计时功能的简单计算器单片机仿真+源程序+电路原理图 带数码管和液晶2种显示

[复制链接]
ID:137190 发表于 2016-8-31 22:40 | 显示全部楼层 |阅读模式
0.png 0.png
51单片机做的带计时功能的简单计算器的仿真电路原理图,有2个仿真文件一个是用数码管显示,一个是用lcd1602液晶来显示的.(工程文件清晰版请下载本帖最后的附件)

单片机带计时功能的简单计算器源程序如下(部分代码预览,完整代码请下载附件):
  1. //*************************************************************************************************
  2. //*                                                                                                                                                                                                  *
  3. //*                         ******************************头文件及宏定义**************************                                  *
  4. //*                                                                                                                                                                                                  *
  5. //*************************************************************************************************
  6. #include "includes.h"

  7. #define TIME0H 0xFC
  8. #define TIME0L 0x18                //定时器0溢出时间:5ms

  9. #define TIME1H 0x44
  10. #define TIME1L 0x80                //定时器1溢出时间:48ms


  11. //*************************************************************************************************
  12. //*                                                                                                                                                                                                  *
  13. //*                          ********************************全局变量******************************                          *
  14. //*                                                                                                                                                                                                  *
  15. //*************************************************************************************************

  16. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0定时刷新LED计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  17. unsigned long ul_Number=0;                        //LCD实时显示数字。

  18. unsigned char uca_ShowCustom[6]={0x88,0x83,0xC6,0xA1,0x86,0x84};
  19.                                                                         //存放自定义显示字符。

  20. unsigned char uc_DisCount=1;                //LCD时事刷新计数。

  21. bit b_ShowMode=0;                                        //显示模式标志位。
  22.                                                                         //0--数字模式,将要显示的数字赋给ul_Number便可时事显示数值,
  23.                                                                         //                                默认为数字模式;
  24.                                                                         //1--自定义模式,该模式下自定义字符显示。

  25. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1计数刷新定时(计时模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  26. unsigned char uc_TimeCount=1;                //定时器1定时计数。

  27. bit b_ClockStart=0;                                        //定时器1显示计数标志位。

  28. extern bit b_ClockOppose;                        //TimeOppose.c

  29. extern unsigned long ul_ClockOppose;


  30. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  31. bit b_KeyShock=0;                                          //键盘防抖动标志位。
  32.                                                                         //当按键中断产生时,首先判断此位。
  33.                                                                         //0--执行键盘扫描及键码处理程序;1--不执行。

  34. bit b_KillShock=0;                                        //防抖标志清除位:0--不清除;1--清除。

  35. unsigned char uc_KillCount=1;                //抖动标志清除计数,使用定时器1。


  36. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD闪烁显示报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  37. bit b_LCDClean=0;                                          //通过设置b_LCDClean为1便可启动延时清空LCD显示。

  38. unsigned char uc_CleanCount=1;                  //延迟时间可在T1中断中设定。


  39. unsigned char uc_ReportSymbol;

  40. bit b_ReportFlash=0;

  41. unsigned char uca_FlashBlank[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};


  42. //*************************************************************************************************
  43. //*                                                                                                                                                                                                  *
  44. //*                          ********************************主函数******************************                                  *
  45. //*                                                                                                                                                                                                  *
  46. //*************************************************************************************************
  47. void main()
  48. {
  49.         P2=0x0F;                  //初始化键盘接口。

  50.         TMOD=0x11;                  //定时器0:模式一;定时器0:模式一.


  51. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  52.         TH0=TIME0H;
  53.         TL0=TIME0L;
  54.         TR0=1;                         //开启定时器0
  55.         ET0=1;                         //开定时器0中断


  56. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于1s计时 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  57.         TH1=TIME1H;
  58.         TL1=TIME1L;
  59.         TR1=1;                         //开启定时器1
  60.         ET1=1;                         //开定时器1中断


  61. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于执行键盘扫描和键处理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
  62.         IT0=1;                         //外部中断0,中断方式:下降沿
  63.         EX0=1;                         //开启外部中断0

  64.         PT0=1;                         //把定时器0溢出中断设为高优先级。

  65.         EA=1;                         //开启总中断

  66.         while(1);
  67. }



  68. //*************************************************************************************************
  69. //*                                                                                                                                                                                                  *
  70. //*                ***************************外部中断0,调用键盘扫描程序*************************                          *
  71. //*                                                                                                                                                                                                  *
  72. //*************************************************************************************************
  73. void vINT0(void) interrupt 0
  74. {
  75.         EX0=0;                                                         //在键扫描处理时,关闭外部中断0,防抖动。

  76.         if(b_KeyShock==0)
  77.                 {
  78.                 vKeyProcess(ucKeyScan());        //当判断有按键按下时,扫描键盘,并把扫描结果进行处理。
  79.                 b_KeyShock=1;                                        //设置防抖动标志。
  80.                 }
  81.         else b_KeyShock=0;                                //如果有抖动则不执行键扫描,恢复防抖动标志。

  82. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
  83.         if(b_KeyShock==1)
  84.                 b_KillShock=1;                                //如果防抖动标志位开启则开启防抖动标志清除位,
  85.                                                                         //300ms后清除防抖动标志。

  86. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  87.         P2=0x0F;                                                  //恢复P2口。
  88.         EX0=1;                                                        //恢复按键中断。
  89. }


  90. //*************************************************************************************************
  91. //*                                                                                                                                                                                                  *
  92. //*                ****************定时器1中断,用于计时功能和防抖动标志清除以及显示报告****************          *
  93. //*                                                                                                                                                                                                  *
  94. //*************************************************************************************************
  95. void vTimer1(void) interrupt 3
  96. {
  97. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<计时模式计数刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  98.         if(b_ClockStart==1)                                        //当计时模式开启式,如计时处于运行状态则执行定时计数增加。
  99.                 {
  100.                 if(b_ClockOppose==0)                        //正常计时。
  101.                         {
  102.                         if(uc_TimeCount%21==0)
  103.                                 {
  104.                                 uc_TimeCount=1;
  105.                                 ul_Number++;
  106.                                 }
  107.                         else uc_TimeCount++;
  108.                         }
  109.                 else
  110.                         {                                                          //倒计时模式。
  111.                         if(uc_TimeCount%21==0)
  112.                                 {
  113.                                 uc_TimeCount=1;
  114.                                 if(ul_ClockOppose>0)
  115.                                         {
  116.                                         ul_ClockOppose--;
  117.                                         ul_Number=ul_ClockOppose;
  118.                                         }
  119.                                 else
  120.                                         {
  121.                                         b_ClockStart=0;
  122.                                         uc_ReportSymbol=7;
  123.                                         b_LCDClean=1;
  124.                                         }
  125.                                 }
  126.                         else uc_TimeCount++;
  127.                         }
  128.                 }

  129. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  130.         if(b_KillShock==1)
  131.                 {
  132.                 if(uc_KillCount%5==0)                         //当防抖动标志位为1时,计时300ms后清除抖动标志位。
  133.                         {
  134.                         b_KeyShock=0;
  135.                         b_KillShock=0;
  136.                         uc_KillCount=1;
  137.                         }
  138.                 else uc_KillCount++;
  139.                 }

  140. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD显示报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  141.         if(b_LCDClean==1)
  142.                 {
  143.                         if(uc_CleanCount==1)
  144.                                 {
  145.                                         EX0=0;                                                        //关闭键盘中断,此时按键无效。
  146.                                         vShowReport(uc_ReportSymbol);
  147.                                         b_ShowMode=1;
  148.                                 }
  149.                         if(uc_CleanCount%40==0)                                        //通过设置b_LCDClean为1便可启动延时清空LCD显示。
  150.                                 {
  151.                                         b_LCDClean=0;                                        //关闭清零标志位,清零结束。
  152.                                         uc_CleanCount=1;                                //恢复清零计数为初始值1.
  153.                                         b_ShowMode=0;                                        //恢复显示模式为默认的数字模式。
  154.                                         b_ReportFlash=0;
  155.                                         EX0=1;                                                        //重新开启键盘中断。
  156.                                 }
  157.                         else
  158.                                 {
  159.                                 //<<<<<<<<<<<<<<<<<<<<<<<<<实现闪烁报告功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  160.                                 if(uc_CleanCount%7==0)                                                                                                               
  161.                                         {
  162.                                                 if(b_ReportFlash==0)
  163.                                                         {
  164.                                                                 vCharCopy(uca_FlashBlank);
  165.                                                                 b_ReportFlash=1;
  166.                                                         }
  167.                                                 else
  168.                                                         {
  169.                                                                 vShowReport(uc_ReportSymbol);
  170.                                                                 b_ReportFlash=0;
  171.                                                         }
  172.                                          }
  173.                         uc_CleanCount++;
  174.                                 }
  175.                 }

  176.         TH1=TIME1H;
  177.         TL1=TIME1L;

  178. }


  179. //*************************************************************************************************
  180. //*                                                                                                                                                                                                  *
  181. //*                ***************************定时器0,定时刷新LED*************************                                  *
  182. //*                                                                                                                                                                                                  *
  183. //*************************************************************************************************
  184. void vTimer0(void) interrupt 1
  185. {
  186.         if(b_ShowMode==0)
  187. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<数字模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  188.                 {
  189.                 vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount);           //在LCD上显示1位数字。
  190.                 if(uc_DisCount==5)
  191.                 uc_DisCount=0;                                                //定时器0在每次被触发时,改变LCD显示。
  192.                 else uc_DisCount++;                                        //从第一位到第六位循环显示。
  193.                 }
  194.         else
  195. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定义模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  196.                 {
  197.                 vShowCustom(uca_ShowCustom[uc_DisCount],uc_DisCount);
  198.                 if(uc_DisCount==5)
  199.                 uc_DisCount=0;                                                //定时器0在每次被触发时,改变LCD显示。
  200.                 else uc_DisCount++;                                        //从第一位到第六位循环显示。
  201.                 }

  202. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器0初始状态 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  203.         TH0=TIME0H;        
  204.         TL0=TIME0L;
  205. }
复制代码



0.png

单片机带计时功能的简单计算器仿真工程文件及其他完整资料下载:
http://www.51hei.com/bbs/dpj-54940-1.html









评分

参与人数 1黑币 +5 收起 理由
举头望天 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:137190 发表于 2016-8-31 22:43 | 显示全部楼层
  1. //*************************************************************************************************
  2. //*                                                                                                                                                                                                  *
  3. //*                 ********************************计时状态处理子函数******************************                  *
  4. //*                                                                                                                                                                                                  *
  5. //*************************************************************************************************


  6. extern bit b_CountStart;
  7. extern bit b_CountPause;
  8. extern bit b_ClockStart;
  9. extern bit b_WorkMode;
  10. extern bit b_LCDClean;
  11. extern bit b_KeyShock;
  12. extern unsigned char uc_ReportSymbol;
  13. extern unsigned long ul_Number;
  14. extern unsigned long ul_ClockOppose;
  15. unsigned long ul_TimeTemp;                  //暂停状态技计数暂存。


  16. void vTime(unsigned char ucKeyCode)
  17. {
  18.                 switch(ucKeyCode)
  19.                         {
  20. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  21. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当按下“NO/C”时执行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  22. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  23.                         case 41:
  24. //***************************************00 ->10:从停止到开始****************************************
  25.                                 if((b_CountStart|b_CountPause)==0)                               
  26.                                         {       
  27.                                         ul_Number=0;                                                                //初始化记时值为0.
  28.                                         b_CountStart=1;                                                                //重设标志位,改为开始状态;
  29.                                         b_ClockStart=1;
  30.                                        
  31. //                                        uc_ReportSymbol=6;
  32. //                                        b_LCDClean=1;                                                       
  33.                                         }
  34. //***************************************11 ->10:从暂停到开始****************************************
  35.                                         else if((b_CountStart&b_CountPause)==1)
  36.                                                 {
  37.                                                 ul_Number=ul_TimeTemp;                                        //初始化初值为暂存的值。
  38.                                                 b_CountPause=0;                                                        //重设标志位,改为开始状态。
  39.                                                 b_ClockStart=1;       
  40.                                                
  41. //                                                uc_ReportSymbol=6;
  42. //                                                b_LCDClean=1;                                                       
  43.                                                 }
  44. //***************************************10 ->00:从开始到停止****************************************
  45.                                          else if((b_CountStart=1&(!b_CountPause))==1)       
  46.                                                          {
  47.                                                         b_CountStart=0;                                                        //重设标志位,改为停止状态。
  48.                                                         b_ClockStart=0;                                                        //停止计时。
  49.                                                         ul_Number=0;                                                        //恢复计时前状态。

  50.                                                 uc_ReportSymbol=7;
  51.                                                 b_LCDClean=1;       
  52.                                                         }
  53.                                 break;
  54. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                                  
  55. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当按下“=”时执行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  56. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  57.                         case 43:
  58.                                 if(b_CountStart==1)                                                                //如果是开始或暂停状态则进行处理,
  59.                                         {                                                                                        //否则不处理。
  60.                                         //*******************************10->11:从开始到暂停。****************************
  61.                                         if(b_CountPause==0)                                                       
  62.                                                 {                                                                                //保存计时数值。
  63.                                                 b_CountPause=1;                                                        //如果是开始状态则改为暂停状态。
  64.                                                 ul_TimeTemp=ul_Number;

  65.                                                 uc_ReportSymbol=5;                                                //闪烁显示:-PAUSE
  66.                                                 b_LCDClean=1;
  67.                                                                                        
  68.                                                 b_ClockStart=0;                                                        //暂停计时。
  69.                                                 }
  70.                                         else
  71.                                                 {                        //**************************11 ->10:从暂停到开始*****************                                                                                                   
  72.                                                  b_CountPause=0;                                                //如果是暂停状态则改变为进行状态。
  73.                                                  ul_Number=ul_TimeTemp;                                        //给计时器赋初值为暂停前的值。
  74.                                                  b_ClockStart=1;

  75. //                                                uc_ReportSymbol=6;
  76. //                                                b_LCDClean=1;                                                //继续暂停前的计时。
  77.                                                 }                        //****************************************************************
  78.                                         }
  79.                                 else if(b_CountPause==0)            //***************************00:切换到计算器模式*******
  80.                                                 {
  81.                                                 b_WorkMode=0;                //如果在停止计时状态按下“=”键便会切换到计算器模式。
  82.                                                 ul_Number=0;
  83.                                                 uc_ReportSymbol=4;        //CHAG-0表明从计时器模式切换到计算器模式。
  84.                                                 b_LCDClean=1;
  85.                                                 b_KeyShock=1;
  86.                                                 }
  87.                                 break;
  88. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                                  
  89. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<当按下“+”时执行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  90. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  91.                                 case 44:
  92.                                 {
  93.                                 b_ClockStart=0;                         //停止计时。
  94.                                 //******************************切换到倒计时模式*******************************
  95.                                 b_CountStart=0;               
  96.                                 b_CountPause=1;
  97.                                 ul_Number=0;
  98.                                 uc_ReportSymbol=8;
  99.                                 b_LCDClean=1;
  100.                                 ul_ClockOppose=0;
  101.                                 }
  102.                                 break;
  103.                         default:break;
  104.                         }
  105. }
复制代码
回复

使用道具 举报

ID:137190 发表于 2016-8-31 22:43 | 显示全部楼层
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:LED动态扫描子函数。                                                                                                                                 **
  4. //**<功能>:        unsigned char * pucLedNum(unsigned long ulNumber);                                                           **
  5. //**                        计算一个在000000到999999之间的数的每位数字并存储在数组中.并返回数组的首地址                 **
  6. //**                        void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder);                                         **
  7. //**                        输入一个数字以及所要显示的位置,在LED相应位置上显示相应数字.                                                 **         
  8. //*************************************************************************************************
  9. //*************************************************************************************************


  10. //*************************************************************************************************
  11. //*                                                                                                                                                                                                  *
  12. //*                         ******************************头文件及宏定义**************************                                  *
  13. //*                                                                                                                                                                                                  *
  14. //*************************************************************************************************
  15. #include "LED6Show.h"



  16. //*************************************************************************************************
  17. //*                                                                                                                                                                                                  *
  18. //*                          ********************************全局变量******************************                          *
  19. //*                                                                                                                                                                                                  *
  20. //*************************************************************************************************
  21. unsigned  char code uca_LEDCode[]=
  22.                                         {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
  23.                                          //0,1,2,3,4,5,6,7,8,9,空白。

  24. unsigned char code uca_LEDSelect[]=
  25.                                         {0x01,0x02,0x04,0x08,0x10,0x20};       
  26.                                         //分别点亮第6,5,4,3,2,1号灯。

  27. unsigned char uca_LedNum[6];                       
  28.                                         //存放数字的各个位。

  29. unsigned char uc_NumberFront=1;                                  //只是数字的首位。

  30. extern unsigned char uca_ShowCustom[];                  //在自定义模式下,LCD实时显示该字符。main.c


  31. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定义报告显示字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  32. unsigned char uca_ReportChar1[]={0xBF,0x86,0xC0,0x88,0xBF,0xF9};          
  33.                                         //被除数等于0。                                                                -EOR-1

  34. unsigned char uca_ReportChar2[]={0xBF,0x86,0xC0,0x88,0xBF,0xA4};          
  35.                                         //被减数小于减数。                                                        -EOR-2

  36. unsigned char uca_ReportChar3[]={0xC6,0x89,0x88,0xC2,0xBF,0xF9};          
  37.                                         //表明从计算器模式切换到计时模式。                        CHAG-1

  38. unsigned char uca_ReportChar4[]={0xC6,0x89,0x88,0xC2,0xBF,0xC0};         
  39.                                         //表明从计时器模式切换到计算器模式。                CHAG-0

  40. unsigned char uca_ReportChar5[]={0xBF,0x8C,0x88,0xC1,0x92,0x86};
  41.                                         //暂停                                                                                -PAUSE

  42. //unsigned char uca_ReportChar6[]={0xBF,0x92,0x87,0x88,0x88,0x87};
  43.                                         //开始                                                                                -START

  44. unsigned char uca_ReportChar7[]={0xBF,0x92,0x87,0xC0,0x8C,0xBF};
  45.                                         //停止                                                                                -StoP-


  46. unsigned char uca_ReportChar8[]={0xC0,0x8C,0x8C,0xC0,0x92,0x86};
  47.                                         //切换到倒计时模式                                                        OPPPOSE

  48. unsigned char uca_ReportChar9[]={0xBF,0x86,0xC0,0x88,0xBF,0x90};          
  49.                                         //超出可显示的最大值。                                                -EOR-9


  50. //*************************************************************************************************
  51. //*                                                                                                                                                                                                  *
  52. //*                          ********************************函数实现******************************                          *
  53. //*                                                                                                                                                                                                  *
  54. //*************************************************************************************************
  55. unsigned char * pucLedNum(unsigned long ulNumber)                  //将一个数的各个位分别存到数组里。
  56. {                                                                                                                  //并返回首地址。
  57.         if(ulNumber>999999)
  58.                 ulNumber=999999;
  59.         if(ulNumber<0)
  60.                 ulNumber=0;
  61.         uca_LedNum[5] = ulNumber/100000;                                          //最高位存在数组【5】中。

  62.         uca_LedNum[4] = (ulNumber-100000*(long)uca_LedNum[5])/10000;

  63.         uca_LedNum[3] = (ulNumber-100000*(long)uca_LedNum[5]-10000*(long)uca_LedNum[4])/1000;

  64.         uca_LedNum[2] = (ulNumber-100000*(long)uca_LedNum[5]-10000*(long)uca_LedNum[4]
  65.                                         -1000*(long)uca_LedNum[3])/100;

  66.         uca_LedNum[1] = (ulNumber-100000*(long)uca_LedNum[5]-10000*(long)uca_LedNum[4]
  67.                                         -1000*(long)uca_LedNum[3]-100*(long)uca_LedNum[2])/10;

  68.         uca_LedNum[0] = (ulNumber-100000*(long)uca_LedNum[5]-10000*(long)uca_LedNum[4]
  69.                                         -1000*(long)uca_LedNum[3]-100*(long)uca_LedNum[2]-10*(long)uca_LedNum[1]);
  70.                                                                                                                
  71.                                                                                                                 //最低位存在数组【0】中。

  72.         for(uc_NumberFront=1;uc_NumberFront<6;uc_NumberFront++)
  73.                 {
  74.                         if(uca_LedNum[6-uc_NumberFront]!=0)                        //判断数据的首位不为零数字在第几位。
  75.                                 break;                                                                        //例如:8502的uc_NumberFront为3;
  76.                 }                                                                                                //                0的uc_NumberFront为6;
  77.                                                                                                                 //                450530的uc_NumberFront为1。

  78.         return uca_LedNum;
  79. }



  80. //*********************************************************************************************************
  81. //*                                                                                                                                                                                                                  *
  82. //*                                *****************************将1个1位数按顺序显示****************************                          *
  83. //*                                                                                                                                                                                                                  *
  84. //*********************************************************************************************************
  85. void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)       
  86. {                                                                                                                                       
  87.         if(ucOneNum!=0)                                                                                                //如果数字不为0则正常输出。
  88.                 {
  89.                         LEDSELECT=0;
  90.                         LEDCHAR=uca_LEDCode[ucOneNum];                                                //ucOrder:1~6
  91.                         LEDSELECT=uca_LEDSelect[ucOrder-1];
  92.                 }
  93.         else
  94.                 {
  95.                         if(ucOrder<uc_NumberFront)                                                        //如果为0则判断是不是在数字首位之前。
  96.                                 LEDSELECT=0;                                                                        //如果在则输出空,不显示数据。
  97.                         else
  98.                                 {
  99.                                         LEDSELECT=0;                                                                //如果在首位之后则正常输出。
  100.                                         LEDCHAR=uca_LEDCode[ucOneNum];                                       
  101.                                         LEDSELECT=uca_LEDSelect[ucOrder-1];
  102.                                 }
  103.                 }
  104. }



  105. //*********************************************************************************************************
  106. //*                                                                                                                                                                                                                  *
  107. //*                                ***************************将1个自定义字符按顺序显示*************************                          *
  108. //*                                                                                                                                                                                                                  *
  109. //*********************************************************************************************************
  110. void vShowCustom(unsigned char ucOneCostom,unsigned ucOrder)          
  111. {
  112.         LEDSELECT=0;
  113.         LEDCHAR=ucOneCostom;
  114.         LEDSELECT=uca_LEDSelect[ucOrder];                                 //ucOrder:0~5
  115. }


  116. //*********************************************************************************************************
  117. //*                                                                                                                                                                                                                  *
  118. //*                                ***********************将字符数组复制到字符显示数组中*************************                          *
  119. //*                                                                                                                                                                                                                  *
  120. //*********************************************************************************************************
  121. void vCharCopy(unsigned char ucaArray[])
  122. {
  123.         unsigned char ucCount;
  124.         for(ucCount=0;ucCount<6;ucCount++)
  125.                 {
  126.                 uca_ShowCustom[ucCount]=ucaArray[ucCount];
  127.                 }
  128. }

  129. //*********************************************************************************************************
  130. //*                                                                                                                                                                                                                  *
  131. //*                                ***********************根据报告代号,显示不同的报告字符*************************                  *
  132. //*                                                                                                                                                                                                                  *
  133. //*********************************************************************************************************
  134. void vShowReport(unsigned char ucSymbol)
  135. {
  136.         switch(ucSymbol)
  137.                 {
  138.                 case 1:vCharCopy(uca_ReportChar1);break;        //显示:-EOR-1--被除数等于0;
  139.                 case 2:vCharCopy(uca_ReportChar2);break;        //显示:-EOR-2--被减数小于减数;
  140.                 case 3:vCharCopy(uca_ReportChar3);break;        //显示:CHAG-1--表明从计算器模式切换到计时模式;
  141.                 case 4:vCharCopy(uca_ReportChar4);break;        //显示:CHAG-0--表明从计时器模式切换到计算器模式;
  142.                 case 5:vCharCopy(uca_ReportChar5);break;        //显示:-PAUSE--暂停;
  143. //                case 6:vCharCopy(uca_ReportChar6);break;        //显示:-StART--开始;
  144.                 case 7:vCharCopy(uca_ReportChar7);break;        //显示:-StoP---停止;
  145.                 case 8:vCharCopy(uca_ReportChar8);break;        //显示:OPPOSE--切换到倒计时模式;
  146.                 case 9:vCharCopy(uca_ReportChar9);break;        //显示:-EOR-9--超出可显示的最大值。
  147.                 default:break;
  148.                 }
  149. }
复制代码
回复

使用道具 举报

ID:137190 发表于 2016-8-31 22:44 | 显示全部楼层
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:键盘扫描子程序                                                                                                                                          **
  4. //**<功能>:当有外部中断0时调用此函数,使用列扫描的方式获取键码,键码由2位数字组成。高位为行号   **
  5. //**                低位为列号。                                                                                                                                                  **
  6. //*************************************************************************************************
  7. //*************************************************************************************************


  8. //*************************************************************************************************
  9. //*                                                                                                                                                                                                  *
  10. //*                         ******************************头文件及宏定义**************************                                  *
  11. //*                                                                                                                                                                                                  *
  12. //*************************************************************************************************
  13. #include <at89x51.h>

  14. #define SCANPORT P2                                  //4×4键盘扫描端口,低4位是行线,高4位是列线。
  15.                                                                   //采用逐列扫描的方法,无按键时,低4位输出1,高4位输出0。
  16.                                                                   //当有按键时,高4位输出扫描电位,低4位输入扫描结果。

  17. //*************************************************************************************************
  18. //*                                                                                                                                                                                                  *
  19. //*                          ********************************全局变量******************************                          *
  20. //*                                                                                                                                                                                                  *
  21. //*************************************************************************************************
  22. unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};                //列线扫描电压,分为第1,2,3,4根列线
  23.                                                                                                                         //为低电平,其他为高电平。


  24. //*************************************************************************************************
  25. //*                                                                                                                                                                                                  *
  26. //*                          ********************************函数实现******************************                          *
  27. //*                                                                                                                                                                                                  *
  28. //*************************************************************************************************
  29. unsigned char ucKeyScan()
  30. {
  31.         unsigned char ucTemp=0;                                  //扫描状态暂存。
  32.         unsigned char ucRow=0,ucLine=0;            //行号,列号。

  33.         for(ucLine=0;ucLine<4;ucLine++)                //列扫描
  34.                 {
  35.                         SCANPORT=uca_LineScan[ucLine];                           //输出扫描电位。
  36.                         ucTemp=SCANPORT&0x0F;                                           //输入扫描电位,并屏蔽高4位。
  37.                         if(ucTemp!=0x0F)                 
  38.                                 {                                                                          //判断该列是否有按键按下。
  39.                                 switch(ucTemp)
  40.                                         {
  41.                                         case 0x0E: ucRow=10;break;                  //如果有,则判断行号。
  42.                                         case 0x0D: ucRow=20;break;
  43.                                         case 0x0B: ucRow=30;break;
  44.                                         case 0x07: ucRow=40;break;
  45.                                         default:   ucRow=50;break;
  46.                                         }
  47.                                 break;
  48.                                 }
  49.                 }
  50.         return ucRow+ucLine+1;                         //返回按键编码。格式为2位数,高位为行号,低位为列号。
  51. }
复制代码
回复

使用道具 举报

ID:137190 发表于 2016-8-31 22:44 | 显示全部楼层
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:按键处理子函数                                                                                                                                          **
  4. //**<功能>:当有外部中断0时调用此函数,获得键码,进行相应处理。                                                                     **
  5. //*************************************************************************************************
  6. //*************************************************************************************************


  7. //*************************************************************************************************
  8. //*                                                                                                                                                                                                  *
  9. //*                         ******************************头文件及宏定义**************************                                  *
  10. //*                                                                                                                                                                                                  *
  11. //*************************************************************************************************
  12. #include "Calculator.h"
  13. #include "Timer.h"


  14. //*************************************************************************************************
  15. //*                                                                                                                                                                                                  *
  16. //*                          ********************************全局变量******************************                          *
  17. //*                                                                                                                                                                                                  *
  18. //*************************************************************************************************

  19. extern bit b_KeyShock;                                  //键盘防抖动标志位。

  20. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<工作模式(默认为计算器模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  21. bit b_WorkMode=0;                                         //0--计算器模式;
  22.                                                                          //1--计时模式。

  23. //*************************************************************************************************
  24. //*                                                                                                                                                                                                  *
  25. //*                 ********************************按键处理函数主函数******************************                  *
  26. //*                                                                                                                                                                                                  *
  27. //*************************************************************************************************
  28. void vKeyProcess(unsigned char ucKeyCodeTemp)
  29. {
  30.         if(b_WorkMode==1)
  31.                 vTimer(ucKeyCodeTemp);                        //当工作模式为计时模式时调用计时器处理函数。
  32.         else
  33.                 vCalculator(ucKeyCodeTemp);            //当工作模式为计算器模式时调用计算器处理函数。


  34. }
复制代码
回复

使用道具 举报

ID:137190 发表于 2016-8-31 22:45 | 显示全部楼层
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:计算器处理主程序,根据计算器的输入状态分派不同的函数对按键进行处理。                                  **
  4. //**<功能>:当b_WorkMode=0是,若有键按下则调用此函数对键码进行处理。                                                            **
  5. //*************************************************************************************************
  6. //*************************************************************************************************


  7. //*************************************************************************************************
  8. //*                                                                                                                                                                                                  *
  9. //*                         ******************************头文件及宏定义**************************                                  *
  10. //*                                                                                                                                                                                                  *
  11. //*************************************************************************************************
  12. #include "CalReady.h"


  13. //*************************************************************************************************
  14. //*                                                                                                                                                                                                  *
  15. //*                          ********************************全局变量******************************                          *
  16. //*                                                                                                                                                                                                  *
  17. //*************************************************************************************************
  18. extern unsigned long ul_Number;                         //LCE显示数据,LCD实时显示该数字。

  19. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<工作模式(默认为计算器模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  20. extern bit b_WorkMode;                                         //0--计算器模式;
  21.                                                                                  //1--计时模式。
  22.                                                                                  //定义在KeyProcess.c中。
  23. unsigned char uc_ModeChange=0;

  24. extern bit b_LCDClean;

  25. extern unsigned char uc_ReportSymbol;


  26. unsigned long ul_NumberOne=0;                         //第一个数
  27. unsigned long ul_NumberTwo=0;                         //第二个数
  28. unsigned char uc_Operator=0;                         //运算符
  29. unsigned long ul_Result=0;                                 //运算结果
  30. unsigned char uc_NumPointer=1;                         //计算状态

  31. //*************************************************************************************************
  32. //*                                                                                                                                                                                                  *
  33. //*                  *******************************计算器处理主函数******************************                          *
  34. //*                                                                                                                                                                                                  *
  35. //*************************************************************************************************




  36. void vCalculator(unsigned char ucKeyCode)
  37. {
  38.         if(ucKeyCode==41)                                                                 //判断按键是不是'NO/C'。
  39.                 {
  40.                         if(uc_NumPointer==1)                                        //如果是‘NO/C’键则判断手机否是状态一。
  41.                                 {
  42.                                         if(uc_ModeChange==2)                        //如果是状态一则看uc_ModeChange是不是2。
  43.                                                 {
  44.                                                         uc_ModeChange=0;                //如果是2则计时器模式。
  45.                                                         b_WorkMode=1;

  46.                                                         uc_ReportSymbol=3;                //闪烁显示:-CHAG-1。表明正在切换状态。
  47.                                                         b_LCDClean=1;
  48.                                                 }
  49.                                         else
  50.                                                 {
  51.                                                         uc_ModeChange++;                //如果uc_ModeChange不是2则加一。
  52.                                                         ul_NumberOne=0;                        //清除所有数据,将所有数据恢复到状态一。
  53.                                                         ul_NumberTwo=0;
  54.                                                         ul_Number=0;                       
  55.                                                         uc_NumPointer=1;
  56.                                                 }
  57.                                 }
  58.                         else
  59.                                 {
  60.                                 ul_NumberOne=0;                                                //清除所有数据,将所有数据恢复到状态一。
  61.                                 ul_NumberTwo=0;
  62.                                 ul_Number=0;                       
  63.                                 uc_NumPointer=1;
  64.                         }
  65.                 }
  66.         else
  67.                 {                                                                                           //如果不是“NO/C”键,首先将uc_ModeChange清零。
  68.                 uc_ModeChange=0;
  69. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<根据不同状态分派不同的键处理函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  70.                 switch(uc_NumPointer)
  71.                         {
  72.                         case 1:       
  73.                                         vCalReadyOne(ucKeyCode);                           //进入状态一。
  74.                                         break;
  75.                         case 2:
  76.                                         vCalReadyTwo(ucKeyCode);                           //进入状态二。
  77.                                         break;
  78.                         case 3:
  79.                                         vCalReadyThree(ucKeyCode);                           //进入状态三。
  80.                                         break;

  81.                         default:break;
  82.                         }
  83.                 }

  84. }
复制代码
回复

使用道具 举报

ID:148697 发表于 2016-11-19 19:42 | 显示全部楼层
第十九个怎么有好几个程序
回复

使用道具 举报

ID:189145 发表于 2017-4-13 13:23 | 显示全部楼层
好几个程序怎么弄
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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