?? wds12887lcd.c
字號:
//參考程序C :WDS12887LCD.c 此程序讀取時鐘值,并年,月,日,時,分,秒.
//分別顯示在LCD屏上。可實現時鐘初始化(授時)
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
#define CS12887 0x8300 /*DS12887時間寄存器首地址*/
#define CS12887A 0x830A /*DS12887內部寄存器A地址*/
#define CS12887B 0x830B /*DS12887內部寄存器B地址*/
#define CS12887C 0x830C /*DS12887內部寄存器C地址*/
unsigned long x;
unsigned char *lcdpoint; /*指向 lcddata數組的指針*/
unsigned char lcd_data_count; /*要顯示的數據個數 */
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=0x0; /*寫入當前分值:"58"分*/
Point1++;
*Point1=0xff; /*分不報警(不鬧分)*/
Point1++;
*Point1=0x21; /*寫入當前時值:"16" 時*/
Point1++;
*Point1=0xff; /*時不報警(不鬧時)*/
Point1++;
*Point1=0x05; /*寫入當前周日:"5"*/
Point1++;
*Point1=0x6; /*寫入當前日期:"05"日*/
Point1++;
*Point1=0x10; /*寫入當前月份:"08"月*/
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)
{
//XBR2 = 0x40; /*時能交叉開關,弱上拉*/
P74OUT = 0xff; /*推挽輸出*/
EMI0CF |= 0x2c; /*EMIF工作在地址/數據復用方式,只用外部存儲器,ALE高/低脈寬占1個SYSCLK周期*/
EMI0TC |= 0x6c; /*地址建立/保持時間占0個SYSCLK周期,/WR和/RD占12個SYSCLK周期*/
}
void LCD_Init(void)
{
P6 = 0x01;
for(x=0;x<50000;x++);
//P7 = 0x30; /*一行顯示*/
P7 = 0x38; /*兩行顯示*/
P6 = 0x0;
P6 = 0x1;
for(x=0;x<1000;x++);
P7 = 0x0e; /*顯示開,光標顯示,光標不閃爍*/
P6 = 0x0;
P6 = 0x1;
for(x=0;x<1000;x++);
P7= 0x06; /*顯示增加,不平移*/
P6 = 0x0;
P6 = 0x1;
for(x=0;x<5000;x++);
P7 = 0x01; /*清屏*/
P6 = 0x0;
P6 = 0x1;
for(x=0;x<5000;x++);
}
void main (void) {
unsigned char temp,data1;
unsigned char TimeVal[10];
unsigned char xdata *idata Pointm;
unsigned char HMS[10]={0x70,0x70},YMD[10]={0x02,0x00};
WDTCN = 0xde; /*無效看門狗*/
WDTCN = 0xad;
SYSCLK_Init (); /*初始化系統時鐘*/
PORT_Init (); /*初始化端口*/
//DS12887INIT(); /*時鐘芯片授時*/
LCD_Init(); /*LCD初始化*/
//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)
{
P7 = 0x02; /*回到起始位置*/
P6 = 0x0;
P6 = 0x01;
Pointm=CS12887;
for(temp=0;temp<10;temp++) /*讀時間寄存器*/
{
TimeVal[temp]=*Pointm;
Pointm++;
switch(temp){ /*準備待顯示的時間數據*/
case 0x00:
HMS[7]=0x0a;
HMS[8]=(TimeVal[temp]>>4);
HMS[9]=TimeVal[temp]&0x0f;
break;
case 0x02:
HMS[4]=0x0a;
HMS[5]=(TimeVal[temp]>>4);
HMS[6]=TimeVal[temp]&0x0f;
break;
case 0x04:
HMS[2]=(TimeVal[temp]>>4);
HMS[3]=TimeVal[temp]&0x0f;
break;
case 0x07:
YMD[7]=0x0a;
YMD[8]=(TimeVal[temp]>>4);
YMD[9]=TimeVal[temp]&0x0f;
break;
case 0x08:
YMD[4]=0x0a;
YMD[5]=(TimeVal[temp]>>4);
YMD[6]=TimeVal[temp]&0x0f;
break;
case 0x09:
YMD[2]=(TimeVal[temp]>>4);
YMD[3]=TimeVal[temp]&0x0f;
break;
default:
_nop_();
}
}
Pointm=CS12887C;
temp=*Pointm; /*CLEAR C*/
Pointm++;
temp=*Pointm; /*CLEAR D*/
Pointm=CS12887B; /*更新周期正常運行,禁止中斷,采用BCD碼格式,24[小]時制*/
*Pointm=0x02; /*不用復時制*/
_nop_();
P6 = 0x05; //準備送數據
for(x=0;x<5000;x++);
lcdpoint=&YMD;
for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--) //顯示第一行字符
{
data1=*lcdpoint;
data1 += 0x30; /*轉化成字符碼*/
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<100;x++);
}
P6 = 0x01;
P7 = 0xc0; /*切換到第二行*/
P6 = 0x00;
P6 = 0x01;
for(x=0;x<1000;x++);
lcdpoint=&HMS;
for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--) //顯示第二行字符
{
data1=*lcdpoint;
data1 += 0x30; /*轉化成字符碼*/
P7 = data1; /*送字符數據*/
P6 = 0x04;
P6 = 0x05;
lcdpoint++;
for(x=0;x<100;x++);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -