4个74HC595级联控制16x16点阵横向滚动带仿真(二)

发布者:心连心意最新更新时间:2024-07-23 来源: cnblogs关键字:74HC595  级联控制  16x16点阵 手机看文章 扫描二维码
随时随地手机看文章

废话

  续上篇

  《4个74HC595级联控制16x16点阵横向滚动带仿真(一)》

  将横向滚动的程序分享给QQ群里后,群内的晚秋兄弟提出了另一种思路——采用行扫描、移位方式做滚动,于是熬夜将其实现了一下。仿真程序还是跟前篇一样,不再赘述。

 


 

效果预览

  

/**

 **********************************************************

 ******       Copyright(C), 2010-2016,吐泡泡的虾           ******

 **********************************************************


 *@Tittle                :    16x16点阵滚动显示汉字——横向滚动 移位方式

 *@Version        :    v1.0

 *@Author        :    吐泡泡的虾

 *@Dat            :    2016-08-05 01:11:28

 *@Desctription    :    16x16点阵采用4个74HC595移位寄存器控制,

 *                    4个移位寄存器采用串联方式。

 *                    本例采用行刷新模式。

 *                    取模方式:横向取模,字节不倒序。

 *                    适用于普中开发板。

 *                    为尽量减少RAM占用,未用buff[32]缓存满屏

 *                    显存的方式来存储要显示的文字码值,而采用

 *                    3个基准指针和3个缓存字节循环赋值的方式

 *                注意:

 *                    由于采用4个595级联方式,输入数据速度太慢,

 *                    导致闪烁感较强。可改用6T模式,改善很多。

 *

 *                     更改k值可以更改滚动速度。

 *                     更改延时也可以更改滚动速度,但注意可能引

 *                     起闪烁。

 *@History        :

     #v1.0    [Press F5 to insert time]

         1. some comment


 **********************************************************

 **********************************************************

 */



#include

#include



#define uchar unsigned char

#define uint unsigned int


sbit DS_595 = P3 ^ 4;        //P3^4: 595的数据输入管脚

sbit SHCP_595 = P3 ^ 6;        //P3^6: 595的移位寄存器时钟管脚 SCK

sbit STCP_595 = P3 ^ 5;        //P3^5: 595的输出寄存器时钟管脚 RCK

// sbit MR_595 = P2 ^ 3;    //P0^3: 595的输出输出寄存器重置管脚 MR


void InputTo595(uchar *displayBuff, uchar len);

void OutputFrom595();

void DelayX10us(uchar multi);


//行扫描模式下的行序号,两两一组。如0x80, 0x00为点亮第一行,0x40, 0x00为第二行

uchar code ROW_NUM[] = {

    0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00,

    0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01,

};


//要显示的字符。开头和末尾均留1个空白字符,以显示滚入、滚出效果。任意替换中间的汉字即可

uchar code words[] =

{

    /*--  起始空白,滚入效果  --*/

    /*--  宽度x高度=16x16  --*/

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


//=======================================文字内容替换区============================================

    /*--  文字:  ☆  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x01, 0x00, 0x01, 0x00, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x04, 0x40, 0xFC, 0x7E, 0x40, 0x04,

    0x30, 0x18, 0x08, 0x20, 0x08, 0x20, 0x11, 0x90, 0x16, 0x50, 0x18, 0x30, 0x20, 0x08, 0x00, 0x00,


    /*--  文字:  左  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFF, 0xFE, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00,

    0x0F, 0xF8, 0x10, 0x80, 0x10, 0x80, 0x20, 0x80, 0x40, 0x80, 0x80, 0x80, 0x3F, 0xFE, 0x00, 0x00,


    /*--  文字:  右  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFF, 0xFE, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00,

    0x1F, 0xF8, 0x28, 0x08, 0x48, 0x08, 0x88, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0xF8, 0x08, 0x08,


    /*--  文字:  滚  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x00, 0x80, 0x20, 0x40, 0x17, 0xFC, 0x11, 0x10, 0x82, 0x48, 0x44, 0x84, 0x41, 0x20, 0x13, 0xF0,

    0x10, 0x10, 0x20, 0x88, 0xE1, 0x50, 0x23, 0x20, 0x25, 0x10, 0x29, 0x48, 0x21, 0x86, 0x01, 0x00,


    /*--  文字:  动  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x00, 0x40, 0x00, 0x40, 0x7C, 0x40, 0x00, 0x40, 0x01, 0xFC, 0x00, 0x44, 0xFE, 0x44, 0x20, 0x44,

    0x20, 0x44, 0x20, 0x84, 0x48, 0x84, 0x44, 0x84, 0xFD, 0x04, 0x45, 0x04, 0x02, 0x28, 0x04, 0x10,


    /*--  文字:  ★  --*/

    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

    0x01, 0x00, 0x01, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x07, 0xC0, 0xFF, 0xFE, 0x7F, 0xFC,

    0x3F, 0xF8, 0x0F, 0xE0, 0x0F, 0xE0, 0x1F, 0xF0, 0x1E, 0xF0, 0x18, 0x30, 0x20, 0x08, 0x00, 0x00,

//==================================================================================================



    /*--  空白,滚出效果  --*/

    /*--  宽度x高度=16x16  --*/

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

};




void main()

{

    uint i, j, rollSpeed;

    bit mode = 0;

    uchar num = 0;

    //显示缓存,用来存储输入到4个595中的数据。

    //displayBuff[0]:0# 595,控制上8行,上为高位

    //displayBuff[1]:1# 595,控制下8行,上为高位

    //displayBuff[2]:2# 595,控制左8列,左为高位

    //displayBuff[3]:3# 595,控制右8列,左为高位

    uchar displayBuff[4];


    bit moveLeft = 1;    //移动方向,1——左移,0——右移


    uchar* basePtr[3];    //每8次移位之前的第一行的3个半边字符(即正在显示的左半、正在显示的右半、即将显示的另一半)的基准指针,其他行码值在此基础上偏移

    uchar temp[3];        //用来存储三个半边字符的某一行的码值

    uchar cache[2];        //中间变量,可不要

    uchar wordsCount = sizeof(words) / sizeof(words[0]) / 32;    //汉字总数


    while (1)

    {

        //获取每8次移位前的第一行的基准指针地址

        if (mode == 0)    //模式0,左右半屏显示同一个字,basePtr[2]指向下一个即将显示的字的左半(左滚时)或右半(右滚时)的首行

        {

            basePtr[0] = words + (num)  * 32 + (moveLeft ? 0 : 1);

            basePtr[1] = words + (num)  * 32 +  (moveLeft ? 1 : 0);

            basePtr[2] = words + (num + 1) % wordsCount * 32 + (moveLeft ? 0 : 1);    //取余是为了显示到最后一个字时,temp[2]等于首字的左半

        }

        else//模式1,(左滚时)左半屏显示上一个字的右半,右半屏显示下一个字的左半

            //(右滚时)右半屏显示上一个字的左半,左半屏显示下一个字的右半

            //basePtr[1][2]指向下一个即将显示的两个半边字符码地址的首行

        {

            basePtr[0] = words + (num)  * 32 +  (moveLeft ? 1 : 0);

            basePtr[1] = words + (num + 1) % wordsCount * 32 + (moveLeft ? 0 : 1);    //取余是显示最后一个字右半时,temp[1]等于首字的左半

            basePtr[2] = words + (num + 1) % wordsCount * 32 +  (moveLeft ? 1 : 0); //取余是显示最后一个字右半时,temp[1]等于首字的右半

        }


        for (j = 0; j < 8; j++)

        {

            rollSpeed = 1;    //滚动速度调节

            while (rollSpeed--)

            {

                //依次显示16列,即显示完一屏

                for (i = 0; i < 16; i++)

                {

                    //移位操作涉及的3个半边字符,往移动方向最先移除屏幕的定义为序号[0]

                    //根据ptr计算,可得左移时,temp[0][1][2]分别对应前左<-前右<-后左或前右<-后左-<后右

                    //右移时,temp[2][1][0]分别对应后右->前左->前右或后左->后右->前左

                    temp[0] = *(basePtr[0] + 2 * i);

                    temp[1] = *(basePtr[1] + 2 * i);

                    temp[2] = *(basePtr[2] + 2 * i);


                    if (moveLeft)//左移

                    {

                        cache[0] = temp[0] << j | temp[1] >> (8 - j);

                        cache[1] = temp[1] << j | temp[2] >> (8 - j);

                    }

                    else

                    {

                        cache[0] = temp[1] >> j | temp[2] << (8 - j);

[1] [2]
关键字:74HC595  级联控制  16x16点阵 引用地址:4个74HC595级联控制16x16点阵横向滚动带仿真(二)

上一篇:8051系列单片机软件精确延时研究(一)
下一篇:4个74HC595级联控制16x16点阵横向滚动带仿真(一)

推荐阅读最新更新时间:2024-11-03 10:21

SPI 调试-74HC595 数码管控制实验
注意:要让S3C2440的一路SPI去控制外设,就必须把给nSSn外接一个上拉电阻!才能保证数据的正常传输。可以再找一个I/0口来控制74HC595的片选。 74HC595是8位串行输入转并行输出移位寄存器。74HC595引脚图! 控制原理图: RCK也就是STCP ,在采集数据前要给RCK低电平,采集完信号要给高电平。 RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。 控制图程序: void SPI_TEST(void) { int i; U
[单片机]
SPI 调试-<font color='red'>74HC595</font> 数码管<font color='red'>控制</font>实验
单片机驱动74hc595使用方法
单片机驱动74hc595的方法:http://www.51hei.com/chip/1799.html 单片机驱动74hc595 74hc595外形图 _______ QB--|1 16|--Vcc QC--|2 15|--QA QD--|3 14|--SI QE--|4 13|--/G QF--|5 12|--RCK QG--|6 11|--SCK QH--|7 10|--/SCLR GND-|8 9|--QH' |______| 74595的数据端: QA--QH: 八位并行输出端,可以直接控制数码管的8个段。 QH': 级联输出端。将它接下一个595的SI端。 SI: 串行数据输
[单片机]
74HC595 的实际应用与编程
74HC595具有一个8位串行输入并行输出的移位寄存器和一个8位输出锁存器。 ;================================================ ;74HC595 走马灯演示程序 ;创作日期:2007/08/012 ;创作者: 给我一支烟 ;================================================ SDATA_595 EQU P1.0 ;串行数据输入 SCLK_595 EQU P1.1 ;移位时钟脉冲 RCK_595 EQU P1.2 ;输出锁存器控制脉冲 ;========================
[单片机]
基于H桥级联型逆变器PWM控制策略的研究
H桥级联型多电平变换器采用多个功率单元串联的方法来实现高压输出,其输出多采用多电平移相式PWM 控制 方式,以实现较低的输出电压谐波,较小的dv/dt和共模电压及较小的转矩脉动。为实现高压,只需简单的增加单元数即可,该种实现方式的技术难度小。每个功率单元都是分离的直流 电源 ,之间是彼此独立的,对一个单元的 控制 不会影响其他单元。H桥级联型逆变器与单桥逆变器的实现方式主要区别在于PWM的控制方式上,本文对H桥级联型逆变器的PWM控制方式进行探讨。 2 H桥级联型逆变器结构 每个功率单元都是一个独立的直流电源,其设计方式如下图1所示: 图1 功率单元结构框图 根据上图对功率单元的描述可知,此种实现方式的功率单元可以产生
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved