久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6168|回復: 7
打印 上一主題 下一主題
收起左側

帶計時功能的簡單計算器單片機仿真+源程序+電路原理圖 帶數碼管和液晶2種顯示

[復制鏈接]
跳轉到指定樓層
樓主

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. }
復制代碼





單片機帶計時功能的簡單計算器仿真工程文件及其他完整資料下載:
http://www.zg4o1577.cn/bbs/dpj-54940-1.html









評分

參與人數 1黑幣 +5 收起 理由
舉頭望天 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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. }
復制代碼
回復

使用道具 舉報

5#
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. }
復制代碼
回復

使用道具 舉報

6#
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. }
復制代碼
回復

使用道具 舉報

7#
ID:148697 發表于 2016-11-19 19:42 | 只看該作者
第十九個怎么有好幾個程序
回復

使用道具 舉報

8#
ID:189145 發表于 2017-4-13 13:23 | 只看該作者
好幾個程序怎么弄
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产欧美一区二区成人 | 天堂素人约啪 | 日韩在线免费播放 | 久久久久午夜 | 欧美一区二区在线视频 | 97国产精品 | 精品乱码一区二区三四区 | 久草视频观看 | 亚洲精久久久 | 久久午夜影院 | 久久精品无码一区二区三区 | 亚洲一区二区免费 | 色成人免费网站 | 国产精品成人一区二区三区 | 亚洲欧美日本国产 | 中文字幕日本一区二区 | 九七午夜剧场福利写真 | 一级黄色片在线看 | 99精品一区 | 亚洲狠狠爱| 亚洲国产高清在线观看 | 免费一级欧美在线观看视频 | 精品国产91| 国产精品久久av | 亚洲精品日韩综合观看成人91 | www.天天操| 91精品国产日韩91久久久久久 | 亚洲欧美日韩在线一区二区 | 欧美一区二区免费视频 | 日韩在线xx | 国产精品毛片一区二区在线看 | 精品视频国产 | 特一级黄色毛片 | 中文字幕第三页 | 一区二区三区免费 | 一区二区三区中文字幕 | 91视频网址 | 天天操夜夜操 | av中文天堂 | 欧美影院 | 国产精品久久久久久52avav |