這是一款基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真,電路簡單,數(shù)碼管為共陽數(shù)碼管。
數(shù)碼管計(jì)算器仿真.jpg (111.8 KB, 下載次數(shù): 83)
下載附件
基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真
2019-5-19 14:48 上傳
#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; //鍵盤防抖動(dòng)標(biāo)志位。
//當(dāng)按鍵中斷產(chǎn)生時(shí),首先判斷此位。
//0--執(zhí)行鍵盤掃描及鍵碼處理程序;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; //通過設(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; //初始化鍵盤接口。
TMOD=0x11; //定時(shí)器0:模式一;定時(shí)器0:模式一.
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TL0=TIME0L;
TR0=1; //開啟定時(shí)器0
ET0=1; //開定時(shí)器0中斷
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時(shí)器1,用于1s計(jì)時(shí) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //開啟定時(shí)器1
ET1=1; //開定時(shí)器1中斷
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用于執(zhí)行鍵盤掃描和鍵處理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; //外部中斷0,中斷方式:下降沿
EX0=1; //開啟外部中斷0
PT0=1; //把定時(shí)器0溢出中斷設(shè)為高優(yōu)先級。
EA=1; //開啟總中斷
while(1);
}
//*************************************************************************************************
//* *
//* ***************************外部中斷0,調(diào)用鍵盤掃描程序************************* *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
EX0=0; //在鍵掃描處理時(shí),關(guān)閉外部中斷0,防抖動(dòng)。
if(b_KeyShock==0)
{
vKeyProcess(ucKeyScan()); //當(dāng)判斷有按鍵按下時(shí),掃描鍵盤,并把掃描結(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)志位開啟則開啟防抖動(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í)模式開啟式,如計(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)閉鍵盤中斷,此時(shí)按鍵無效。
vShowReport(uc_ReportSymbol);
b_ShowMode=1;
}
if(uc_CleanCount%40==0) //通過設(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; //重新開啟鍵盤中斷。
}
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)
uc_DisCount=0; //定時(shí)器0在每次被觸發(fā)時(shí),改變LCD顯示。
else uc_DisCount++; //從第一位到第六位循環(huán)顯示。
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)定時(shí)器0初始狀態(tài) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TL0=TIME0L;
}
全部資料51hei下載地址:
基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真.rar
(440.83 KB, 下載次數(shù): 50)
2019-5-19 14:48 上傳
點(diǎn)擊文件名下載附件
基于51單片機(jī)數(shù)碼管顯示簡易計(jì)算器程序設(shè)計(jì)與仿真 下載積分: 黑幣 -5
|