可以進行6位數以內正整數的加減乘除運算,以及計時器和自定義倒計時功能
QQ拼音截圖未命名.png (23.04 KB, 下載次數: 89)
下載附件
2017-5-10 10:54 上傳
本程序有LCD動態顯示,鍵盤輸入顯示功能,以及1s計數功能。共有2種工作狀態。程序啟動時默認為計算器狀態。
(1)計算器狀態下:
A:按“0”~“9”,顯示相應數字;
B:按“ON/C”,切換到計時模式;
C:按其他鍵,顯示兩位數,高位是行號,低位是列號。
(2)在計時器模式下:
A:在停止狀態按“=”則切換到計算器模式,按“ON/C”則開始計時;
B:在暫停狀態,按“=”或“ON/C”則恢復計時;
C:在即計時狀態,按“=”則暫停計時,按“ON/C”則停止計時,恢復到初始狀態,計數為0.
相關顯示代碼:報告代號 顯示 含義
1: -EOR-1 被除數等于0;
2: -EOR-2 被減數小于減數;
3: CHAG-1 表明從計算器模式切換到計時模式;
4: CHAG-0 表明從計時器模式切換到計算器模式;
5: -PAUSE 暫停;
7: -StoP- 停止;
8: OPPOSE 切換到倒計時模式;
9: -EOR-9 超出可顯示的最大值。
消息代碼使用方法:先給uc_ReportSymbol賦報告代號,再把b_LCDClean置1.
0.png (56.32 KB, 下載次數: 84)
下載附件
2017-5-10 15:42 上傳
單片機源程序:
- //*************************************************************************************************
- //*************************************************************************************************
- //**<程序名>:多功能計算器 **
- //**<功能>:可以進行6位數以內正整數的加減乘除運算,以及計時器和自定義倒計時功能 **
- //**<作者>:LastRitter **
- //**<聯系方式>:51hei電子
- //*************************************************************************************************
- //*************************************************************************************************
- //*************************************************************************************************
- //* *
- //* ******************************頭文件及宏定義************************** *
- //* *
- //*************************************************************************************************
- #include "includes.h"
- #define TIME0H 0xFC
- #define TIME0L 0x18 //定時器0溢出時間:5ms
- #define TIME1H 0x44
- #define TIME1L 0x80 //定時器1溢出時間:48ms
- //*************************************************************************************************
- //* *
- //* ********************************全局變量****************************** *
- //* *
- //*************************************************************************************************
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器0定時刷新LED計數>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- unsigned long ul_Number=0; //LCD實時顯示數字。
- unsigned char uca_ShowCustom[6]={0x88,0x83,0xC6,0xA1,0x86,0x84};
- //存放自定義顯示字符。
- unsigned char uc_DisCount=1; //LCD時事刷新計數。
- bit b_ShowMode=0; //顯示模式標志位。
- //0--數字模式,將要顯示的數字賦給ul_Number便可時事顯示數值,
- // 默認為數字模式;
- //1--自定義模式,該模式下自定義字符顯示。
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器1計數刷新定時(計時模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- unsigned char uc_TimeCount=1; //定時器1定時計數。
- bit b_ClockStart=0; //定時器1顯示計數標志位。
- extern bit b_ClockOppose; //TimeOppose.c
- extern unsigned long ul_ClockOppose;
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- bit b_KeyShock=0; //鍵盤防抖動標志位。
- //當按鍵中斷產生時,首先判斷此位。
- //0--執行鍵盤掃描及鍵碼處理程序;1--不執行。
- bit b_KillShock=0; //防抖標志清除位:0--不清除;1--清除。
- unsigned char uc_KillCount=1; //抖動標志清除計數,使用定時器1。
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD閃爍顯示報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- bit b_LCDClean=0; //通過設置b_LCDClean為1便可啟動延時清空LCD顯示。
- unsigned char uc_CleanCount=1; //延遲時間可在T1中斷中設定。
- unsigned char uc_ReportSymbol;
- bit b_ReportFlash=0;
- unsigned char uca_FlashBlank[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
- //*************************************************************************************************
- //* *
- //* ********************************主函數****************************** *
- //* *
- //*************************************************************************************************
- void main()
- {
- P2=0x0F; //初始化鍵盤接口。
- TMOD=0x11; //定時器0:模式一;定時器0:模式一.
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- TH0=TIME0H;
- TL0=TIME0L;
- TR0=1; //開啟定時器0
- ET0=1; //開定時器0中斷
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器1,用于1s計時 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- TH1=TIME1H;
- TL1=TIME1L;
- TR1=1; //開啟定時器1
- ET1=1; //開定時器1中斷
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用于執行鍵盤掃描和鍵處理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
- IT0=1; //外部中斷0,中斷方式:下降沿
- EX0=1; //開啟外部中斷0
- PT0=1; //把定時器0溢出中斷設為高優先級。
- EA=1; //開啟總中斷
- while(1);
- }
- //*************************************************************************************************
- //* *
- //* ***************************外部中斷0,調用鍵盤掃描程序************************* *
- //* *
- //*************************************************************************************************
- void vINT0(void) interrupt 0
- {
- EX0=0; //在鍵掃描處理時,關閉外部中斷0,防抖動。
- if(b_KeyShock==0)
- {
- vKeyProcess(ucKeyScan()); //當判斷有按鍵按下時,掃描鍵盤,并把掃描結果進行處理。
- b_KeyShock=1; //設置防抖動標志。
- }
- else b_KeyShock=0; //如果有抖動則不執行鍵掃描,恢復防抖動標志。
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<設置防抖動清除標志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- if(b_KeyShock==1)
- b_KillShock=1; //如果防抖動標志位開啟則開啟防抖動標志清除位,
- //300ms后清除防抖動標志。
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復鍵掃描處理前初始狀態 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- P2=0x0F; //恢復P2口。
- EX0=1; //恢復按鍵中斷。
- }
- //*************************************************************************************************
- //* *
- //* ****************定時器1中斷,用于計時功能和防抖動標志清除以及顯示報告**************** *
- //* *
- //*************************************************************************************************
- void vTimer1(void) interrupt 3
- {
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<計時模式計數刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- if(b_ClockStart==1) //當計時模式開啟式,如計時處于運行狀態則執行定時計數增加。
- {
- if(b_ClockOppose==0) //正常計時。
- {
- if(uc_TimeCount%21==0)
- {
- uc_TimeCount=1;
- ul_Number++;
- }
- else uc_TimeCount++;
- }
- else
- { //倒計時模式。
- if(uc_TimeCount%21==0)
- {
- uc_TimeCount=1;
- if(ul_ClockOppose>0)
- {
- ul_ClockOppose--;
- ul_Number=ul_ClockOppose;
- }
- else
- {
- b_ClockStart=0;
- uc_ReportSymbol=7;
- b_LCDClean=1;
- }
- }
- else uc_TimeCount++;
- }
- }
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- if(b_KillShock==1)
- {
- if(uc_KillCount%5==0) //當防抖動標志位為1時,計時300ms后清除抖動標志位。
- {
- b_KeyShock=0;
- b_KillShock=0;
- uc_KillCount=1;
- }
- else uc_KillCount++;
- }
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD顯示報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- if(b_LCDClean==1)
- {
- if(uc_CleanCount==1)
- {
- EX0=0; //關閉鍵盤中斷,此時按鍵無效。
- vShowReport(uc_ReportSymbol);
- b_ShowMode=1;
- }
- if(uc_CleanCount%40==0) //通過設置b_LCDClean為1便可啟動延時清空LCD顯示。
- {
- b_LCDClean=0; //關閉清零標志位,清零結束。
- uc_CleanCount=1; //恢復清零計數為初始值1.
- b_ShowMode=0; //恢復顯示模式為默認的數字模式。
- b_ReportFlash=0;
- EX0=1; //重新開啟鍵盤中斷。
- }
- else
- {
- //<<<<<<<<<<<<<<<<<<<<<<<<<實現閃爍報告功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- if(uc_CleanCount%7==0)
- {
- if(b_ReportFlash==0)
- {
- vCharCopy(uca_FlashBlank);
- b_ReportFlash=1;
- }
- else
- {
- vShowReport(uc_ReportSymbol);
- b_ReportFlash=0;
- }
- }
- uc_CleanCount++;
- }
- }
- TH1=TIME1H;
- TL1=TIME1L;
- }
- //*************************************************************************************************
- //* *
- //* ***************************定時器0,定時刷新LED************************* *
- //* *
- //*************************************************************************************************
- void vTimer0(void) interrupt 1
- {
- if(b_ShowMode==0)
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<數字模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- {
- vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount); //在LCD上顯示1位數字。
- if(uc_DisCount==5)
- uc_DisCount=0; //定時器0在每次被觸發時,改變LCD顯示。
- else uc_DisCount++; //從第一位到第六位循環顯示。
- }
- else
- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定義模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- {
- vShowCustom(uca_ShowCustom[uc_DisCount],uc_DisCount);
- if(uc_DisCount==5)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料下載:
用51做的簡易計算器.rar
(116.18 KB, 下載次數: 91)
2017-5-10 10:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|