完整代碼下載:http://www.zg4o1577.cn/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個數據口,這個地方單獨聲明3.5口作為調節時間使用
- sbit fun_math=P3^6;
- sbit beep=P2^4;
- //全局變量定義,這個地方可以統一使用一個結構體進行操作。
- //計算器部分全局變量
- uchar dis_time=0; //當distime為1時,顯示一次時間,
- uchar state=0; //定義系統所處的狀態0-1-2-3
- uchar codes;//定義當前輸入鍵值
- uchar key_num[10]; //
- uchar key_n=0;//記錄按下的次數
- uchar arith=0;//定義運算符號
- long data0; //第一個數據 ,因為計算器是對兩個數據進行計算,這個第一個輸入的數據
- long data1; //第二個數據 這是第二個數據的數據,按下等號鍵后對這兩個數據進行相關運算
- uchar point_en=0; //小數點使能,一個數據中只能有一個小數點,這個變量作為控制小數點輸入的開關
- double result1=0; //最終的運算結果
- uchar dis_num=0;//記錄結果中的個數
- uchar fir_n=0; //
- uchar unlock=0; //鍵盤不鎖住
- uchar clear=0;//清除系統的全局性標志變量
- uchar neg_label=0; //輸入負號的標志變量
- uchar wrong=0; //計算超限標志位
- 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;
- //萬年歷部分的標志變量
- //顯示星期字符
- uchar point_x[4];//
- ////////////////////////////////////////////////////
- /**********************************
- * 開始界面計算器部分的程序
- /////////
- /*****************************
- * 函數名稱:計算器變量初始化 init_var
- * 函數功能:初始化計算器 所使用的變量
- *
- *
- *
- ********************************************/
- void init_var()
- {
- uchar i=0;
- point_en=1;//允許輸入小數點
- state=0;
- unlock=0;
- arith=0;
- fir_n=0;
- neg_label=1;
- wrong=0;
- for(i=0;i<10;i++)
- {
- key_num[i]=0;
- }
- }
- /*****************************
- * 函數名稱:鍵盤掃描函數 keyscan
- * 函數功能:對矩陣鍵盤進行掃描,獲取鍵值
- 7 8 9 +(光標選擇) 復位/時鐘
- 4 5 6 - 改時間/設鬧鐘
- 1 2 3 * 增加
- 0 . = / 減小
- *
- *
- *
- ********************************************/
- void keyscan()
- {
- uchar mm;
- uchar mm2=0;
- uchar i=0;
- mm=0;
- P1=0XF0;
- mm=P1;//讀數據
- 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)//這個地方考慮到使用復用功能----光標顯示位置控制
- {
- 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; //分別對應的是sin cos tan log這些函數
- }
- }
- fun_math=1;
- delay(30);
- get_fun=1;
- //這個地方應該直接求函數了
-
- }
- }
- 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);
- }
-
- }
- }
- }
復制代碼 |