美文网首页16级单片机实践经验分享
8*8LED点阵显示-李颖超-0113

8*8LED点阵显示-李颖超-0113

作者: 李颖超0113 | 来源:发表于2018-05-19 15:00 被阅读29次

    一、读懂代码

    因为自身C语言基础比较差,所以决定先把代码看懂然后再在源代码的基础上修改写成自己的点阵显示。
    自己对代码的简短理解都写成注释附在下面的源代码中了,有不对的地方请指正

                  8*8LED点阵———显示数字实验
    实现现象:下载程序后点阵上显示数字0
                
    注意事项:一定要将JOE短接片短接到GND端,如果不需要595后面的小灯点亮可以拔掉JP595短接片。                                                                               
    ***************************************************************************************/
    
    #include "reg51.h"           //此文件中定义了单片机的一些特殊功能寄存器
    #include<intrins.h>
    
    typedef unsigned int u16;     //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit SRCLK=P3^6;//用SRCLK来表示P3口的第六位
    sbit RCLK=P3^5;//用RCLK来表示P3口的第五位
    sbit SER=P3^4;//用SER来表示P3口的第四位
    //SRCLK、RCLK、SER都是下面程序用到的的芯片74hc595中的引脚的名称,想对芯片进一步了解的同学可以看一下代码后面附的链接
    
    u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
    u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
    //二极管点亮的的条件是对应行列分别为高低电平使得电流产生。
    //对应本实验实验板即为列线为高电平,行线为低电平时二极管被点亮
    //第一行代码控制哪列为高电平即为需要此列是否点亮,第二行控制哪一行为低电平,即某一行被点亮,行列共同点亮时交叉处LED亮灯
    //实验板的原理图因为自己看不懂所以这里的行列可能混了【手动狗头】对这个比较清楚的同学可以帮给我指正一下,谢谢。
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能         : 延时函数,i=1时,大约延时10us
    死循环实现延时功能
    *******************************************************************************/
    void delay(u16 i)
    {
        while(i--); 
    }
    
    /*******************************************************************************
    * 函数名         : Hc595SendByte(u8 dat)
    * 函数功能         : 向74HC595发送一个字节的数据
    * 输入           : 无
    * 输出             : 无
    将一个字节的信息串行输入给74HC595以后由芯片并行输出
    *******************************************************************************/
    void Hc595SendByte(u8 dat)
    {
        u8 a;
        SRCLK=0;
        RCLK=0;
        for(a=0;a<8;a++)
        {
            SER=dat>>7;
            dat<<=1;
    
            SRCLK=1;
            _nop_();
            _nop_();
            SRCLK=0;    
        }
    
        RCLK=1;
        _nop_();
        _nop_();
        RCLK=0;
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能       : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {           
        u8 i;
        while(1)//轮回点亮循环体
        {
            P0=0x7f;
            for(i=0;i<8;i++)
            {
                P0=ledwei[i];         //位选
                Hc595SendByte(ledduan[i]);  //发送段选数据
                delay(100);        //延时
                Hc595SendByte(0x00);  //消隐,如果的话点阵显示时会出现重影现象
            }   
        }       
    }
    

    74HC595芯片资料:http://www.51hei.com/chip/3978.html

    二、修改代码

    理解代码以后我们对代码进行修改来实现自己的点阵显示。
    因为对亮度和别的指标没有要求,所以只需要修改和字符显示的这一段就可以啦

    u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
    
    我要显示的是佐字,对应的代码经过推断 替换代码推断.jpg

    所以代码修改为

    u8 ledduan[]={0x20,0x7f,0xd0,0x71,0x51,0xdf,0x51,0x51};
    

    三、烧录

    将代码编译形成新的hex文件后下载到实验板上就OK啦,当然前提是你没有像我一样忘记JOE短接片短接到GND端


    成果.jpg

    相关文章

      网友评论

        本文标题:8*8LED点阵显示-李颖超-0113

        本文链接:https://www.haomeiwen.com/subject/lqzodftx.html