標(biāo)題:
51單片機計算器源碼
[打印本頁]
作者:
a'we'w'r
時間:
2016-11-19 19:39
標(biāo)題:
51單片機計算器源碼
完整代碼下載:
http://www.torrancerestoration.com/bbs/dpj-60002-1.html
#include "reg51.h"
#include "液晶.h"
#include "ds1302.h"
#include "math.h"
#include "timer.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#define pi 3.141592653
//特殊位定義
sbit func=P3^5;//因為是4行5列,需要9個數(shù)據(jù)口,這個地方單獨聲明3.5口作為調(diào)節(jié)時間使用
sbit fun_math=P3^6;
sbit beep=P2^4;
//全局變量定義,這個地方可以統(tǒng)一使用一個結(jié)構(gòu)體進行操作。
//計算器部分全局變量
uchar dis_time=0; //當(dāng)distime為1時,顯示一次時間,
uchar state=0; //定義系統(tǒng)所處的狀態(tài)0-1-2-3
uchar codes;//定義當(dāng)前輸入鍵值
uchar key_num[10]; //
uchar key_n=0;//記錄按下的次數(shù)
uchar arith=0;//定義運算符號
long data0; //第一個數(shù)據(jù) ,因為計算器是對兩個數(shù)據(jù)進行計算,這個第一個輸入的數(shù)據(jù)
long data1; //第二個數(shù)據(jù) 這是第二個數(shù)據(jù)的數(shù)據(jù),按下等號鍵后對這兩個數(shù)據(jù)進行相關(guān)運算
uchar point_en=0; //小數(shù)點使能,一個數(shù)據(jù)中只能有一個小數(shù)點,這個變量作為控制小數(shù)點輸入的開關(guān)
double result1=0; //最終的運算結(jié)果
uchar dis_num=0;//記錄結(jié)果中的個數(shù)
uchar fir_n=0; //
uchar unlock=0; //鍵盤不鎖住
uchar clear=0;//清除系統(tǒng)的全局性標(biāo)志變量
uchar neg_label=0; //輸入負(fù)號的標(biāo)志變量
uchar wrong=0; //計算超限標(biāo)志位
uchar TIM=0;//控制大約1S顯示一次時間
unsigned char get_fun=0;
uchar code dis[20]={
0XE7,0XEB,0XDB,0XBB,0XED,0XDD,0XBD,
0XEE,0XDE,0XBE,0XD7,0XB7,0X77,0X7B,0X7D,0X7E,
0X0E,0X0D,0X0B,0X07
};//矩陣鍵盤鍵值
uchar dat_out[12];
uchar code mathlabel[4]={43,45,42,47};//運算符
extern uchar time_en; //顯示時間使能
extern uchar en_alarm; // 鬧鐘使能
extern uchar cursor;
//萬年歷部分的標(biāo)志變量
//顯示星期字符
uchar point_x[4];//
////////////////////////////////////////////////////
/**********************************
* 開始界面計算器部分的程序
/////////
/*****************************
* 函數(shù)名稱:計算器變量初始化 init_var
* 函數(shù)功能:初始化計算器 所使用的變量
*
*
*
********************************************/
void init_var()
{
uchar i=0;
point_en=1;//允許輸入小數(shù)點
state=0;
unlock=0;
arith=0;
fir_n=0;
neg_label=1;
wrong=0;
for(i=0;i<10;i++)
{
key_num[i]=0;
}
}
/*****************************
* 函數(shù)名稱:鍵盤掃描函數(shù) keyscan
* 函數(shù)功能:對矩陣鍵盤進行掃描,獲取鍵值
7 8 9 +(光標(biāo)選擇) 復(fù)位/時鐘
4 5 6 - 改時間/設(shè)鬧鐘
1 2 3 * 增加
0 . = / 減小
*
*
*
********************************************/
void keyscan()
{
uchar mm;
uchar mm2=0;
uchar i=0;
mm=0;
P1=0XF0;
mm=P1;//讀數(shù)據(jù)
mm=mm&0XF0;
if(mm!=0xf0||func==0||fun_math==0)//需要對func 進行判斷
{
delay(20);
mm=P1;
mm=mm&0XF0; //消抖
if(mm!=0xF0||func==0||fun_math==0)
{
unlock=1;
if((func!=0))
{
if(fun_math!=0)
{
P1=0X0F;
for(i=0;i<20;i++);
mm2=P1;
mm2=mm2&0x0f;
mm=mm+mm2;
for(i=0;i<16;i++)//讀取0-15鍵值
{
if(mm==dis[i])
{
codes=i;
}
}
if(codes==15&&time_en==1)//這個地方考慮到使用復(fù)用功能----光標(biāo)顯示位置控制
{
if(en_alarm>0)
{
cursor++; // 是這個的原因
delay(300);//盡量簡單處理
}
}
}
else
{
P1=0XFF;
get_fun=0;
fun_math=0;
mm=P1&0X0F;
for(i=16;i<20;i++)
{
if(mm==dis[i])
{
codes=i+1; //分別對應(yīng)的是sin cos tan log這些函數(shù)
}
}
fun_math=1;
delay(30);
get_fun=1;
//這個地方應(yīng)該直接求函數(shù)了
}
}
else //16-19 萬年歷控制
{
P1=0XFF;
func=0;
mm=P1&0X0F;
for(i=16;i<20;i++)
{
if(mm==dis[i])
{
codes=i;
}
}
func=1;
delay(30);
}
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1