|
1、時(shí)序圖
2、控制字
3、寄存器地址與RAM地址
4、代碼
時(shí)序圖

控制字

寄存器與RAM

代碼:
#include <reg52.h>
#include <intrins.h>
sbit dm = P2^2; //段碼
sbit wm = P2^3; //位碼
sbit st = P1^6; //使能(RST)
sbit cl = P1^4; //時(shí)鐘管腳(CLK)
sbit da = P1^5; //i/o管腳(數(shù)據(jù)管腳)(i/o)
/*這兩個(gè)函數(shù)就這時(shí)鐘芯片的精髓*/
void x_1302(unsigned char addr,unsigned char q,bit l); //寫入8個(gè)bit(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
unsigned char d_1302(unsigned char addr,bit l); //讀取8個(gè)bit(參數(shù)1:地址,參數(shù)2:啟用BCD處理)
/*上面的兩函數(shù)就是最低層的函數(shù)了*/
//下面的常量是一些寄存器的地址
#define addr_m 0x80 //秒
#define addr_f 0x82 //分
#define addr_x 0x84 //小時(shí)
#define addr_rq 0x86 //日期
#define addr_y 0x88 //月
#define addr_xq 0x8a //星期
#define addr_n 0x8c //年
#define addr_xbh 0x8e //寫保護(hù)
#define addr_ram 0xc0 //RAM 開始地址(這款芯片有31個(gè)8位的RAM起始地址是C0)
//下面的是一些用到的全局變量
unsigned char hc[8]; //數(shù)碼管緩存
unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
unsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼。顯示的位置
unsigned char sjhc[8]={20,13,12,12,14,30,10,4}; //空年月日時(shí)分秒周
unsigned char shijian[8]; //保存返回的數(shù)據(jù)
void DelayUs2x(unsigned char t) //延時(shí)
{
while(--t);
}
void x_1302(unsigned char addr,unsigned char q,bit l) //寫入8個(gè)bit(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
{
unsigned char i;
if(l) //BCD處理
{
i=q/10;
q=q%10;
q=q+i*16;
}
addr = addr & 0xFE; //最低位置零
cl = 0; //拉低時(shí)鐘
da = 0; //復(fù)位數(shù)據(jù)
st = 1; //使能芯片。寫入開始
for(i=0;i<8;i++) //寫入地址
{
addr >>= 1;
da = CY;
cl = 1;
cl = 0;
}
for(i=0;i<8;i++) //寫入數(shù)據(jù)
{
q >>= 1;
da = CY;
cl = 1;
cl = 0;
}
st = 0; //寫入結(jié)束
}
unsigned char d_1302(unsigned char addr,bit l) //讀取8個(gè)bit(參數(shù)1:地址,參數(shù)2:啟用BCD處理)
{
unsigned char i,dat;
addr = addr | 0x01;//最低位置高
cl = 0; //拉低時(shí)鐘
da = 0; //復(fù)位數(shù)據(jù)
st = 1; //使能芯片,讀取開始
for(i=0;i<8;i++) //寫入地址
{
addr >>= 1;
da = CY;
cl = 1;
cl = 0;
}
for(i=0;i<8;i++) //讀取數(shù)據(jù)
{
dat >>= 1;
if(da)
dat = dat | 0x80;
cl = 1;
cl = 0;
}
st = 0; //讀取結(jié)束
if(l) //BCD處理
{
i = dat / 16;
dat = dat % 16;
dat = dat +i*10;
}
return dat;
}
void d_sj() //讀出時(shí)間寫入數(shù)碼管緩存
{
shijian[0]= d_1302(addr_x,0); //讀出小時(shí)BCD數(shù)據(jù)
shijian[1]= d_1302(addr_f,0); //讀出分鐘BCD數(shù)據(jù)
shijian[2]= d_1302(addr_m,0); //讀出秒BCD數(shù)據(jù)
hc[0]=DM[shijian[0]/16];
hc[1]=DM[shijian[0]%16];
hc[2]=0x40;
hc[3]=DM[shijian[1]/16];
hc[4]=DM[shijian[1]%16];
hc[5]=0x40;
hc[6]=DM[shijian[2]/16];
hc[7]=DM[shijian[2]%16];
}
void sm() //數(shù)碼管掃描顯示
{
unsigned char i;
for(i=0;i<8;i++)
{
P0 = 0; //消影
dm = 1;
dm = 0;
P0 = WM[ i]; //寫入位碼
wm = 1;
wm = 0;
P0 = hc[ i]; //寫入段碼
dm = 1;
dm = 0;
DelayUs2x(10);
}
}
void x_sj() //寫入時(shí)間
{
x_1302(addr_xbh,0,0); //關(guān)閉寫保護(hù)
x_1302(addr_x,sjhc[4],1); //寫入小時(shí)(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
x_1302(addr_f,sjhc[5],1); //寫入分鐘(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
x_1302(addr_m,sjhc[6],1); //寫入秒 (參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
x_1302(addr_xbh,80,0); //打開寫保護(hù)
}
void main()
{
x_1302(addr_ram,7,0); //這里弄了我一個(gè)星期 !,F(xiàn)在什么情況還不明了。
//上面一條代碼是關(guān)鍵。如果沒有這條代碼我這里就寫不進(jìn)數(shù)據(jù)。起始這條
//代碼可以改成寫其他的比如寫RAM或在寫年等等。
//上面的一條代碼可以說(shuō)是初始化的 。。
x_sj();
while(1)
{
d_sj(); //讀出時(shí)間然后寫入數(shù)碼管顯示緩存
sm(); //掃描數(shù)碼管(也就是8位數(shù)碼管顯示)
}
}
|
|