?? wds12887led8.c
字號:
//參考程序B. WDS12887LED8.c程序功能:讀取時鐘值,并將時,分,秒顯示在數碼管上. 可以實現時鐘初始化(授時)
// Includes
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
// Global CONSTANTS
#define CS12887 0x8300 /*DS12887時間寄存器首地址*/
#define CS12887A 0x830A /*DS12887內部寄存器A地址*/
#define CS12887B 0x830B /*DS12887內部寄存器B地址*/
#define CS12887C 0x830C /*DS12887內部寄存器C地址*/
#define PORTA 0x8000 /*8255的A口*/
#define PORTB 0x8001
#define PORTC 0x8002
#define PORTCON 0x8003
unsigned long x;
unsigned char *lcdpoint; //指向 lcddata數組的指針
unsigned char lcd_data_count; //要顯示的數據個數
// Function PROTOTYPES
void PORT_Init (void);
void sleep_ms(unsigned int count)// 延時
{
unsigned int ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
void SYSCLK_Init (void) //函數功能: 系統時鐘初始化
{
OSCICN = 0x05; // 系統時鐘初始化為片內的4MHz
}
void DS12887INIT(void)// 初始化時鐘芯片并寫入時間初值
{
unsigned char i;
unsigned char xdata *idata Point1;
Point1=CS12887B;
*Point1=0x80; /*設置SET=1,禁止時間更新*/
Point1=CS12887;
*Point1=0x00; /*寫入當前秒值:"30"秒*/
Point1++;
*Point1=0xff; /*秒不報警(不鬧秒)*/
Point1++;
*Point1=0x00; /*寫入當前分值:"58"分*/
Point1++;
*Point1=0xff; /*分不報警(不鬧分)*/
Point1++;
*Point1=0x12; /*寫入當前時值:"23" 時*/
Point1++;
*Point1=0xff; /*時不報警(不鬧時)*/
Point1++;
*Point1=0x04; /*寫入當前周日:"5"*/
Point1++;
*Point1=0x04; /*寫入當前日期:"01"日*/
Point1++;
*Point1=0x08; /*寫入當前月份:"07"月*/
Point1++;
*Point1=0x05; /*寫入當前年份:"05"年*/
Point1=CS12887C;
i=*Point1; /*CLEAR C*/
Point1++;
i=*Point1; /*CLEAR D*/
Point1=CS12887B;/*更新周期正常運行,禁止中斷,采用BCD碼格式,24[小]時制*/
*Point1=0x02; /*不用復時制*/
}
void PORT_Init (void)// 初始化I/O
{
XBR2 = 0x40; /*時能交叉開關,弱上拉*/
P74OUT = 0xc0; /*P7為推拉方式,P4,P5,P6漏極開路*/
EMI0CF |= 0x2c; /*EMIF工作在地址/數據復用方式,只用外部存儲器,ALE高/低脈寬占1個SYSCLK周期*/
EMI0TC |= 0x6d; /*地址建立/保持時間占1個SYSCLK周期,/WR和/RD占12個SYSCLK周期*/
}
// MAIN Routine
void main (void) {
unsigned char j,k,temp;
unsigned int i;
unsigned char TimeVal[10];
unsigned char xdata *idata Pointm;
unsigned char HMS[6],YMD[6];
/*無效看門狗*/
WDTCN = 0xde;
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
//DS12887INIT();
Pointm=PORTCON;
*Pointm=0x80; //B口輸出,A口輸出
// sleep_ms(4000);
do{
temp=temp&0x7f; /*UIP=0*/
Pointm=CS12887A; /*判斷更新周期結束否?查詢UIP位*/
temp=*Pointm;
temp=temp&0x80; /*UIP=0,時鐘更新已經完成,可以讀取時鐘值*/
}while(temp==0x80); /*UIP=1,時鐘更新周期正在進行,需繼續等待*/
while(1)
{
Pointm=CS12887;
for(temp=0;temp<10;temp++) /*讀時間寄存器*/
{
TimeVal[temp]=*Pointm;
Pointm++;
switch(temp){ /*準備待顯示數據*/
case 0x00: /*秒*/
HMS[4]=(TimeVal[temp]>>4);
HMS[5]=TimeVal[temp]&0x0f;
break;
case 0x02: /*分*/
HMS[2]=(TimeVal[temp]>>4);
HMS[3]=TimeVal[temp]&0x0f;
break;
case 0x04: /*時*/
HMS[0]=(TimeVal[temp]>>4);
HMS[1]=TimeVal[temp]&0x0f;
break;
case 0x07: /*日*/
YMD[4]=(TimeVal[temp]>>4);
YMD[5]=TimeVal[temp]&0x0f;
break;
case 0x08: /*月*/
YMD[2]=(TimeVal[temp]>>4);
YMD[3]=TimeVal[temp]&0x0f;
break;
case 0x09: /*年*/
YMD[0]=(TimeVal[temp]>>4);
YMD[1]=TimeVal[temp]&0x0f;
break;
default:
_nop_();
}
}
for(j=0;j<6;j++)
{
switch(HMS[j]){ /*轉化成數碼管數字顯示碼*/
case 0x01:
k=0x06; // '1'
break;
case 0x02:
k=0x5b; // '2'
break;
case 0x03:
k=0x4f; // '3'
break;
case 0x04:
k=0x66; // '4'
break;
case 0x05:
k=0x6d; // '5'
break;
case 0x06:
k=0x7d; // '6'
break;
case 0x07:
k=0x07; // '7'
break;
case 0x08:
k=0x7f; // '8'
break;
case 0x09:
k=0x6f; // '9'
break;
case 0x00:
k=0x3f; // '0'
break;
default:
k=0x80; // 'dot'
}
switch(j) //動態驅動6數碼管
{
case 0x00:
Pointm=PORTB;
*Pointm=0x01;
break;
case 0x01:
Pointm=PORTB;
*Pointm=0x02;
break;
case 0x02:
Pointm=PORTB;
*Pointm=0x04;
break;
case 0x03:
Pointm=PORTB;
*Pointm=0x08;
break;
case 0x04:
Pointm=PORTB;
*Pointm=0x10;
break;
case 0x05:
Pointm=PORTB;
*Pointm=0x20;
break;
default:
_nop_();
}
Pointm=PORTC;
*Pointm=k; /*送顯示碼*/
for(i=0;i<=600;i++);
_nop_();
}
_nop_();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -