C8051F330 16*16點(diǎn)陣(SPI 、SMBus、I2C)PCF8563
void SPI_INT(void) //SPI初始化
{
SPI0CFG=0x40;
SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三線主方式
SPI0CKR=0x0f; //SPI 時(shí)鐘頻率設(shè)置為100kHz 0x63
IE &= 0xbf; //關(guān)閉SPI中斷
}
void SMB_INT(void) //SMB初始化
{
SMB0CF=0x5f; //使能SMB 允許時(shí)間擴(kuò)充 定時(shí)器2低字節(jié)溢出時(shí)鐘源
SMB0CF|=0x80;
}
void TIME01_INT(void) //定時(shí)器初始化
{
TCON=0x10; //定時(shí)器0允許
TMOD=0x01; //定時(shí)器0在16位工作方式
CKCON &= 0xf8;
CKCON |= 0x01; //定時(shí)器0使用系統(tǒng)4分頻
TL0=0x03;
TH0=0x03;
IE|=0x02;
}
void TIME2_INT(void) //定時(shí)器2用于配置SMB的時(shí)鐘頻率
{
TMR2CN=0x00;
CKCON |= 0x00;
TMR2RLL = 0xef;
TMR2RLH = 0xff;
TMR2L = 0xef;
TMR2H = 0xff;
TMR2CN |= 0x0c;
}
void TIME3_INT(void)//用于I2C的超時(shí)檢測(cè)
{
TMR3CN = 0x00; //定時(shí)器3為16位自動(dòng)重載
CKCON &= ~0x40;
TMR3RLL = 0xaf;
TMR3RLH = 0x57;
TMR3L = 0xaf;
TMR3H = 0x57;
EIE1|=0x00;
TMR3CN |= 0x04;
}
void pio_int(void) // 端口配置
{
XBR0=0x06;
XBR1=0x40;
P0MDIN=0xff; //禁止模擬輸入,0為模擬,1為數(shù)字
P0MDOUT=0x0d; //0為開(kāi)漏,1為推挽(ff)
P0SKIP=0x08;
P1MDIN=0xff;
P1MDOUT=0xff; //低四位用于138
P1SKIP=0x00;
P0=0xff;
P1=0xff;
}
/*************呈現(xiàn)各種顯示效果的函數(shù)集****************/
//void Jump_Word(uchar a) 立即跳顯示一個(gè)字或一張圖案
//void M_Word(uchar a)卷簾出顯示一個(gè)字或一張圖案
//void M_Words(number) 顯示幾個(gè)交換的字
//void UP_Run(number) 向上滾屏n個(gè)字
//void L_Removeout(number) 右入左出n個(gè)字
//void M_Black(void) 黑屏
//void R_Removeout(number) 左入右出n個(gè)字
/*****************************************************/
/****************立即跳顯示一個(gè)字或一張圖案***************/
void Jump_Word(uchar a)
{register uchar i,q;
for(i=0;i<32;i++)
{
for(q=0;q
//if(i%2)delay(SPEED);
}
}
/****************卷簾出顯示一個(gè)字或一張圖案***************/
void M_Word(uchar a)
{register uchar i,q;
for(i=0;i<32;i++)
{
for(q=0;q
if(i%2)delay(SPEED);
}
}
/****************卷簾出顯示number個(gè)字***************/
void M_Words(number)
{register uchar i,q,w;
for(w=0;w
for(i=0;i<32;i++)
{
for(q=0;q
}
delay(TIME);
}
}
/****************向上滾屏number個(gè)字***************/
void UP_Run(number)
{register uchar i,j,k,q;
for(i=0;i
for(j=0;j<16;j++)
{
for(k=0;k<15;k++)
{
for(q=0;q
dispram[k*2+q*32]=dispram[(k+1)*2+q*32];
dispram[k*2+1+q*32]=dispram[(k+1)*2+1+q*32];
}
}
for(q=0;q
dispram[30+q*32]=Bmp[q+i*BLKN/2][j*2];
dispram[31+q*32]=Bmp[q+i*BLKN/2][j*2+1];
}
delay(2*SPEED);
}
delay(2*TIME);
}
}
/****************左移出顯示number個(gè)字*******************/
void L_Removeout(number)
{register uchar i,j,k,l,q;
for(i=0;i
for(j=0;j<2;j++)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
for(q=0;q
dispram[l*2+q*32]=dispram[l*2+q*32]<<1|dispram[l*2+1+q*32]>>7;
if(q==BLKN/2-1)
dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|Bmp[i][l*2+j]>>(7-k);
else
dispram[l*2+1+q*32]=dispram[l*2+1+q*32]<<1|dispram[l*2+(q+1)*32]>>7;
}
}
delay(2*SPEED);
}
}
}
/****************卷簾出黑屏***************/
void M_Black(void)
{register uchar i,q;
for(i=0;i<32;i++)
{
for(q=0;q
if(i%2)delay(SPEED);
}
}
/****************右移出顯示number個(gè)字*******************/
void R_Removeout(number)
{register uchar i,j,k,l,q;
for(i=0;i
for(j=2;j>0;j--)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
for(q=0;q
dispram[l*2+1+q*32]=dispram[l*2+1+q*32]>>1|dispram[l*2+q*32]<<7;
if(q==0)
dispram[l*2+q*32]=dispram[l*2+q*32]>>1|Bmp[i][l*2+j-1]<<(7-k);
else
dispram[l*2+q*32]=dispram[l*2+q*32]>>1|dispram[l*2+1+(q-1)*32]<<7;
}
}
delay(2*SPEED);
}
}
}
/*************用于時(shí)鐘芯片操作的函數(shù)集****************/
//void write_pcf8563(void)寫(xiě)時(shí)鐘芯片
//void read_pcf8563(void)讀時(shí)鐘芯片
/*****************************************************/
void write_pcf8563(void)
{
SPI0CN &=~0x01; //暫時(shí)關(guān)掉SPI通訊
send =0xa2; //送子器件地址
while(BUSY);
BUSY=1;
SMB_RW=0;control=5;
STA=1; //開(kāi)始傳送
while(BUSY);
SPI0CN |=0x01; //重新開(kāi)啟SPI
}
void read_pcf8563(void) //讀當(dāng)時(shí)的時(shí),分,鈔
{
SPI0CN &=~0x01;
send =0xa2; //送子器件地址
while(BUSY);
BUSY=1;
SMB_RW=0;
STA=1;
send=0x02;
while(!SI);
BUSY=1;
send=0xa2;
while(BUSY);
BUSY=1;
SMB_RW=1;
STA=1;
while(BUSY);
BUSY=1;
sec=receive1[2]&0x7f;//讀秒
min=receive1[1]&0x7f;//讀分
hou=receive1[0]&0x3f;//讀時(shí)
SPI0CN |=0x01;
}
void spit_time(void)//分別計(jì)算時(shí)、分、秒的各位數(shù)字
{
sg=(int)hou/16;
sd=(int)hou%16;
fg=(int)min/16;
fd=(int)min%16;
mg=(int)sec/16;
md=(int)sec%16;
}
void dat_int(void) //數(shù)據(jù)初始化
{
scyx=1;
CLK=0;
}
void sysclk_int(void);
void delay(unsigned n);
void pio_int(void);
void SPI_INT(void);
void SMB_INT(void);
void dat_int(void);
void TIME01_INT(void);
void TIME2_INT(void);
void TIME3_INT(void);
void write_pcf8563(void);
void read_pcf8563(void);
void spit_time(void);
/**************主函數(shù)**************/
void main(void) //主程序
{
register uchar i;
PCA0MD &= ~0x40;// 關(guān)閉看門(mén)狗
sysclk_int();
OSCICN |= 0x02;
/****************初始化檢測(cè)pcf8563****************/
while(!pcf8563_sda)
{
XBR1 = 0x40;
pcf8563_scl = 0;
for(i = 0; i < 255; i++);
pcf8563_scl = 1;
while(!pcf8563_scl);
for(i = 0; i < 10; i++);
XBR1 = 0x00;
}
評(píng)論