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