/*
點陣屏管腳定義
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;
}
}
} |