?? main.c
字號(hào):
//-----------------------------------------------------------------
// 名稱(chēng): 用DS1302及DS18B20+MAX6951設(shè)計(jì)的多功能電子日歷牌
//-----------------------------------------------------------------
// 說(shuō)明: 本例所有分立式數(shù)碼管全部用MAX6951驅(qū)動(dòng),電路中使用了時(shí)鐘芯片
// DS1302與溫度傳感器DS18B20,實(shí)現(xiàn)了含溫度顯示的多功能電子日歷
// 牌設(shè)計(jì).日歷與時(shí)鐘的調(diào)節(jié)功能由讀者自行完成.
//
//-----------------------------------------------------------------
#include <pic.h>
#include <stdio.h>
#include "DS1302.h"
#include "DS18B20.h"
#define INT8 signed char
#define INT8U unsigned char
#define INT16U unsigned int
//MAX695X引腳定義
#define DIN RC0 //數(shù)據(jù)線
#define CLK RC1 //時(shí)鐘線
#define CS0 2 //YYYY-MM-DD驅(qū)動(dòng)器片選線
#define CS1 3 //HH-MM-SS W驅(qū)動(dòng)器片選線
#define CS2 4 //溫度數(shù)碼管驅(qū)動(dòng)器片選線
//秒閃爍LED控制
#define LED_BLINK RC7
//MAX6951片選控制端口
#define CS_PORT PORTC
//日期顯示緩沖,格式:YYYY-MM-DD(全解碼,直接發(fā)送)
INT8U Date_Buff[] = {2,0,0,0,0,0,0,0};
//時(shí)間及星期顯示緩沖,格式:HH-MM-SS W(全解碼,直接發(fā)送)
INT8U Time_w_Buff[] = {0,0,0,0,0,0,0};
//溫度顯示緩沖:XXX.X℃ ~ -XX.X℃,(范圍:125℃~-55℃),(全部不解碼,發(fā)送段碼)
//緩沖最后兩位固定為"℃"中的度及C的段碼
INT8U Temp_Buff[] = {0x00,0x00,0x00,0x00,0x63,0x4E};
//在非解碼模式下MAX6950/1對(duì)應(yīng)的段碼表,此表不同于直接驅(qū)動(dòng)時(shí)所使用的段碼表
//原來(lái)的各段順序是: DP,G,F,E,D,C,B,A
//MAX6950/1的驅(qū)動(dòng)順序是:DP,A,B,C,D,E,F,G
//除小數(shù)點(diǎn)位未改變外,其他位是逆向排列的.
const INT8U SEGCODE_695X[] =
{ 0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70, //0~7
0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47, //8~F
};
#define NEG_SEGCODE 0x01 //負(fù)數(shù)符號(hào)段碼"-"
#define BLK_SEGCODE 0x00 //黑屏段碼
extern volatile INT8U DateTime[];
//-----------------------------------------------------------------
// 延時(shí)函數(shù)
//-----------------------------------------------------------------
void delay(INT8U n)
{
for (INT8U i = 0 ; i < n; i++) __delay_ms(100);
}
//-----------------------------------------------------------------
// 向MAX695X寫(xiě)數(shù)據(jù)
//-----------------------------------------------------------------
void Write(INT8U Addr,INT8U Dat,INT8U CS_NO)
{
INT8U i;
CS_PORT &= ~(1<<CS_NO);
for(i = 0; i < 8; i++) //串行寫(xiě)入8位地址Addr
{
}
for(i = 0; i < 8; i++) //串行寫(xiě)入8位數(shù)據(jù)Dat
{
}
CS_PORT |= (1<<CS_NO);
}
//-----------------------------------------------------------------
// MAX695X初始化
//-----------------------------------------------------------------
void Init_MAX695X()
{
//設(shè)置亮度:中等亮度/掃描所有的0~7只數(shù)碼管/非關(guān)斷0x01;關(guān)斷:0x00
}
//-----------------------------------------------------------------
// 將兩位整數(shù)分解為兩個(gè)數(shù)位
//-----------------------------------------------------------------
void DEC_TO_2DIGIT(INT8U d, INT8U *a1, INT8U *b1)
{
}
//-----------------------------------------------------------------
// 讀取并顯示溫度
//-----------------------------------------------------------------
void Read_and_Show_Temperature()
{
}
//-----------------------------------------------------------------
// 讀取并顯示當(dāng)前日期時(shí)間
//-----------------------------------------------------------------
void Read_and_Show_DateTime()
{
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
T0CS = 0; //TMR0時(shí)鐘選擇:內(nèi)部時(shí)鐘
PSA = 0; //前分頻器分配給TMR0
PS2 = 1; PS1 = 0; PS0 = 0; //32分頻(OPTION低3位為100)
TMR0 = (INT8U)(256 - _XTAL_FREQ/4/32*0.005); //5ms定時(shí)初值
T0IF = 0; //清TMR0中斷標(biāo)志
GIE = 1; //開(kāi)全局中斷
T0IE = 1; //使能TMR0溢出中斷
TRISC = 0x00; PORTC = 0xFF; //MAX6951控制端口
TRISD2 = TRISD3 = 0; //DS1302 SCLK,RST輸出
Init_MAX695X(); //初始化三片695X
Read_Temperature(); //預(yù)讀溫度
//初始化DS1302,并配置使能DS1302的點(diǎn)滴式充電器
init_DS1302(); delay(10); //等待1秒(10*100ms)
while (1)
{
}
}
//-----------------------------------------------------------------
// TMR0溢出中斷控制秒閃爍功能
//-----------------------------------------------------------------
void interrupt TMR0_OVR_Interrupt()
{
static INT8U pre_second = 0;
static INT8U T_Count = 0; //用于延時(shí)累加的變量
if (T0IF)
{
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -