紧急求助,TM1640驱动共阳数码管谁懂?

2019-07-15 09:15发布

哪位大神帮忙看一下,共阳数码管能正常显示吗
#include<reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define writedatamode_z  0x40   // 采用自动地址加一方式写显示缓存
#define writedatamode_g  0x44   //采用地址固定模式写缓存
#define readkeymode  0x42       //  键盘扫描模式
#define    startdata  0xc0         //起始地址
#define display   0x8a          //开启显示 亮度用后三位决定
#define closedis   0x80         //关显示

sbit SCLK=P0^0;
sbit DIO =P0^1;
uchar code num[]={
        0xFC,/*0*/
        0x60,/*1*/
        0xDA,/*2*/
        0xF2,/*3*/
        0x66,/*4*/
        0xB6,/*5*/
        0xBE,/*6*/
        0xE0,/*7*/
        0xFE,/*8*/
        0xF6,/*9*/
        0xEE,/*A*/
        0x3E,/*b*/
        0x9C,/*C*/
        0x7A,/*d*/
        0x9E,/*E*/
        0x8E,/*F*/
};  
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
    for(j=100;j>0;j--);
}//延时

void start()                   //开始条件
{
  SCLK=1;
    DIO=1;
    DIO=0;
    SCLK=0;        
}

void send_data(uchar x)          //送数据    低位先传
{
    uchar  i;
    for(i=0;i<8;i++)
    {
        SCLK=0;
        DIO=(bit)(x&0x01);
        SCLK=1;
        x>>=1;
    }
    SCLK=0;
}
void stop()                     //结束条件
{
    SCLK=0;
    DIO=0;
    SCLK=1;
    DIO=1;
}

uchar SEG[16];
void Display1(void)
{
    unsigned char i,j,k,temp[16];
    for(i=0; i<16; i++)
    {
        k = i / 8;
        for(j=0; j<8; j++)
        {
            temp[j+k*8] |= ((SEG[i] & (0x80>>j))>>(7-j))<<(i%8);
        }
    }
    start();
    send_data(startdata);               //起始地址
    for(i=0;i<16;i++)                    //送16位数
    {
        send_data(temp[i]);
    }
    stop();
}
void Display2(void)
{
    unsigned char i,j,k,temp[16];
    for(i=0; i<16; i++)
    {
        k = i / 8;
        for(j=0; j<8; j++)
        {
            if(SEG[i]&(0x80>>j))
               temp[j+k*8] |= 1<<(i%8);
        }
    }
    start();
    send_data(startdata);               //起始地址
    for(i=0;i<16;i++)                    //送16位数
    {
        send_data(temp[i]);
    }
    stop();
}
void main(void)
{
    unsigned char i;


    start();
    send_data(closedis);              //关显示
    stop();

    start();
    send_data(writedatamode_z);              //自动地址
    stop();

    start();
    send_data(display);              //开显示
    stop();

    for (i=0; i<16; i++)
        SEG[i] = num[i];
                //SEG[i] = 1<<7;

    Display1();       //两种转置方式
    //Display2();

    while(1)
    {
        ;
    }
}   

0条回答

一周热门 更多>