打印
[PIC®/AVR®/dsPIC®产品]

基于PIC18F16Q40的串行点阵块的显示驱动

[复制链接]
658|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2021-7-11 08:22 编辑

前文介绍了一种串行数码管的显示驱动方法,其控制芯片是MAX7219,其实基于MAX7219的应用并不止这一个,利用它还可以控制串行点阵块。在单级使用的情况下,一片MAX7219可控制一块8*8点阵的显示块,若采用级联的方式,则可驱动多个点阵块,实现多个字符同时显示,从而达到点阵信息屏的输出效果。
8*8点阵显示块的引脚排列方式如图1所示,共分为8条行线和8条列线,当行线和列线分别提供相应的高低电平时,行与列交叉位置处的LED即被点亮。
图1  点阵显示块引脚排列

基于MAX7219的串行点阵显示块,其原理图如图2所示。
图2  串行点阵显示块原理图

该模块分为输入端和级联输出端,在单独使用时,只需连接输入端的5个引脚,除2个电源引脚外,另3个引脚为:串行数据输入端DIN、串行时钟输入端CLK及片选引脚CS。
若多片级联,看将前一级的级联输出端与后一级的输入端对应引脚相连。
在使用过程中,串行数码管引脚与开发板的连接关系为:
VCC---5V
GND---GND
DIN---RC4
CLK--- RC6
CS --- RC7
MCC的引脚配置如图3所示,相应的引脚命名如图4所示。
图3 引脚配置

图4 引脚命名

此外,为便于编程还调用了系统的延时函数,见图5所示。
图5 启用延时函数

支持显示的字模被存放在数组中,其格式如下:
char disp[38][8]={
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0
{0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x10},//1
{0x3E,0x22,0x22,0x3E,0x2,0x2,0x2,0x3E},//9
{0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22},//A
{0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
{0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C
{0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41},//X
{0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8},//Y
{0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F},//Z
{0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8},//中
{0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},//国
};

Max7219发送字节数据的函数为:
void Write_Max7219_byte(char DATA)         
{
            char i;   
            CS_SetLow();
            for(i=8;i>=1;i--)
            {                  
            CLK_SetLow();
            if(DATA&0x80)
               DIN_SetHigh();
            else
               DIN_SetLow();   
            DATA=DATA<<1;
            CLK_SetHigh();
           }
}

其设计思想是将一个字节的8位数据,在时钟脉冲CLK的配合下,一位位的由DIN引脚串行输送出去。所发送的顺序为高位在先,低位在后。
向寄存器写入数据的函数为:
void Write_Max7219(char address,char dat)
{
             CS_SetLow();
             Write_Max7219_byte(address);        //写入地址,即数码管编号
             Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
             CS_SetHigh();
}

MAX7219的初始化函数为:
void Init_MAX7219(void)
{
     Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
     Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
     Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0   
}

显示显示效果的主程序为:
void main(void)
{
    char i,j;
    SYSTEM_Initialize();
    DELAY_milliseconds(500);
    Init_MAX7219();  
    while(1)
    {
       for(j=0;j<38;j++)
       {
              for(i=1;i<9;i++)
              Write_Max7219(i,disp[j][i-1]);
              DELAY_milliseconds(1000);
              IO_RC1_Toggle();
       }  
    }
}

其中的内层循环是为了完成单个字符的显示,而外层的循环则是负责将字符库中的内容遍寻显示一轮。
在显示过程中,每显示完一个字符,板上的LED就切换一次状态。

在完成程序编译和下载的情况下,其演示效果如图6至图8所示。

在该点阵块的驱动中,是采用GPIO口来模拟SPI接口来驱动。由于MAX7219内部的设计很有特色,故在显示过程中并无抖动和闪烁现象。像PIC18F16Q40这样的下板卡,能驱动串行点阵模块来动态显示信息,若与前面介绍的串行数码管显示来比的话,还是比较有特色的,也具有较高的实际应用价值。

点阵块动画演示:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝