/*
点阵屏管脚定义
SHCP GND
STCP GND
R1 GND
G1 GND
VCC GND
A GND
B GND
C D
*/
/*
控制卡
P0.0~P0.3 A B C D
P16 SCK
P17 STR
R1 P04
G1 P05
R2 P06
G2 P07
*/
#include<stc89c51rc.h>
#define uchar unsigned char
#define uint unsigned int
//如果用自己的单片机实验板连接A B C D 一一对应,则用这个扫描数据
//uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,};/*16行段码*///138驱动数据
//下面的A B C D行扫描数据是反向的 配套我们的控制卡用
uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*///138驱动数据
sbit STR=P1^7; //锁存
sbit SCK=P1^6; //时钟
sbit SERr= P0^4; //红色数据
sbit SERg= P0^5; //绿色数据
uchar line=0;
void rxd_data(); // 发送移动数据
uchar time_count=0; //计数
uchar reg=0;
/**************************************/
void Timer0Interrupt(void) interrupt 1 //定时器中断
{
TH0 = 0x04C;//定时50MS 这里的晶振是18.432M 测试无需理会晶振大小
TL0 = 0x000;
time_count++;
if(time_count>10)//发送一次数据
{
time_count=0;
line++; //下一行
if(line>15) //共16行
{
line=0; //重新移动
reg++;//依次变色 红 绿 黄
if(reg>2)
{
reg=0;
}
}
rxd_data();//发送数据
P0 = sw[line]; //打开行扫描
STR=1;//锁存
STR=0;
STR=1;
}
}
/********************************************/
/*主函数*/
void main()
{
TMOD=0x01; //定时器0 16位定时定时器1方式2
TH0=0x4c; //50ms
TL0=0x00;
TR0=1; //开定时器计数
ET0=1; //开定时器中断
EA=1; //开中断
while(1)
{
}
}
/***********************发送移动的数据****************************/
void rxd_data(void) //串行发送数据
{
uchar s;
uchar k;
//uchar f;
for(s=0;s<8;s++)//发送8字节数据
{
for(k=0;k<8;k++) //一个字节8位
{
SCK=0; //上降沿移位595
if( reg==0)
{
SERr=0;//红色亮
SERg=1;//绿色灭
}
if( reg==1)
{
SERr=1; //红色灭
SERg=0;//绿色亮
}
if( reg==2)
{
SERg=0; //红色亮
SERr=0; //绿色亮
//组合成了黄色
}
SCK=1;
}
}
} |