|
完整代碼下載: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;//因?yàn)槭?行5列,需要9個(gè)數(shù)據(jù)口,這個(gè)地方單獨(dú)聲明3.5口作為調(diào)節(jié)時(shí)間使用
- sbit fun_math=P3^6;
- sbit beep=P2^4;
- //全局變量定義,這個(gè)地方可以統(tǒng)一使用一個(gè)結(jié)構(gòu)體進(jìn)行操作。
- //計(jì)算器部分全局變量
- uchar dis_time=0; //當(dāng)distime為1時(shí),顯示一次時(shí)間,
- 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;//定義運(yùn)算符號(hào)
- long data0; //第一個(gè)數(shù)據(jù) ,因?yàn)橛?jì)算器是對(duì)兩個(gè)數(shù)據(jù)進(jìn)行計(jì)算,這個(gè)第一個(gè)輸入的數(shù)據(jù)
- long data1; //第二個(gè)數(shù)據(jù) 這是第二個(gè)數(shù)據(jù)的數(shù)據(jù),按下等號(hào)鍵后對(duì)這兩個(gè)數(shù)據(jù)進(jìn)行相關(guān)運(yùn)算
- uchar point_en=0; //小數(shù)點(diǎn)使能,一個(gè)數(shù)據(jù)中只能有一個(gè)小數(shù)點(diǎn),這個(gè)變量作為控制小數(shù)點(diǎn)輸入的開關(guān)
- double result1=0; //最終的運(yùn)算結(jié)果
- uchar dis_num=0;//記錄結(jié)果中的個(gè)數(shù)
- uchar fir_n=0; //
- uchar unlock=0; //鍵盤不鎖住
- uchar clear=0;//清除系統(tǒng)的全局性標(biāo)志變量
- uchar neg_label=0; //輸入負(fù)號(hào)的標(biāo)志變量
- uchar wrong=0; //計(jì)算超限標(biāo)志位
- uchar TIM=0;//控制大約1S顯示一次時(shí)間
- 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};//運(yùn)算符
- extern uchar time_en; //顯示時(shí)間使能
- extern uchar en_alarm; // 鬧鐘使能
- extern uchar cursor;
- //萬(wàn)年歷部分的標(biāo)志變量
- //顯示星期字符
- uchar point_x[4];//
- ////////////////////////////////////////////////////
- /**********************************
- * 開始界面計(jì)算器部分的程序
- /////////
- /*****************************
- * 函數(shù)名稱:計(jì)算器變量初始化 init_var
- * 函數(shù)功能:初始化計(jì)算器 所使用的變量
- *
- *
- *
- ********************************************/
- void init_var()
- {
- uchar i=0;
- point_en=1;//允許輸入小數(shù)點(diǎn)
- 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ù)功能:對(duì)矩陣鍵盤進(jìn)行掃描,獲取鍵值
- 7 8 9 +(光標(biāo)選擇) 復(fù)位/時(shí)鐘
- 4 5 6 - 改時(shí)間/設(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)//需要對(duì)func 進(jìn)行判斷
- {
- 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)//這個(gè)地方考慮到使用復(fù)用功能----光標(biāo)顯示位置控制
- {
- if(en_alarm>0)
- {
- cursor++; // 是這個(gè)的原因
- delay(300);//盡量簡(jiǎn)單處理
- }
- }
-
- }
- 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; //分別對(duì)應(yīng)的是sin cos tan log這些函數(shù)
- }
- }
- fun_math=1;
- delay(30);
- get_fun=1;
- //這個(gè)地方應(yīng)該直接求函數(shù)了
-
- }
- }
- else //16-19 萬(wàn)年歷控制
- {
- P1=0XFF;
- func=0;
- mm=P1&0X0F;
- for(i=16;i<20;i++)
- {
- if(mm==dis[i])
- {
- codes=i;
- }
- }
- func=1;
- delay(30);
- }
-
- }
- }
- }
復(fù)制代碼 |
|