51驱动VFD问题,说是用SPI,能解释一下不。

2020-01-30 13:55发布


这是附的程序,32M晶振,STC12C5A60S2
能给解释一下不
#include <reg51.h>//这里应该是引用STC的头文件吧。
#include "ascii16.h"
#include "logo.h"
sbit led=P3^0;
sbit lat=P1^0;
sbit bk=P1^1;
sbit clkg=P1^2;
sbit sig=P1^3;

//绿 {MOD}这几句是不可以接其它的IO口。
//sbit as=P1^4;//<-----SPI接口是这两条吗?SS接口
//sbit cka=P1^5;//<---SPI接口是这两条吗?MOSI接口

unsigned char gird = 43;
#define LAT_LOW()       lat=0                                 
#define LAT_HIGH()      lat=1

#define BK_LOW()       bk=0        //PA6 (MISO None used)
#define BK_HIGH()      bk=1

#define CLKG_LOW()       clkg=0
#define CLKG_HIGH()      clkg=1

#define SIG_LOW()       sig=0
#define SIG_HIGH()      sig=1



//#define A_LOW()       as=0
//#define A_HIGH()      as=1

//#define CK_LOW()      cka=0
//#define CK_HIGH()      cka=1

xdata unsigned char a_buf[8][128];        //定义屏幕寄存器区,为128行,8页



void delay(unsigned int i)
{
for (i;i>0;i--);
}

void SPI2_SendByte_soft(unsigned char byte)  //栅级前几列
{
    unsigned char i = 0;
    for(i = 0;i < 5;i++)
    {
        CLKG_LOW();
        if((byte & 0x01) == 0x00)
        {
            SIG_LOW();
        }
        else
        {
            SIG_HIGH();
        }
        byte >>= 1;
        CLKG_HIGH();
    }
}

void SPI1_SendByte(unsigned char i )          //spi发送数据

{
SPSTAT = 0xf0;
//delay(2);
SPDAT=i;//这句是不将数据写到MOSI上,
delay(1);


}
  //--------------------------------------------------------------------------------------
  //VFD扫描程序,程序工作时必须保证此扫描连续进行,可以放到主程序或者通过定时器周期执行
  //不能长时间停滞否则有烧伤荧光粉危险
  //屏幕扫描时寄存器a_buf[8][128]  寄存器竖着排列,每个缓存寄存器对应屏幕上8八个点,主程序只要更改缓存寄存器内容,图像即可刷新
void Scan_VFD(void)              //vfd扫描
{
   // static unsigned char gird = 43;                                                                                //栅极列数
    unsigned char gird_tmp = 0;                                                                                       
    unsigned char tmp = 0;
    unsigned char i = 0;
    unsigned char base_a = 0;

    if(gird >= 43)
    {
        gird = 0;
        SPI2_SendByte_soft(0x03);
    }
       
    CLKG_LOW();
    CLKG_HIGH();
        gird_tmp = 42 - gird;

    base_a = (gird_tmp >> 1) * 6;
               
    if((gird_tmp & 0x01) == 0x01)                       //双数列
    {
        for(i = 0;i < 8;i++)
        {

                 tmp=((a_buf[base_a + 5]<<1)&0x02);
                 tmp|=((a_buf[base_a + 4]<<3)&0x08);
         tmp|=((a_buf[base_a + 3]<<5)&0x20);
         tmp|=((a_buf[base_a + 5]<<6)&0x80);
                SPI1_SendByte(tmp);
               
         tmp  = a_buf[base_a + 4] & 0x02;
         tmp|=(((a_buf[base_a + 3])<<2)&0x08);
         tmp|=(((a_buf[base_a + 5])<<3)&0x20);
         tmp|=(((a_buf[base_a + 4])<<5)&0x80);
            SPI1_SendByte(tmp);
         tmp=(((a_buf[base_a + 3])>>1)&0x02);
         tmp |= a_buf[base_a + 5] & 0x08;
         tmp|=(((a_buf[base_a + 4])<<2)&0x20);
         tmp|=(((a_buf[base_a + 3])<<4)&0x80);
            SPI1_SendByte(tmp);
         tmp=(((a_buf[base_a + 5])>>3)&0x02);
         tmp|=(((a_buf[base_a + 4])>>1)&0x08);
         tmp|=(((a_buf[base_a + 3])<<1)&0x20);
         tmp|=(((a_buf[base_a + 5])<<2)&0x80);
            SPI1_SendByte(tmp);
         tmp=(((a_buf[base_a + 4])>>4)&0x02);
         tmp|=(((a_buf[base_a + 3])>>2)&0x08);
         tmp|=(((a_buf[base_a + 5])>>1)&0x20);
         tmp|=(((a_buf[base_a + 4])<<1)&0x80);   
            SPI1_SendByte(tmp);
         tmp=(((a_buf[base_a + 3])>>5)&0x02);
         tmp|=(((a_buf[base_a + 5])>>4)&0x08);
         tmp|=(((a_buf[base_a + 4])>>2)&0x20);
         tmp |= a_buf[base_a + 3] & 0x80;
            SPI1_SendByte(tmp);
        }
               
    }
    else                                                //单数列
    {
        for(i = 0;i < 8;i++)
        {

                  //  if(i==0)
                //        {
                  //
                //         BK_HIGH();
                //        }
            tmp  = a_buf[base_a + 0] & 0x01;
            tmp|=(a_buf[base_a + 1]<<2&0x04);
            tmp|=(a_buf[base_a + 2]<<4&0x10);
            tmp|=(a_buf[base_a + 0]<<5&0x40);
            SPI1_SendByte(tmp);
            tmp=(a_buf[base_a + 1]>>1&0x01);
            tmp|=(a_buf[base_a + 2]<<1&0x04);
                    tmp|=(a_buf[base_a + 0]<<2&0x10);
            tmp|=(a_buf[base_a + 1]<<4&0x40);
            SPI1_SendByte(tmp);
            tmp=(a_buf[base_a + 2]>>2&0x01);
                    tmp|=(a_buf[base_a + 0]>>1&0x04);
            tmp|=(a_buf[base_a + 1]<<1&0x10);
            tmp|=(a_buf[base_a + 2]<<3&0x40);
            SPI1_SendByte(tmp);
            tmp=(a_buf[base_a + 0]>>4&0x01);
                        tmp|=(a_buf[base_a + 1]>>2&0x04);
            tmp |= a_buf[base_a + 2] & 0x10;
            tmp|=(a_buf[base_a + 0]<<1&0x40);
            SPI1_SendByte(tmp);
            tmp=(a_buf[base_a + 1]>>5&0x01);
                    tmp|=(a_buf[base_a + 2]>>3&0x04);  
                tmp|=(a_buf[base_a + 0]>>2&0x10);
            tmp |= a_buf[base_a + 1] & 0x40;
            SPI1_SendByte(tmp);
            tmp=(a_buf[base_a + 2]>>6&0x01);
                tmp|=(a_buf[base_a + 0]>>5&0x04);
                        tmp|=(a_buf[base_a + 1]>>3&0x10);   
                        tmp|=(a_buf[base_a + 2]>>1&0x40);
            SPI1_SendByte(tmp);                                   
        }       
    }
  BK_HIGH();
        LAT_HIGH();
        LAT_LOW();
    BK_LOW();       
        gird++;
}

void vfd_putc_asc16(unsigned char x,unsigned char y,unsigned char ch)                 //显示asc字符
{
    const unsigned char *pt1,*pt2;
    unsigned char i = 0;

    if((ch < 128) && (ch > 31) && (x < 16) && (y < 4))
    {
        pt1 = &ascii16x16[0] + ((ch - 32) * 16);
        pt2 = pt1 + 8;
        for(i = 0;i < 8;i++)
        {
            a_buf[y * 2][x * 8 + i] = *pt1;
            pt1++;
            a_buf[y *2  + 1][x * 8 + i] = *pt2;
            pt2++;
        }
    }
}


void vfd_puts_asc16(unsigned char x,unsigned char y,unsigned char *str)            //显示asc字符串
{
    while(*str != 0x00)
    {
        vfd_putc_asc16(x,y,*str);
        str++;
        x++;
    }
}

void disp_image_64(unsigned char pos,const unsigned char *dat)                                //现实64*64图片
{
    unsigned char i = 0;
    unsigned char j = 0;

    for(i = 0;i < 8;i++)
    {
        for(j = 0;j < 64;j++)
        {
            a_buf[pos * 64 + j] = *dat;
            dat++;
        }
    }
}


         
spi_init()                                                                  //spi初始化
{
SPCTL=0x78; //79
SPSTAT = 0xff;
}                                                                                 
void main()
{

spi_init();                                                                  //spi初始化
disp_image_64(1, &aa[0]);                                  //显示图片1
disp_image_64(0, &aas[0]);                                  //显示图片2
while(1)
{
Scan_VFD();                                                         //扫描
}
}
一直不理解是怎么驱动的。不停的扫描吗,跟点阵是不是一个原理。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。