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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5717|回復: 0
收起左側

基于51單片機數碼管顯示簡易計算器程序設計與仿真

[復制鏈接]
ID:34643 發表于 2019-5-19 14:50 | 顯示全部樓層 |閱讀模式
      這是一款基于51單片機數碼管顯示簡易計算器程序設計與仿真,電路簡單,數碼管為共陽數碼管。

基于51單片機數碼管顯示簡易計算器程序設計與仿真

基于51單片機數碼管顯示簡易計算器程序設計與仿真


#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)
                uc_DisCount=0;                                                //定時器0在每次被觸發時,改變LCD顯示。
                else uc_DisCount++;                                        //從第一位到第六位循環顯示。
                }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復定時器0初始狀態 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        TH0=TIME0H;        
        TL0=TIME0L;
}

全部資料51hei下載地址:
基于51單片機數碼管顯示簡易計算器程序設計與仿真.rar (440.83 KB, 下載次數: 50)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人性视频免费网站 | 91视频.com | 一区二区三区国产好的精 | 国产一区二区三区免费观看视频 | 久久99精品久久久久子伦 | 国产精品久久久久久久7电影 | 日韩精品免费视频 | 国产精品免费在线 | 久久精片| 国产小视频在线观看 | 男女视频免费 | 九九热九九 | 国产一区二区三区在线 | 国产成人精品一区二区三区四区 | 国产日韩欧美激情 | 激情久久久久 | 国产高清精品一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 一区二区中文 | 99免费精品视频 | 日韩欧美在线观看 | 91精品久久久久久久久久 | 一级毛片在线播放 | 中文字幕亚洲免费 | 秋霞电影一区二区 | 成人精品久久日伦片大全免费 | 国产福利在线 | 男女免费在线观看视频 | 天天综合久久 | 中文字幕免费中文 | 久久成人免费 | 蜜桃视频在线观看免费视频网站www | 人人干人人看 | av男人的天堂在线 | 一级片av| 中文字幕视频在线 | 国产资源在线视频 | 亚洲网在线| 一区二区三区中文字幕 | 日韩精品一区二区三区中文字幕 | 理论片午午伦夜理片影院 |