16x32 P10廣告屏點(diǎn)陣任意位置畫(huà)點(diǎn)畫(huà)線,點(diǎn)陣直接用P10單紅門(mén)頭廣告屏,省去了自己焊接,刷了一個(gè)時(shí)鐘走時(shí)程序,圖片中間點(diǎn)是秒閃,
用的是12c5a60s2。
IMG_20210605_201947_HHT[1].jpg (3.6 MB, 下載次數(shù): 62)
下載附件
2021-6-5 20:41 上傳
IMG_20210605_201950_HHT[1].jpg (3.59 MB, 下載次數(shù): 54)
下載附件
2021-6-5 20:41 上傳
單片機(jī)源程序如下:
#include <REG52.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define BB P3
sbit SHCP=P2^3; // 移位時(shí)鐘
sbit STCP=P2^4; // 鎖存時(shí)鐘
sbit DATA=P2^5; // 數(shù)據(jù)輸出
sbit OE = P2^0; // 使能輸出
uchar PLAYBUF[64];
uchar a,b;
uchar sec=0,min=0,timecount=0;
bit point;
void serial_input(uchar dat);
void LED_dot_write(uchar x,uchar y,uchar c);
void line(uchar x1, uchar y1, uchar x2, uchar y2, uchar c);
void number(uchar su,uchar x,uchar y,uchar c);
void display();
/****************************************************/
void main()
{
EA = 1;
TMOD=0x01; //timer0為模式1
TH0 = 0x4c;
TL0 = 0x00;
ET0 = 1;
TR0 = 1; //定時(shí)器0可以工作
while(1)
{
a=sec-1;b=min-1;
number(sec/10,17,0,1);
number(sec%10,25,0,1);
number(min/10,0,0,1);
number(min%10,8,0,1);
line(15,4,15,5,2);
line(16,4,16,5,2);
line(15,9,15,10,2);
line(16,9,16,10,2);
display();
number(a/10,17,0,0);
number(a%10,25,0,0);
number(b/10,0,0,0);
number(b%10,8,0,0);
}
}
/************數(shù)據(jù)串行輸入 *************************/
void serial_input(uchar dat)
{
unsigned char m = 0x00;
for(m=0X00;m<8;m++)
{
DATA=~dat&0x80;
SHCP=1;
SHCP=0;
dat<<=1;
}
}
/******************任意位置畫(huà)點(diǎn)******************************************/
void LED_dot_write(uchar x,uchar y,uchar c)
{
uchar i;
if(x>=32) return;
if(y>=16) return;
i=0x80;
i>>=x-((x>>3)<<3);
switch(c)
{
case 0:PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] &= ~i;break;
case 1:PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] |= i;break;
case 2:if(point)PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] |= i;
else PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] &= ~i;break;
default: break;
}
}
/*****************任意位置畫(huà)線******************************************/
void line(uchar x1, uchar y1, uchar x2, uchar y2, uchar c)
{
uchar x, y, t;
if((x1 == x2) && (y1 == y2))
LED_dot_write(x1, y1, c);
else if(fabs(y2 - y1) > fabs(x2 - x1))
{
if(y1 > y2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(y = y1; y <= y2; y ++)
{
x = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
LED_dot_write(x, y, c);
}
}
else
{
if(x1 > x2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(x = x1; x <= x2; x ++)
{
y = (x - x1) * (y2 - y1) / (x2 - x1) + y1;
LED_dot_write(x, y, c);
}
}
}
/*********************任意位置畫(huà)數(shù)字*********************************************************/
void number(uchar su,uchar x,uchar y,uchar c)
{
if(su==0)
{
line(x,y+4,x,y+10,c);
line(x+1,y+3,x+5,y+3,c);
line(x+6,y+4,x+6,y+10,c);
line(x+1,y+11,x+5,y+11,c);
line(x+1,y+9,x+5,y+5,c);
}
if(su==2||su==3||su==5||su==6||su==8||su==9)
{
line(x+1,y+7,x+5,y+7,c);
if(su==5||su==8||su==9)
{
line(x,y+4,x,y+6,c);
if(su==5)
{
line(x+1,y+3,x+6,y+3,c);
line(x+6,y+8,x+6,y+10,c);
line(x,y+11,x+5,y+11,c);
}
if(su==8)
{
line(x+1,y+3,x+5,y+3,c);
line(x+1,y+11,x+5,y+11,c);
line(x,y+8,x,y+10,c);
line(x+6,y+4,x+6,y+6,c);
line(x+6,y+8,x+6,y+10,c);
}
if(su==9)
{
line(x+1,y+3,x+5,y+3,c);
line(x,y+11,x+5,y+11,c);
line(x+6,y+4,x+6,y+10,c);
}
}
if(su==2)
{
line(x,y+3,x+5,y+3,c);
line(x+6,y+4,x+6,y+6,c);
line(x,y+8,x,y+10,c);
line(x+1,y+11,x+6,y+11,c);
}
if(su==3)
{
line(x,y+3,x+5,y+3,c);
line(x+6,y+4,x+6,y+6,c);
line(x+6,y+8,x+6,y+10,c);
line(x,y+11,x+5,y+11,c);
}
if(su==6)
{
line(x+1,y+3,x+6,y+3,c);
line(x,y+4,x,y+10,c);
line(x+6,y+8,x+6,y+10,c);
line(x+1,y+11,x+5,y+11,c);
}
}
if(su==1||su==4||su==7)
{
line(x+6,y+3,x+6,y+11,c);
if(su==4)
{
line(x,y+3,x,y+6,c);
line(x+1,y+7,x+5,y+7,c);
}
if(su==7)
{
LED_dot_write(x+6,y+3,0);
line(x,y+3,x+5,y+3,c);
}
}
}
/***************整屏顯示*************************************************/
void display()
{
uchar i = 0x00;
uchar j = 0X00;
uchar k = 0x00;
uchar buf;
uchar COUNT;
for(k=0;k<4;k++)
{
for(j=0;j<2;j++)
{
for(i=0;i<2;i++)
{
buf = PLAYBUF[24+(k<<1)+i+(j<<5)];serial_input(buf);
buf = PLAYBUF[16+(k<<1)+i+(j<<5)];serial_input(buf);
buf = PLAYBUF[8+(k<<1)+i+(j<<5)];serial_input(buf);
buf = PLAYBUF[(k<<1)+i+(j<<5)]; serial_input(buf);
}
}
STCP=1;
STCP=0;
BB=k;
OE=1;
COUNT =200;
while(COUNT--);
OE =0;
}
}
/****************************************************/
void time50ms(void) interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
timecount++;
if(timecount==10)
{
timecount=0;
point=!point;
if(point)
{
sec++;
}
if(sec>59)
{
sec=0;
min++;
}
if(min>59)
min=0;
}
}
/**************************************************/
|