這是一款基于51單片機數碼管顯示簡易計算器程序設計與仿真,電路簡單,數碼管為共陽數碼管。
數碼管計算器仿真.jpg (111.8 KB, 下載次數: 83)
下載附件
基于51單片機數碼管顯示簡易計算器程序設計與仿真
2019-5-19 14:48 上傳
#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)
2019-5-19 14:48 上傳
點擊文件名下載附件
基于51單片機數碼管顯示簡易計算器程序設計與仿真 下載積分: 黑幣 -5
|