找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3012|回复: 1
收起左侧

大佬,是32*64点阵程序问题啊

[复制链接]
ID:291645 发表于 2018-3-23 11:24 | 显示全部楼层 |阅读模式
最近做了个32*64 单色点阵仿真。在程序上遇到问题了。望各位路过的大佬帮帮我这单片机菜鸟。#include<reg52.h>
#include"MacroAndConst.h"
#include"delay.h"
#include"display.h"
#include"ziku.h"


extern bit fLeftFlag;  //声明外部变量
extern bit fRightFlag;        //声明外部变量
uchar scan;
uchar speed=5;        //设定移动速度
uint words;                //字模计数器
uchar move;                //列指针
uchar line;                //行指针
uchar temp;
uchar BUFF[10];        //缓存数组
sbit ST=P3^5;        //595 STR
sbit SH=P3^6;  //595 CLK
sbit DATA=P3^7;        //595 DATAS


/**********************************************************
函数名称:LeftflowDisplay
函数功能:左移显示函数
入口参数:无  
出口参数:无
备  注:
**********************************************************/
void LeftflowDisplay()                //逐行 阴码 逆向
{
        uchar sp,y=0;
        move=0;
        words=0;
                while(words<20*32)                //
                {       
                         if(fLeftFlag==1)
                        {
                                while(move<16)        //数据移位
                                {       
                                        if(fLeftFlag==1)
                                        {       
                                       
                                                for(sp=0;sp<speed;sp++)        //移动速度
                                                {       
                                                        if(fLeftFlag==1)
                                                        {
                                                                for(line=0;line<16;line++)        //行扫描
                                                                {
                                                                        loadline1();        //装载一线点阵数据
                                                                        sendline1();        //发送一线移动数据
                                                                        scan=line;        //显示第line行
                                                                        P2=scan;
                                                                        ST=1;                //锁存为高,595锁存信号
                                                                        ST=0;
                                                                        delay_10us(50);        //延时500us,等待一段时间,产生视觉暂留
                                                                }
                                                        }
                                                        else
                                                        break;
                                                }
                                                move=move+1;                //移动一步(一位)
                                        }
                                        else
                                        break;
                                }
                                move=0;
                                words=words+32;        //下一个字
                        }
                        else
                        break;
                }
                words=0;
        }
/**********************************************************
函数名称:loadline1
函数功能:装载点阵数据        缓存
入口参数:无  
出口参数:无
备  注:
**********************************************************/


void loadline1()
{
        uchar s;
        for(s=0;s<5;s++)        //s为要显示的字数+1(显示4字+1=5)
        {
                BUFF[2*s]=zuoyi[words+ 32*s + 2*line];
                BUFF[2*s+1]=zuoyi[words+1+ 32*s + 2*line];
               
               
        }
}
/**********************************************************
函数名称:sendline1
函数功能:发送点阵数据        缓存
入口参数:无  
出口参数:无
备  注:
**********************************************************/
void sendline1()
{
        uchar s;
        uchar inc,temp,tempcol;
        uchar  k;
        DATA=1;
        if(move<8) inc=0;
        else inc=1;
        for(s=0+inc;s<=7+inc;s++)
        {
                if(move<8)
                        tempcol=move;
                else
                        tempcol=move-8;
                temp=(BUFF>>tempcol)|(BUFF[s+1]<<(8-tempcol));        //字模左边字节右移tempcol位,右边字节左移8-tempcol位,2者相或
                for(k=0;k<8;k++)
              {
                      SH=0;
                        DATA=(bit)(temp&0x80);
                       temp=temp<<1;
                      SH=1;
           }
        }
}
/**********************************************************
函数名称:RightflowDisplay
函数功能:右移显示函数
入口参数:无  
出口参数:无
备  注:
**********************************************************/
void RightflowDisplay()        //流动右移         逐行 阴码 顺向
{
        uchar i;
        move=0;
        words=0;
        while(words<=20*32)          //数组元素。46组,每组32个
        {       
                if(fRightFlag==1)
            {
                        while(move<16)// 循环16次,点亮并移动一个汉字
                        {         
                                if(fRightFlag==1)
                                {
                                        for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
                                        {
                                                if(fRightFlag==1)
                                                {
                                                        for(line=0;line<16;line++)//扫描16行                         
                                                        {
                                                                loadoneline();//装载一线点阵数据
                                                                sendoneline();//发送一线点阵数据
                                                                P2=line;                 
                                                            ST= 0;
                                                                ST= 1;
                                                            delay_10us(50); //延时500us,等待一段时间,产生视觉暂留                                                              
                                                        }
                                                 }
                                                 else
                                                 break;
                                        }
                                        move++;        //列指针递增
                                }
                                else
                                break;                       
                        }
                        move=0;
                        words=words+32;// 一个汉字移动后,指向下一个汉字          
                }
                else
                break;


        }
        words=0;
}
/**********************************************************
函数名称:loadoneline
函数功能:装载点阵数据        缓存
入口参数:无  
出口参数:无
备  注:
**********************************************************/
void loadoneline()
{
        uchar s;       
    for(s=0;s<5;s++)              //s为要显示的数字+1
                {
                        BUFF[2*s+1]=youyi[words+32*s+2*line];
                        BUFF[2*s]=youyi[words+1+32*s+2*line];//~
                }
}
/**********************************************************
函数名称:sendoneline
函数功能:发送点阵数据        缓存
入口参数:无  
出口参数:无
备  注:
**********************************************************/
void sendoneline()
{
        char s;
        uchar inc,k,tempcol;
        if(move<8)
                inc=0;
        else
                inc=1;      
        for(s=7+inc;s>=0+inc;s--)
                {
                        if(move<8)
                                tempcol=move;
                        else
                                tempcol=move-8;
                                temp=(BUFF>>tempcol)|(BUFF[s+1]<<(8-tempcol));
                        for(k=0;k<8;k++)
                             {       
                              SH=0;
                                DATA=(bit)(temp&0x01);
                               temp=temp>>1;
                              SH=1;
                          }
                }
}
显示程序是这样的。显示出来的是两行一样的字。
那么问题来了。。。
1、如果如原理图所示,595的DS只接一个数据引脚da0,怎么改程序让两行都显示数据,且数据不同呢?
2、如果把第二排595的DS接另一个数据引脚,先把第一排的数据全部移入595,再把第二排的数据移入595,然后再给第一排输出时钟,给第二排输出时钟,让两排的数据同时输出。请问怎么改程序

仿真原理图

仿真原理图
回复

使用道具 举报

ID:96682 发表于 2018-3-23 13:10 | 显示全部楼层
把驱动电路理清就不是事了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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