#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}; //数据代码,低电平有效
sbit LATCH = P1^0; //点屏数的数据端口定义
sbit SRCLK = P1^1;
sbit SER = P1^2;
sbit LATCH_B = P2^0; //点阵屏的公共端口定义
sbit SRCLK_B = P2^1;
sbit SER_B = P2^2;
/************************************************************************************************
**函数名:delay(unsigned char i)
**功 能:延时程序
************************************************************************************************/
void delay(unsigned char i)
{ unsigned char j,k;
for(k=0;k<i;k++)
{ for(j=0;j<255;j++);
}
}
/************************************************************************************************
**函数名:sendbyte(unsigned char dat)
**功 能:发送字节程序
************************************************************************************************/
void sendbyte(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++) //发送1个字节数据
{ SRCLK=0; //为数据移位准备
if(dat&0x80) //发送1位数据
SER = 1; //发送1
else
SER = 0; //发送0
dat<<=1; //左移数据,为下次发送数据准备
SRCLK=1; //数据寄存器中的数据移位,不影响输出
}
}
/************************************************************************************************
**函数名:sendbyte2(unsigned char dat1,unsigned char dat2)
**功 能:发送2个字节程序,595级联,n个595,就需要发送n字节后锁存
************************************************************************************************/
void sendbyte2(unsigned char dat1,unsigned char dat2)
{ sendbyte(dat1);
sendbyte(dat2);
}
/************************************************************************************************
**函数名:out595(void)
**功 能:595级联发送数据后,锁存有效
************************************************************************************************/
void out595(void)
{ LATCH=0; //锁存输出
_nop_();
LATCH=1;
}
/************************************************************************************************
**函数名:send_com(unsigned char dat)
**功 能:发送点阵屏公共端控制码
************************************************************************************************/
void send_com(unsigned char dat)
{ unsigned char i;
for(i=0;i<8;i++) //发送1个字节
{ SRCLK_B=0; //为数据移位准备
if(dat&0x80) //发送1位数据
SER_B = 1; //发送1
else
SER_B = 0; //发送0
dat<<=1;
SRCLK_B=1; //数据寄存器中的数据移位,不影响输出
}
LATCH_B=0; //输出锁存
_nop_();
LATCH_B=1;
}
/************************************************************************************************
mian()
************************************************************************************************/
void main()
{ unsigned char i;
while(1)
{ for(i=0;i<8;i++) //8列数据显示
{ send_com(segout[i]); //送公共端数据,即列扫描代码
sendbyte2(tab[i],0xff); //送列数据,第1参数是绿色数据,第2参数是红色数据
out595(); //595锁存输出
delay(2);
sendbyte2(0xff,0xff); //防止重影
out595(); //595锁存输出
}
}
}
|