一年前弄的小玩意了,硬件丟失了,翻出來,重新分割了下,加了詳細注釋,注釋很重要啊,以前沒加詳細,我自己理解起來也要半天,分享下,希望對他人有所幫助吧。其實我目前發的三個東西,現在想來,對單片機資源方面的知識涉及的不多,主要還是單片機C語言方面。在沒硬件的情況下,我想分享的是我的思維,我是如何構思的,是如何運用運算符變量語句的。
帶時鐘計算器2.png (290.89 KB, 下載次數: 37)
下載附件
2020-1-29 13:43 上傳
帶時鐘計算器.png (147.61 KB, 下載次數: 38)
下載附件
2020-1-29 13:43 上傳
單片機源程序如下:
- //=================================================================================================================================================================================================================
- //軟件功能:帶時鐘計算器
- //硬件描述:最小系統(stc15)+ 1x(LCD1602 + PCF8574T) + 1x(5x4矩陣按鍵 + 74ls08)+ 1x(PCF8563)
- //程序描述:IIC.c中有PCF8574T和PCF8563的通信協議
- // anjian.c中有按鍵函數
- // shizhong.c中有時鐘相關函數
- // jisuan.c中有計算器相關函數
- //功能概括描述:LCD1602用于顯示、可以切換計算器模式和時鐘模式(時間模式和鬧鐘模式)
- // (用x和y表示兩個數的長度(小數點不算長度),則,x+y<16的條件下)可以進行四則運算
- // 時間和鬧鐘可以設置
- //=================================================================================================================================================================================================================
- #include "reg15.h" //STC15Wxx/STC15Fxx系列頭文件
- #include "IIC.h" //I2C通信協議
- #include "anjian.h"
- #include "shizhong.h"
- #include "jisuan.h"
- #define FOSC 11059200L
- #define T50MS (65536-FOSC/12/20) //12T,11.0592MHz(50ms=20MHz)
- #define ANJ P1
- sbit INT0=P3^2;
- //=================================================================================================================================================================================================================
- uchar b=0,ajbh=21,hang,tsgn=0; //LCD列變量,按鍵編號變量,LCD行變量,特殊模式切換變量
- uchar HUANCUN[16],SUM[17],a=0,j=0,K=0,L=0,q=1,p=0; //算式緩存數組,計算結果緩存數組,算式緩存數組對應位變量,運算符標識變量,第一位數小數點變量,第二位數小數點變量,運算符限制變量,小數點限制變量
- uchar SZXSHC[8],sjsz=0,naoz=0,shuzi=10; //時間緩存變量,時鐘模式切換變量,鬧鐘模式切換變量,特殊模式下的數字鍵變量
- //=================================================================================================================================================================================================================
- //中斷和P口初始化程序
- //=========================================================================================
- void Init()
- {
- AUXR&=0x7f; //定時器0為12T模式
- INT0=1; //外部中斷P口置高電平
- ANJ=0xf0; //矩陣輸入輸出對應P口初始化
- a4=0;
- TMOD=0x00; //定時器為方式0(STC15F2K60S2方式0是16位自動重裝模式)
- TL0=T50MS; //初始化定時值
- TH0=T50MS>>8;
- ET0=1; //定時器T0中斷開啟
- IT0=1; //設置INT0的中斷類型為下降沿觸發
- EX0=1; //INT0中斷開啟
- PT0=1; //優先級T0優先
- PX0=0; //外部中斷優先級低
- EA=1; //總中斷開啟
- TR0=0; //定時器0
- }
- //=========================================================================================
- void main() //主函數
- {
- Init();
- LCDInit(); //1602初始化
- CleanAlarm(); //鬧鐘初始化
- TR0=1;
- while(1);
- }
- //=========================================================================================
- //功能說明:按鍵所用中斷
- // 矩陣按鍵的四個置位口連接74LS08的輸入端,用了3個與門,2個與門的輸出端接1個與門的輸入端,
- // 最后引出來接INT0口,采用外部中斷方式
- //=========================================================================================
- void EX_T() interrupt 0
- {
- EX0=0; //INT0中斷關閉
- IICdelay1(20); //去抖動
- if(INT0==0) //如果仍有鍵按下
- {
- An_j();
- Cu_l();
- SZ_bd();
- }
- while(!INT0); //判斷按鍵是否松開
- IICdelay1(20); //去抖動
- EX0=1; //INT0中斷開啟
- }
- //==================================================================================
- //功能說明:時鐘所用中斷
- // 給定變量tu用于計時,200ms讀取一次鬧鐘響鈴位GetPCF8563(0x01,SZXSHC+7)
- // 判斷該位,如果告警了,LCD右下角顯示字符'n'
- // 持續12.5s后字符'n'消失
- // 按任意鍵關閉鬧鐘在按鍵部分程序
- //==================================================================================
- void timer0() interrupt 1 //定時器中斷
- {
- static uchar cb=0,tu=0;
- tu++;
- if(tu==4){ //加計數變量tu,不然讀取速度過于頻繁
- GetPCF8563(0x01,SZXSHC+7); //讀取溢出標志位到SZXSHC[7]
- tu=0;
- }
- if(SZXSHC[7]&0x08){ //判斷鬧鐘溢出標志位是否為1(第4位)
- if(cb==0){
- tu=4;
- cb=1;
- LCD_writezl(0x01); //LCD清除顯示
- GotoXY(15,1); //右下角顯示字符n
- yige('n');
- }else{
- if(tu==254){ //顯示10多秒n后,鬧鐘自動關閉
- SetPCF8563(0x01,0x02); //清除告警中斷位
- LCD_writezl(0x01); //LCD清除顯示
- tu=3;
- cb=0;
- }
- }
- }else{
- Sh_z(sjsz);
- Sh_z(naoz);
- if(tu>4){ //如果是按任意鍵后關閉鬧鐘
- tu=3;
- cb=0;
- }
- }
- }
- //==================================================================================
復制代碼
原理圖: 無
仿真: 無
代碼:
帶時鐘1602計算器終極程序.rar
(540.32 KB, 下載次數: 68)
2020-1-29 13:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|