找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2692|回复: 4
打印 上一主题 下一主题
收起左侧

16x32 P10广告屏点阵任意位置画点画线 单片机程序

  [复制链接]
跳转到指定楼层
楼主
16x32  P10广告屏点阵任意位置画点画线,点阵直接用P10单红门头广告屏,省去了自己焊接,刷了一个时钟走时程序,图片中间点是秒闪,
用的是12c5a60s2。



单片机源程序如下:
#include <REG52.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int

#define BB P3
sbit SHCP=P2^3;        // 移位时钟
sbit STCP=P2^4;        // 锁存时钟
sbit DATA=P2^5;       // 数据输出
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;   //定时器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);
    }
}
/************数据串行输入 *************************/
void serial_input(uchar dat)     
{
    unsigned char m = 0x00;
    for(m=0X00;m<8;m++)
    {
        DATA=~dat&0x80;
        SHCP=1;
        SHCP=0;
        dat<<=1;  
    }
}
/******************任意位置画点******************************************/
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;
    }                  
}

/*****************任意位置画线******************************************/
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);
        }
    }
}
/*********************任意位置画数字*********************************************************/
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;
    }   
}
/**************************************************/

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:885138 发表于 2021-6-6 10:47 来自手机 | 只看该作者
厉害了,楼主电路图有吗
回复

使用道具 举报

板凳
ID:168911 发表于 2021-6-6 18:57 | 只看该作者
xxd0708 发表于 2021-6-6 10:47
厉害了,楼主电路图有吗

这个不用电路图也可以,只要对应管脚就可以,这个放心好了
回复

使用道具 举报

地板
ID:1002257 发表于 2022-1-28 20:17 | 只看该作者
这个怎么接51版
回复

使用道具 举报

5#
ID:168911 发表于 2022-6-25 21:11 | 只看该作者

595移位,锁存,数据,OE,扫描,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表