找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6229|回復(fù): 7
收起左側(cè)

帶計(jì)時(shí)功能的簡(jiǎn)單計(jì)算器單片機(jī)仿真+源程序+電路原理圖 帶數(shù)碼管和液晶2種顯示

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-8-31 22:40 | 顯示全部樓層 |閱讀模式
0.png 0.png
51單片機(jī)做的帶計(jì)時(shí)功能的簡(jiǎn)單計(jì)算器的仿真電路原理圖,有2個(gè)仿真文件一個(gè)是用數(shù)碼管顯示,一個(gè)是用lcd1602液晶來(lái)顯示的.(工程文件清晰版請(qǐng)下載本帖最后的附件)

單片機(jī)帶計(jì)時(shí)功能的簡(jiǎn)單計(jì)算器源程序如下(部分代碼預(yù)覽,完整代碼請(qǐng)下載附件):
  1. //*************************************************************************************************
  2. //*                                                                                                                                                                                                  *
  3. //*                         ******************************頭文件及宏定義**************************                                  *
  4. //*                                                                                                                                                                                                  *
  5. //*************************************************************************************************
  6. #include "includes.h"

  7. #define TIME0H 0xFC
  8. #define TIME0L 0x18                //定時(shí)器0溢出時(shí)間:5ms

  9. #define TIME1H 0x44
  10. #define TIME1L 0x80                //定時(shí)器1溢出時(shí)間:48ms


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

  16. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器0定時(shí)刷新LED計(jì)數(shù)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  17. unsigned long ul_Number=0;                        //LCD實(shí)時(shí)顯示數(shù)字。

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

  20. unsigned char uc_DisCount=1;                //LCD時(shí)事刷新計(jì)數(shù)。

  21. bit b_ShowMode=0;                                        //顯示模式標(biāo)志位。
  22.                                                                         //0--數(shù)字模式,將要顯示的數(shù)字賦給ul_Number便可時(shí)事顯示數(shù)值,
  23.                                                                         //                                默認(rèn)為數(shù)字模式;
  24.                                                                         //1--自定義模式,該模式下自定義字符顯示。

  25. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器1計(jì)數(shù)刷新定時(shí)(計(jì)時(shí)模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  26. unsigned char uc_TimeCount=1;                //定時(shí)器1定時(shí)計(jì)數(shù)。

  27. bit b_ClockStart=0;                                        //定時(shí)器1顯示計(jì)數(shù)標(biāo)志位。

  28. extern bit b_ClockOppose;                        //TimeOppose.c

  29. extern unsigned long ul_ClockOppose;


  30. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動(dòng)標(biāo)志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  31. bit b_KeyShock=0;                                          //鍵盤(pán)防抖動(dòng)標(biāo)志位。
  32.                                                                         //當(dāng)按鍵中斷產(chǎn)生時(shí),首先判斷此位。
  33.                                                                         //0--執(zhí)行鍵盤(pán)掃描及鍵碼處理程序;1--不執(zhí)行。

  34. bit b_KillShock=0;                                        //防抖標(biāo)志清除位:0--不清除;1--清除。

  35. unsigned char uc_KillCount=1;                //抖動(dòng)標(biāo)志清除計(jì)數(shù),使用定時(shí)器1。


  36. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD閃爍顯示報(bào)告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  37. bit b_LCDClean=0;                                          //通過(guò)設(shè)置b_LCDClean為1便可啟動(dòng)延時(shí)清空LCD顯示。

  38. unsigned char uc_CleanCount=1;                  //延遲時(shí)間可在T1中斷中設(shè)定。


  39. unsigned char uc_ReportSymbol;

  40. bit b_ReportFlash=0;

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


  42. //*************************************************************************************************
  43. //*                                                                                                                                                                                                  *
  44. //*                          ********************************主函數(shù)******************************                                  *
  45. //*                                                                                                                                                                                                  *
  46. //*************************************************************************************************
  47. void main()
  48. {
  49.         P2=0x0F;                  //初始化鍵盤(pán)接口。

  50.         TMOD=0x11;                  //定時(shí)器0:模式一;定時(shí)器0:模式一.


  51. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  52.         TH0=TIME0H;
  53.         TL0=TIME0L;
  54.         TR0=1;                         //開(kāi)啟定時(shí)器0
  55.         ET0=1;                         //開(kāi)定時(shí)器0中斷


  56. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器1,用于1s計(jì)時(shí) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  57.         TH1=TIME1H;
  58.         TL1=TIME1L;
  59.         TR1=1;                         //開(kāi)啟定時(shí)器1
  60.         ET1=1;                         //開(kāi)定時(shí)器1中斷


  61. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用于執(zhí)行鍵盤(pán)掃描和鍵處理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
  62.         IT0=1;                         //外部中斷0,中斷方式:下降沿
  63.         EX0=1;                         //開(kāi)啟外部中斷0

  64.         PT0=1;                         //把定時(shí)器0溢出中斷設(shè)為高優(yōu)先級(jí)。

  65.         EA=1;                         //開(kāi)啟總中斷

  66.         while(1);
  67. }



  68. //*************************************************************************************************
  69. //*                                                                                                                                                                                                  *
  70. //*                ***************************外部中斷0,調(diào)用鍵盤(pán)掃描程序*************************                          *
  71. //*                                                                                                                                                                                                  *
  72. //*************************************************************************************************
  73. void vINT0(void) interrupt 0
  74. {
  75.         EX0=0;                                                         //在鍵掃描處理時(shí),關(guān)閉外部中斷0,防抖動(dòng)。

  76.         if(b_KeyShock==0)
  77.                 {
  78.                 vKeyProcess(ucKeyScan());        //當(dāng)判斷有按鍵按下時(shí),掃描鍵盤(pán),并把掃描結(jié)果進(jìn)行處理。
  79.                 b_KeyShock=1;                                        //設(shè)置防抖動(dòng)標(biāo)志。
  80.                 }
  81.         else b_KeyShock=0;                                //如果有抖動(dòng)則不執(zhí)行鍵掃描,恢復(fù)防抖動(dòng)標(biāo)志。

  82. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<設(shè)置防抖動(dòng)清除標(biāo)志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
  83.         if(b_KeyShock==1)
  84.                 b_KillShock=1;                                //如果防抖動(dòng)標(biāo)志位開(kāi)啟則開(kāi)啟防抖動(dòng)標(biāo)志清除位,
  85.                                                                         //300ms后清除防抖動(dòng)標(biāo)志。

  86. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)鍵掃描處理前初始狀態(tài) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  87.         P2=0x0F;                                                  //恢復(fù)P2口。
  88.         EX0=1;                                                        //恢復(fù)按鍵中斷。
  89. }


  90. //*************************************************************************************************
  91. //*                                                                                                                                                                                                  *
  92. //*                ****************定時(shí)器1中斷,用于計(jì)時(shí)功能和防抖動(dòng)標(biāo)志清除以及顯示報(bào)告****************          *
  93. //*                                                                                                                                                                                                  *
  94. //*************************************************************************************************
  95. void vTimer1(void) interrupt 3
  96. {
  97. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<計(jì)時(shí)模式計(jì)數(shù)刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  98.         if(b_ClockStart==1)                                        //當(dāng)計(jì)時(shí)模式開(kāi)啟式,如計(jì)時(shí)處于運(yùn)行狀態(tài)則執(zhí)行定時(shí)計(jì)數(shù)增加。
  99.                 {
  100.                 if(b_ClockOppose==0)                        //正常計(jì)時(shí)。
  101.                         {
  102.                         if(uc_TimeCount%21==0)
  103.                                 {
  104.                                 uc_TimeCount=1;
  105.                                 ul_Number++;
  106.                                 }
  107.                         else uc_TimeCount++;
  108.                         }
  109.                 else
  110.                         {                                                          //倒計(jì)時(shí)模式。
  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. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動(dòng)標(biāo)志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  130.         if(b_KillShock==1)
  131.                 {
  132.                 if(uc_KillCount%5==0)                         //當(dāng)防抖動(dòng)標(biāo)志位為1時(shí),計(jì)時(shí)300ms后清除抖動(dòng)標(biāo)志位。
  133.                         {
  134.                         b_KeyShock=0;
  135.                         b_KillShock=0;
  136.                         uc_KillCount=1;
  137.                         }
  138.                 else uc_KillCount++;
  139.                 }

  140. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD顯示報(bào)告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  141.         if(b_LCDClean==1)
  142.                 {
  143.                         if(uc_CleanCount==1)
  144.                                 {
  145.                                         EX0=0;                                                        //關(guān)閉鍵盤(pán)中斷,此時(shí)按鍵無(wú)效。
  146.                                         vShowReport(uc_ReportSymbol);
  147.                                         b_ShowMode=1;
  148.                                 }
  149.                         if(uc_CleanCount%40==0)                                        //通過(guò)設(shè)置b_LCDClean為1便可啟動(dòng)延時(shí)清空LCD顯示。
  150.                                 {
  151.                                         b_LCDClean=0;                                        //關(guān)閉清零標(biāo)志位,清零結(jié)束。
  152.                                         uc_CleanCount=1;                                //恢復(fù)清零計(jì)數(shù)為初始值1.
  153.                                         b_ShowMode=0;                                        //恢復(fù)顯示模式為默認(rèn)的數(shù)字模式。
  154.                                         b_ReportFlash=0;
  155.                                         EX0=1;                                                        //重新開(kāi)啟鍵盤(pán)中斷。
  156.                                 }
  157.                         else
  158.                                 {
  159.                                 //<<<<<<<<<<<<<<<<<<<<<<<<<實(shí)現(xiàn)閃爍報(bào)告功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  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. //*                ***************************定時(shí)器0,定時(shí)刷新LED*************************                                  *
  182. //*                                                                                                                                                                                                  *
  183. //*************************************************************************************************
  184. void vTimer0(void) interrupt 1
  185. {
  186.         if(b_ShowMode==0)
  187. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<數(shù)字模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  188.                 {
  189.                 vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount);           //在LCD上顯示1位數(shù)字。
  190.                 if(uc_DisCount==5)
  191.                 uc_DisCount=0;                                                //定時(shí)器0在每次被觸發(fā)時(shí),改變LCD顯示。
  192.                 else uc_DisCount++;                                        //從第一位到第六位循環(huán)顯示。
  193.                 }
  194.         else
  195. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定義模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  196.                 {
  197.                 vShowCustom(uca_ShowCustom[uc_DisCount],uc_DisCount);
  198.                 if(uc_DisCount==5)
  199.                 uc_DisCount=0;                                                //定時(shí)器0在每次被觸發(fā)時(shí),改變LCD顯示。
  200.                 else uc_DisCount++;                                        //從第一位到第六位循環(huán)顯示。
  201.                 }

  202. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)定時(shí)器0初始狀態(tài) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  203.         TH0=TIME0H;        
  204.         TL0=TIME0L;
  205. }
復(fù)制代碼



0.png

單片機(jī)帶計(jì)時(shí)功能的簡(jiǎn)單計(jì)算器仿真工程文件及其他完整資料下載:
http://www.torrancerestoration.com/bbs/dpj-54940-1.html









評(píng)分

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

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:137190 發(fā)表于 2016-8-31 22:43 | 顯示全部樓層
  1. //*************************************************************************************************
  2. //*                                                                                                                                                                                                  *
  3. //*                 ********************************計(jì)時(shí)狀態(tài)處理子函數(shù)******************************                  *
  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;                  //暫停狀態(tài)技計(jì)數(shù)暫存。


  16. void vTime(unsigned char ucKeyCode)
  17. {
  18.                 switch(ucKeyCode)
  19.                         {
  20. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  21. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<當(dāng)按下“NO/C”時(shí)執(zhí)行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  22. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  23.                         case 41:
  24. //***************************************00 ->10:從停止到開(kāi)始****************************************
  25.                                 if((b_CountStart|b_CountPause)==0)                               
  26.                                         {       
  27.                                         ul_Number=0;                                                                //初始化記時(shí)值為0.
  28.                                         b_CountStart=1;                                                                //重設(shè)標(biāo)志位,改為開(kāi)始狀態(tài);
  29.                                         b_ClockStart=1;
  30.                                        
  31. //                                        uc_ReportSymbol=6;
  32. //                                        b_LCDClean=1;                                                       
  33.                                         }
  34. //***************************************11 ->10:從暫停到開(kāi)始****************************************
  35.                                         else if((b_CountStart&b_CountPause)==1)
  36.                                                 {
  37.                                                 ul_Number=ul_TimeTemp;                                        //初始化初值為暫存的值。
  38.                                                 b_CountPause=0;                                                        //重設(shè)標(biāo)志位,改為開(kāi)始狀態(tài)。
  39.                                                 b_ClockStart=1;       
  40.                                                
  41. //                                                uc_ReportSymbol=6;
  42. //                                                b_LCDClean=1;                                                       
  43.                                                 }
  44. //***************************************10 ->00:從開(kāi)始到停止****************************************
  45.                                          else if((b_CountStart=1&(!b_CountPause))==1)       
  46.                                                          {
  47.                                                         b_CountStart=0;                                                        //重設(shè)標(biāo)志位,改為停止?fàn)顟B(tài)。
  48.                                                         b_ClockStart=0;                                                        //停止計(jì)時(shí)。
  49.                                                         ul_Number=0;                                                        //恢復(fù)計(jì)時(shí)前狀態(tài)。

  50.                                                 uc_ReportSymbol=7;
  51.                                                 b_LCDClean=1;       
  52.                                                         }
  53.                                 break;
  54. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                                  
  55. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<當(dāng)按下“=”時(shí)執(zhí)行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  56. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  57.                         case 43:
  58.                                 if(b_CountStart==1)                                                                //如果是開(kāi)始或暫停狀態(tài)則進(jìn)行處理,
  59.                                         {                                                                                        //否則不處理。
  60.                                         //*******************************10->11:從開(kāi)始到暫停。****************************
  61.                                         if(b_CountPause==0)                                                       
  62.                                                 {                                                                                //保存計(jì)時(shí)數(shù)值。
  63.                                                 b_CountPause=1;                                                        //如果是開(kāi)始狀態(tài)則改為暫停狀態(tài)。
  64.                                                 ul_TimeTemp=ul_Number;

  65.                                                 uc_ReportSymbol=5;                                                //閃爍顯示:-PAUSE
  66.                                                 b_LCDClean=1;
  67.                                                                                        
  68.                                                 b_ClockStart=0;                                                        //暫停計(jì)時(shí)。
  69.                                                 }
  70.                                         else
  71.                                                 {                        //**************************11 ->10:從暫停到開(kāi)始*****************                                                                                                   
  72.                                                  b_CountPause=0;                                                //如果是暫停狀態(tài)則改變?yōu)檫M(jìn)行狀態(tài)。
  73.                                                  ul_Number=ul_TimeTemp;                                        //給計(jì)時(shí)器賦初值為暫停前的值。
  74.                                                  b_ClockStart=1;

  75. //                                                uc_ReportSymbol=6;
  76. //                                                b_LCDClean=1;                                                //繼續(xù)暫停前的計(jì)時(shí)。
  77.                                                 }                        //****************************************************************
  78.                                         }
  79.                                 else if(b_CountPause==0)            //***************************00:切換到計(jì)算器模式*******
  80.                                                 {
  81.                                                 b_WorkMode=0;                //如果在停止計(jì)時(shí)狀態(tài)按下“=”鍵便會(huì)切換到計(jì)算器模式。
  82.                                                 ul_Number=0;
  83.                                                 uc_ReportSymbol=4;        //CHAG-0表明從計(jì)時(shí)器模式切換到計(jì)算器模式。
  84.                                                 b_LCDClean=1;
  85.                                                 b_KeyShock=1;
  86.                                                 }
  87.                                 break;
  88. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                                  
  89. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<當(dāng)按下“+”時(shí)執(zhí)行>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  90. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  91.                                 case 44:
  92.                                 {
  93.                                 b_ClockStart=0;                         //停止計(jì)時(shí)。
  94.                                 //******************************切換到倒計(jì)時(shí)模式*******************************
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:137190 發(fā)表于 2016-8-31 22:43 | 顯示全部樓層
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:LED動(dòng)態(tài)掃描子函數(shù)。                                                                                                                                 **
  4. //**<功能>:        unsigned char * pucLedNum(unsigned long ulNumber);                                                           **
  5. //**                        計(jì)算一個(gè)在000000到999999之間的數(shù)的每位數(shù)字并存儲(chǔ)在數(shù)組中.并返回?cái)?shù)組的首地址                 **
  6. //**                        void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder);                                         **
  7. //**                        輸入一個(gè)數(shù)字以及所要顯示的位置,在LED相應(yīng)位置上顯示相應(yīng)數(shù)字.                                                 **         
  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.                                         //分別點(diǎn)亮第6,5,4,3,2,1號(hào)燈。

  27. unsigned char uca_LedNum[6];                       
  28.                                         //存放數(shù)字的各個(gè)位。

  29. unsigned char uc_NumberFront=1;                                  //只是數(shù)字的首位。

  30. extern unsigned char uca_ShowCustom[];                  //在自定義模式下,LCD實(shí)時(shí)顯示該字符。main.c


  31. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定義報(bào)告顯示字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  32. unsigned char uca_ReportChar1[]={0xBF,0x86,0xC0,0x88,0xBF,0xF9};          
  33.                                         //被除數(shù)等于0。                                                                -EOR-1

  34. unsigned char uca_ReportChar2[]={0xBF,0x86,0xC0,0x88,0xBF,0xA4};          
  35.                                         //被減數(shù)小于減數(shù)。                                                        -EOR-2

  36. unsigned char uca_ReportChar3[]={0xC6,0x89,0x88,0xC2,0xBF,0xF9};          
  37.                                         //表明從計(jì)算器模式切換到計(jì)時(shí)模式。                        CHAG-1

  38. unsigned char uca_ReportChar4[]={0xC6,0x89,0x88,0xC2,0xBF,0xC0};         
  39.                                         //表明從計(jì)時(shí)器模式切換到計(jì)算器模式。                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.                                         //開(kāi)始                                                                                -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.                                         //切換到倒計(jì)時(shí)模式                                                        OPPPOSE

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


  50. //*************************************************************************************************
  51. //*                                                                                                                                                                                                  *
  52. //*                          ********************************函數(shù)實(shí)現(xiàn)******************************                          *
  53. //*                                                                                                                                                                                                  *
  54. //*************************************************************************************************
  55. unsigned char * pucLedNum(unsigned long ulNumber)                  //將一個(gè)數(shù)的各個(gè)位分別存到數(shù)組里。
  56. {                                                                                                                  //并返回首地址。
  57.         if(ulNumber>999999)
  58.                 ulNumber=999999;
  59.         if(ulNumber<0)
  60.                 ulNumber=0;
  61.         uca_LedNum[5] = ulNumber/100000;                                          //最高位存在數(shù)組【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.                                                                                                                 //最低位存在數(shù)組【0】中。

  72.         for(uc_NumberFront=1;uc_NumberFront<6;uc_NumberFront++)
  73.                 {
  74.                         if(uca_LedNum[6-uc_NumberFront]!=0)                        //判斷數(shù)據(jù)的首位不為零數(shù)字在第幾位。
  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個(gè)1位數(shù)按順序顯示****************************                          *
  83. //*                                                                                                                                                                                                                  *
  84. //*********************************************************************************************************
  85. void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)       
  86. {                                                                                                                                       
  87.         if(ucOneNum!=0)                                                                                                //如果數(shù)字不為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則判斷是不是在數(shù)字首位之前。
  96.                                 LEDSELECT=0;                                                                        //如果在則輸出空,不顯示數(shù)據(jù)。
  97.                         else
  98.                                 {
  99.                                         LEDSELECT=0;                                                                //如果在首位之后則正常輸出。
  100.                                         LEDCHAR=uca_LEDCode[ucOneNum];                                       
  101.                                         LEDSELECT=uca_LEDSelect[ucOrder-1];
  102.                                 }
  103.                 }
  104. }



  105. //*********************************************************************************************************
  106. //*                                                                                                                                                                                                                  *
  107. //*                                ***************************將1個(gè)自定義字符按順序顯示*************************                          *
  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. //*                                ***********************將字符數(shù)組復(fù)制到字符顯示數(shù)組中*************************                          *
  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. //*                                ***********************根據(jù)報(bào)告代號(hào),顯示不同的報(bào)告字符*************************                  *
  132. //*                                                                                                                                                                                                                  *
  133. //*********************************************************************************************************
  134. void vShowReport(unsigned char ucSymbol)
  135. {
  136.         switch(ucSymbol)
  137.                 {
  138.                 case 1:vCharCopy(uca_ReportChar1);break;        //顯示:-EOR-1--被除數(shù)等于0;
  139.                 case 2:vCharCopy(uca_ReportChar2);break;        //顯示:-EOR-2--被減數(shù)小于減數(shù);
  140.                 case 3:vCharCopy(uca_ReportChar3);break;        //顯示:CHAG-1--表明從計(jì)算器模式切換到計(jì)時(shí)模式;
  141.                 case 4:vCharCopy(uca_ReportChar4);break;        //顯示:CHAG-0--表明從計(jì)時(shí)器模式切換到計(jì)算器模式;
  142.                 case 5:vCharCopy(uca_ReportChar5);break;        //顯示:-PAUSE--暫停;
  143. //                case 6:vCharCopy(uca_ReportChar6);break;        //顯示:-StART--開(kāi)始;
  144.                 case 7:vCharCopy(uca_ReportChar7);break;        //顯示:-StoP---停止;
  145.                 case 8:vCharCopy(uca_ReportChar8);break;        //顯示:OPPOSE--切換到倒計(jì)時(shí)模式;
  146.                 case 9:vCharCopy(uca_ReportChar9);break;        //顯示:-EOR-9--超出可顯示的最大值。
  147.                 default:break;
  148.                 }
  149. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:137190 發(fā)表于 2016-8-31 22:44 | 顯示全部樓層
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:鍵盤(pán)掃描子程序                                                                                                                                          **
  4. //**<功能>:當(dāng)有外部中斷0時(shí)調(diào)用此函數(shù),使用列掃描的方式獲取鍵碼,鍵碼由2位數(shù)字組成。高位為行號(hào)   **
  5. //**                低位為列號(hào)。                                                                                                                                                  **
  6. //*************************************************************************************************
  7. //*************************************************************************************************


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

  14. #define SCANPORT P2                                  //4×4鍵盤(pán)掃描端口,低4位是行線(xiàn),高4位是列線(xiàn)。
  15.                                                                   //采用逐列掃描的方法,無(wú)按鍵時(shí),低4位輸出1,高4位輸出0。
  16.                                                                   //當(dāng)有按鍵時(shí),高4位輸出掃描電位,低4位輸入掃描結(jié)果。

  17. //*************************************************************************************************
  18. //*                                                                                                                                                                                                  *
  19. //*                          ********************************全局變量******************************                          *
  20. //*                                                                                                                                                                                                  *
  21. //*************************************************************************************************
  22. unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};                //列線(xiàn)掃描電壓,分為第1,2,3,4根列線(xiàn)
  23.                                                                                                                         //為低電平,其他為高電平。


  24. //*************************************************************************************************
  25. //*                                                                                                                                                                                                  *
  26. //*                          ********************************函數(shù)實(shí)現(xiàn)******************************                          *
  27. //*                                                                                                                                                                                                  *
  28. //*************************************************************************************************
  29. unsigned char ucKeyScan()
  30. {
  31.         unsigned char ucTemp=0;                                  //掃描狀態(tài)暫存。
  32.         unsigned char ucRow=0,ucLine=0;            //行號(hào),列號(hào)。

  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;                  //如果有,則判斷行號(hào)。
  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位數(shù),高位為行號(hào),低位為列號(hào)。
  51. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:137190 發(fā)表于 2016-8-31 22:44 | 顯示全部樓層
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:按鍵處理子函數(shù)                                                                                                                                          **
  4. //**<功能>:當(dāng)有外部中斷0時(shí)調(diào)用此函數(shù),獲得鍵碼,進(jìn)行相應(yīng)處理。                                                                     **
  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;                                  //鍵盤(pán)防抖動(dòng)標(biāo)志位。

  20. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<工作模式(默認(rèn)為計(jì)算器模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  21. bit b_WorkMode=0;                                         //0--計(jì)算器模式;
  22.                                                                          //1--計(jì)時(shí)模式。

  23. //*************************************************************************************************
  24. //*                                                                                                                                                                                                  *
  25. //*                 ********************************按鍵處理函數(shù)主函數(shù)******************************                  *
  26. //*                                                                                                                                                                                                  *
  27. //*************************************************************************************************
  28. void vKeyProcess(unsigned char ucKeyCodeTemp)
  29. {
  30.         if(b_WorkMode==1)
  31.                 vTimer(ucKeyCodeTemp);                        //當(dāng)工作模式為計(jì)時(shí)模式時(shí)調(diào)用計(jì)時(shí)器處理函數(shù)。
  32.         else
  33.                 vCalculator(ucKeyCodeTemp);            //當(dāng)工作模式為計(jì)算器模式時(shí)調(diào)用計(jì)算器處理函數(shù)。


  34. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:137190 發(fā)表于 2016-8-31 22:45 | 顯示全部樓層
  1. //*************************************************************************************************
  2. //*************************************************************************************************
  3. //**<程序名>:計(jì)算器處理主程序,根據(jù)計(jì)算器的輸入狀態(tài)分派不同的函數(shù)對(duì)按鍵進(jìn)行處理。                                  **
  4. //**<功能>:當(dāng)b_WorkMode=0是,若有鍵按下則調(diào)用此函數(shù)對(duì)鍵碼進(jìn)行處理。                                                            **
  5. //*************************************************************************************************
  6. //*************************************************************************************************


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


  13. //*************************************************************************************************
  14. //*                                                                                                                                                                                                  *
  15. //*                          ********************************全局變量******************************                          *
  16. //*                                                                                                                                                                                                  *
  17. //*************************************************************************************************
  18. extern unsigned long ul_Number;                         //LCE顯示數(shù)據(jù),LCD實(shí)時(shí)顯示該數(shù)字。

  19. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<工作模式(默認(rèn)為計(jì)算器模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  20. extern bit b_WorkMode;                                         //0--計(jì)算器模式;
  21.                                                                                  //1--計(jì)時(shí)模式。
  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;                         //第一個(gè)數(shù)
  27. unsigned long ul_NumberTwo=0;                         //第二個(gè)數(shù)
  28. unsigned char uc_Operator=0;                         //運(yùn)算符
  29. unsigned long ul_Result=0;                                 //運(yùn)算結(jié)果
  30. unsigned char uc_NumPointer=1;                         //計(jì)算狀態(tài)

  31. //*************************************************************************************************
  32. //*                                                                                                                                                                                                  *
  33. //*                  *******************************計(jì)算器處理主函數(shù)******************************                          *
  34. //*                                                                                                                                                                                                  *
  35. //*************************************************************************************************




  36. void vCalculator(unsigned char ucKeyCode)
  37. {
  38.         if(ucKeyCode==41)                                                                 //判斷按鍵是不是'NO/C'。
  39.                 {
  40.                         if(uc_NumPointer==1)                                        //如果是‘NO/C’鍵則判斷手機(jī)否是狀態(tài)一。
  41.                                 {
  42.                                         if(uc_ModeChange==2)                        //如果是狀態(tài)一則看uc_ModeChange是不是2。
  43.                                                 {
  44.                                                         uc_ModeChange=0;                //如果是2則計(jì)時(shí)器模式。
  45.                                                         b_WorkMode=1;

  46.                                                         uc_ReportSymbol=3;                //閃爍顯示:-CHAG-1。表明正在切換狀態(tài)。
  47.                                                         b_LCDClean=1;
  48.                                                 }
  49.                                         else
  50.                                                 {
  51.                                                         uc_ModeChange++;                //如果uc_ModeChange不是2則加一。
  52.                                                         ul_NumberOne=0;                        //清除所有數(shù)據(jù),將所有數(shù)據(jù)恢復(fù)到狀態(tài)一。
  53.                                                         ul_NumberTwo=0;
  54.                                                         ul_Number=0;                       
  55.                                                         uc_NumPointer=1;
  56.                                                 }
  57.                                 }
  58.                         else
  59.                                 {
  60.                                 ul_NumberOne=0;                                                //清除所有數(shù)據(jù),將所有數(shù)據(jù)恢復(fù)到狀態(tài)一。
  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. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<根據(jù)不同狀態(tài)分派不同的鍵處理函數(shù)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  70.                 switch(uc_NumPointer)
  71.                         {
  72.                         case 1:       
  73.                                         vCalReadyOne(ucKeyCode);                           //進(jìn)入狀態(tài)一。
  74.                                         break;
  75.                         case 2:
  76.                                         vCalReadyTwo(ucKeyCode);                           //進(jìn)入狀態(tài)二。
  77.                                         break;
  78.                         case 3:
  79.                                         vCalReadyThree(ucKeyCode);                           //進(jìn)入狀態(tài)三。
  80.                                         break;

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

  84. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:148697 發(fā)表于 2016-11-19 19:42 | 顯示全部樓層
第十九個(gè)怎么有好幾個(gè)程序
回復(fù)

使用道具 舉報(bào)

ID:189145 發(fā)表于 2017-4-13 13:23 | 顯示全部樓層
好幾個(gè)程序怎么弄
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表