高级会员
主题
帖子
积分330
阅读权限30
注册时间2013-9-11
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2013-9-15 19:50
|
显示全部楼层
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//HEF4094BT 位定义
sbit Data4094 = P1^0; //4094数据
sbit Clk4094 = P1^1; //4094时钟
sbit EN4094 = P1^2; //4094使能,前面有一个7404反相器,低电平有效
//74HC595位定义
sbit SH_CP = P2^5; //595的移位时钟
sbit ST_CP = P2^7; //595的锁存时钟
sbit DR1 = P2^6; //上半屏红色,595的data输入
sbit DR2 = P2^4;
sbit DG1 = P2^3;
sbit DG2 = P2^2;
uchar DataR1[8]; //上半屏红 //显示buffer
uchar DataR2[8];
uchar DataG1[8];
uchar DataG2[8];
void SendData(unsigned char Dat) //发送行扫描数据,4094驱动行
{
unsigned char j;
for(j=0;j<8;j++) //发送每个字节的8位数据
{
if(Dat&0x80)
Data4094 = 1;
else
Data4094 = 0;
Clk4094 = 0;
_nop_();
_nop_(); //延时;
_nop_();
Clk4094 = 1;
Dat <<= 1;
}
}
void SendLine(void) //发送每列的扫描数据,595驱动列 ,行位高电平,列为低电平时点亮
{
uchar i,j;
for( i = 0; i < 8; i++) //发送8个字节
{
for(j=0; j<8; j++) //发送每个字节的8位,0显示
{
if( DataR1[i] & 0x80 ) //上半屏-红
DR1 = 0;
else
DR1 = 1;
if( DataR2[i] & 0x80 )
DR2 = 0;
else
DR2 = 1;
if( DataG1[i] & 0x80 )
DG1 = 0;
else
DG1 = 1;
if( DataG2[i] & 0x80 )
DG2 = 0;
else
DG2 = 1;
SH_CP = 0;
_nop_();
_nop_(); //延时;
_nop_();
SH_CP = 1; //移位时钟上升沿
DataR1[i]<<=1;
DataR2[i]<<=1;
DataG1[i]<<=1;
DataG2[i]<<=1;
}
}
}
void main()
{
uchar i,j,DataHang[2];
uint k;
EN4094 = 0;
while(1)
{
for(k=0;k<25;k++)
{
for( i = 0 ;i < 16; i++)
{
for( j = 0; j < 8; j++) //发送列 数据
{
DataR1[j]=0x55;
DataR2[j]=0xaa;
}
SendLine();
ST_CP = 0;
EN4094 = 1;
ST_CP = 1;
if(i<8) //行扫描
DataHang[0] = 0;
else
DataHang[0] = 1<<(i-8);
DataHang[1] = 1 << i;
SendData(DataHang[0]);
SendData(DataHang[1]);
EN4094 = 0;
}
}
for(k=0;k<25;k++)
{
for( i = 0 ;i < 16; i++)
{
for( j = 0; j < 8; j++) //发送列 数据
{
DataG1[j]=0xaa;
DataG2[j]=0x55;
}
SendLine();
ST_CP = 0;
ST_CP = 1;
if(i<8) //行扫描
DataHang[0] = 0;
else
DataHang[0] = 1<<(i-8);
DataHang[1] = 1 << i;
SendData(*DataHang);
EN4094 = 0;
}
}
}
}
可以试一下,我最近把电脑整理了一下,文件放的都不晓得在哪儿了,这个应该可以,就是速度跟不上去,闪烁的厉害 |
|