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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于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 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区三区不卡 | 国产成人精品一区二区三 | 国产精品久久久久久久免费大片 | 逼逼网| 伊人网站 | 成人精品高清 | 日韩视频观看 | 日韩欧美一区二区三区免费观看 | 先锋av资源网 | 麻豆视频在线看 | 中文字幕在线观看第一页 | 国产精品成人一区二区三区夜夜夜 | 高清久久久 | 草樱av | 天天操天天怕 | 日本不卡一区二区三区 | 91精品欧美久久久久久久 | 欧美在线视频不卡 | 超碰97人人人人人蜜桃 | 99re在线视频精品 | 欧美精品成人一区二区三区四区 | 亚洲毛片在线观看 | 红桃视频一区二区三区免费 | 玖玖操| 在线国产视频 | 午夜视频免费在线观看 | 国产美女在线看 | 国产精品久久久久久久免费大片 | 国内自拍真实伦在线观看 | 97人澡人人添人人爽欧美 | 亚洲激情一区二区 | 麻豆视频国产在线观看 | 久综合| 成人黄色三级毛片 | 国产区视频在线观看 | 国产一区二区三区精品久久久 | www日本在线 | 激情毛片 | 日韩免费成人av | 在线观看视频一区 | 伊人久久精品一区二区三区 |