2016.1.20 SCM LED点阵汉字纵移

本文介绍如何使用51单片机的P3口进行信号位分离,并实现汉字的移动显示功能。具体讲解了P3^4操作的意义,即获取P3信号中的第3位,并通过SPI接口控制HC595移位寄存器来逐个显示不同的汉字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


P3^4:

从一个集成信号中分离出某一个位
比如 P3^4 就是取P3信号中的第3位
因为4代表二进制数的第3位
即 十进制(4) = 二进制(0100)
P3^4 就是 ABCD &0100 (ABCD是P3的4个信号位)
P3信号第3位就是B位
如果 B为1 即 1与1 结果为1 KEY3的值就是1
如果 B为0 即 0与1 结果为0 KEY3的值就是0


高电平

高电平:就是与低电平相对的高电压,是电工程上的一种说法。
在逻辑电平中,保证逻辑门的输入为高电平时所允许的最小输入高电平,当输入电平高于输入高电压(Vih)时,则认为输入电平为高电平。
在数字逻辑电路中,低电平表示0,高电平表示1。一般规定低电平为0~0.25V,高电平为3.5~5V。
也有其他的可能,如在移动设备中电池的电压会随使用时间的的推移而降低,如果规定高电平最低为3.5V的话可能设备的使用时间会大大降低,此时规定的高电平电压会低一点,最低会有1.7V左右。


            

--------------------------------------------------------------------------------
* 实 验 名         : 汉字移动显示
* 实验说明       :
* 连接方式       : 见接线图
* 注    意         :
*******************************************************************************/

#include <REG51.H>
#include <intrins.h>
#include "array1.h"

//--重定义函数变量--//
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;                                                //取P3信号的第三位
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;

//--全局函数声明--//
void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0);
                                                                                            
/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void main(void)
{   
    int k, j, ms;
    
    //--定义一个指针数组指向每个汉字--//
    uchar *p[] =
                {tab17, tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8,
                 tab9, tab10,/* tab11, tab12, tab13, tab14, tab15,*/ tab16};                        
    while(1)
    {

        for(ms = 15; ms > 0; ms--)    //移动定格时间设置
        {
            for(k = 0; k < 16; k++)    //显示一个字
            {                             
                HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),tab0[2*k],tab0[2*k + 1]); //因为字模软件取的数组是高电平有效,所以列要取反            
            }
            
            //--清屏--//
            HC595SendData(0xff,0xff,0,0);                                           //清屏        
        }

        
        j++;
        if(j == (17*10) )      //有几个字乘几
        {
            j = 0;
        }
        
    }                                           
}

/*******************************************************************************
* 函 数 名         : HC595SendData
* 函数功能           : 通过595发送四个字节的数据
* 输    入         : BT3:第四个595输出数值
*                  * BT2: 第三个595输出数值
*                  * BT1:第二个595输出数值
*                  * BT0:第一个595输出数值
* 输    出         : 无
*******************************************************************************/

void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{  
    uchar i;
    
    //--发送第一个字节--//
    for(i=0;i<8;i++)
    {
        MOSIO = BT3 >> 7 ;    //从高位到低位
        BT3 <<= 1;

        S_CLK = 0;
        S_CLK = 1;        
    }

    //--发送第一个字节--//
    for(i=0;i<8;i++)
    {
        MOSIO = BT2 >>7;        //从高位到低位
        BT2 <<= 1;

        S_CLK = 0;
        S_CLK = 1;    
    }

    //--发送第一个字节--//
    for(i=0;i<8;i++)
    {
        MOSIO = BT1 >> 7;        //从高位到低位
        BT1 <<= 1;
        S_CLK = 0;
        S_CLK = 1;    
    }

    //--发送第一个字节--//
    for(i=0;i<8;i++)
    {
        MOSIO = BT0 >> 7;        //从高位到低位
        BT0 <<= 1;
        S_CLK = 0;
        S_CLK = 1;
    }
   
    //--输出--//
    R_CLK = 0; //set dataline low
    R_CLK = 1; //片选
    R_CLK = 0; //set dataline low
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值