|
|
#include<reg52.h>
#include <intrins.h>
/***********************************************************************************************/
unsigned char segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列掃描代碼,高電平有效
unsigned char code tab[]={0xff,0xcf,0xb7,0xbb,0xdd,0xbb,0xb7,0xcf}; //數(shù)據(jù)代碼,低電平有效
sbit LATCH = P1^0; //點(diǎn)屏數(shù)的數(shù)據(jù)端口定義
sbit SRCLK = P1^1;
sbit SER = P1^2;
sbit LATCH_B = P2^0; //點(diǎn)陣屏的公共端口定義
sbit SRCLK_B = P2^1;
sbit SER_B = P2^2;
/************************************************************************************************
**函數(shù)名:delay(unsigned char i)
**功 能:延時(shí)程序
************************************************************************************************/
void delay(unsigned char i)
{ unsigned char j,k;
for(k=0;k<i;k++)
{ for(j=0;j<255;j++);
}
}
/************************************************************************************************
**函數(shù)名:sendbyte(unsigned char dat)
**功 能:發(fā)送字節(jié)程序
************************************************************************************************/
void sendbyte(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++) //發(fā)送1個(gè)字節(jié)數(shù)據(jù)
{ SRCLK=0; //為數(shù)據(jù)移位準(zhǔn)備
if(dat&0x80) //發(fā)送1位數(shù)據(jù)
SER = 1; //發(fā)送1
else
SER = 0; //發(fā)送0
dat<<=1; //左移數(shù)據(jù),為下次發(fā)送數(shù)據(jù)準(zhǔn)備
SRCLK=1; //數(shù)據(jù)寄存器中的數(shù)據(jù)移位,不影響輸出
}
}
/************************************************************************************************
**函數(shù)名:sendbyte2(unsigned char dat1,unsigned char dat2)
**功 能:發(fā)送2個(gè)字節(jié)程序,595級(jí)聯(lián),n個(gè)595,就需要發(fā)送n字節(jié)后鎖存
************************************************************************************************/
void sendbyte2(unsigned char dat1,unsigned char dat2)
{ sendbyte(dat1);
sendbyte(dat2);
}
/************************************************************************************************
**函數(shù)名:out595(void)
**功 能:595級(jí)聯(lián)發(fā)送數(shù)據(jù)后,鎖存有效
************************************************************************************************/
void out595(void)
{ LATCH=0; //鎖存輸出
_nop_();
LATCH=1;
}
/************************************************************************************************
**函數(shù)名:send_com(unsigned char dat)
**功 能:發(fā)送點(diǎn)陣屏公共端控制碼
************************************************************************************************/
void send_com(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++) //發(fā)送1個(gè)字節(jié)
{ SRCLK_B=0; //為數(shù)據(jù)移位準(zhǔn)備
if(dat&0x80) //發(fā)送1位數(shù)據(jù)
SER_B = 1; //發(fā)送1
else
SER_B = 0; //發(fā)送0
dat<<=1;
SRCLK_B=1; //數(shù)據(jù)寄存器中的數(shù)據(jù)移位,不影響輸出
}
LATCH_B=0; //輸出鎖存
_nop_();
LATCH_B=1;
}
/************************************************************************************************
mian()
************************************************************************************************/
void main()
{ unsigned char i;
while(1)
{ for(i=0;i<8;i++) //8列數(shù)據(jù)顯示
{ send_com(segout[i]); //送公共端數(shù)據(jù),即列掃描代碼
sendbyte2(tab[i],0xff); //送列數(shù)據(jù),第1參數(shù)是綠色數(shù)據(jù),第2參數(shù)是紅色數(shù)據(jù)
out595(); //595鎖存輸出
delay(2);
sendbyte2(0xff,0xff); //防止重影
out595(); //595鎖存輸出
}
}
}
|
|