⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 用mc9s12dg128实现电子时钟
💻 C
📖 第 1 页 / 共 2 页
字号:
    0x0A,                              /* 'r'                                                          */
    0xB6,                              /* 's', Actually displayed as 'S'                               */
    0x1E,                              /* 't'                                                          */
    0x38,                              /* 'u'                                                          */
    0x00,                              /* 'v', No seven-segment conversion                             */
    0x00,                              /* 'w', No seven-segment conversion                             */
    0x00,                              /* 'x', No seven-segment conversion                             */
    0x76,                              /* 'y', Actually displayed as 'Y'                               */
    0x00                               /* 'z', No seven-segment conversion                             */
};

/*$PAGE*/
/*
*********************************************************************************************************
*                             HEXADECIMAL to SEVEN-SEGMENT conversion table
*                                                             a
*                                                           ------
*                                                        f |      | b
*                                                          |  g   |
* Note: The segments are mapped as follows:                 ------
*                                                        e |      | c
*        a    b    c    d    e    f    g                   |  d   |
*        --   --   --   --   --   --   --   --              ------
*        B7   B6   B5   B4   B3   B2   B1   B0
*********************************************************************************************************
*/

const INT8U DispHexToSegTbl[] = {     
    0xC0,                            
    0xF9,                            
    0xA4,                            
    0xB0,                            
    0x99,                            
    0x92,                            
    0x82,                            
    0xF8,                            
    0x80,                            
    0x90,                            
    0x88,                             
    0x83,                             
    0xC6,                             
    0xA1,                             
    0x86,                             
    0x8E,
    0xFF                              
};


void  DispClrScr (void)
{
    INT8U i;

    for (i = 0; i < DISP_N_DIG; i++) {           /* Clear the screen by turning OFF all segments       */
        MCCTL_MCZI=0;
        DispSegTbl[i] = 0x00;
        MCCTL_MCZI=1;
    }
}


void  DispInit (void)
{
    DispInitPort();                    /* Initialize I/O ports used in display driver                  */
    DispDigMsk   = 0x01;
    DispSegTblIx = 0;
    //DispClrScr();                      /* Clear the Display                                            */
}


#pragma CODE_SEG NON_BANKED
void interrupt DispMuxHandler (void)
{
                                                 /* Insert code to CLEAR INTERRUPT SOURCE here         */
    MCFLG_MCZF=1;                                /*Clear modulus counter interrupt flag*/
    //PORTB=~PORTB;
    //DispOutSeg (~0XAA);
    //DispOutSeg(0x00);                            /* Turn OFF segments while changing digits            */
    DispOutDig(DispDigMsk);                      /* Select next digit to display                       */
    DispOutSeg(DispSegTbl[DispSegTblIx]);        /* Output digit's seven-segment pattern               */
    if (DispSegTblIx == (DISP_N_DIG - 1)) {      /* Adjust index to next seven-segment pattern         */
        DispSegTblIx =    0;                     /* Index into first segments pattern                  */
        DispDigMsk   = 0x01;                     /* 0x80 will select the first seven-segment digit     */
     } else {
        DispSegTblIx++;
        DispDigMsk <<= 1;                        /* Select next digit                                  */
     }
}
#pragma CODE_SEG DEFAULT
void  DispInitPort (void)
{
    //DDRB=0XFF;
    //DDRK=0X3F;
    //PORTB=0X0F;
    DispOutSeg(0xFF);              /* Turn OFF segments                                       */
    DispOutDig(0xFF);              /* Turn OFF digits                                         */
}



void  DispOutDig (INT8U msk)
{
    PORTK = ~msk;//DISP_PORT_DIG = msk;
}



void  DispOutSeg (INT8U seg)
{
    PORTB = seg;//DISP_PORT_SEG = seg;
}




void  DispStatClr (INT8U dig, INT8U bit)
{
    MCCTL_MCZI=0;
    DispSegTbl[dig] &= ~(1 << bit);
    MCCTL_MCZI=1;
}


/*
*********************************************************************************************************
*                                           SET STATUS SEGMENT
*
* Description: This function is called to turn ON a single segment on the display.
* Arguments  : dig   is the position of the digit where the segment appears (0..DISP_N_DIG-1)
*              bit   is the segment bit to turn ON (0..7)
* Returns    : none
*********************************************************************************************************
*/

void  DispStatSet (INT8U dig, INT8U bit)
{
    MCCTL_MCZI=0;
    DispSegTbl[dig] |= 1 << bit;
    MCCTL_MCZI=1;
}



void  DispStr (INT8U dig, char *s)
{
    INT8U stat;
    
    while (*s && dig < DISP_N_SS) {
        MCCTL_MCZI=0;
        stat   = DispSegTbl[dig] & 0x01;                  /* Save state of B0 (i.e. status) */
        DispSegTbl[dig++] = DispASCIItoSegTbl[*s++ - 0x20] | stat;
        MCCTL_MCZI=1;
    }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -