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

📄 lcd.c

📁 ucOS 在单片机上实现
💻 C
📖 第 1 页 / 共 2 页
字号:
    LCD_DIG_4 = 0x00;
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                               TURN ON ALL THE SEGMENTS TO TEST THE LCD
*********************************************************************************************************
*/

void  LCD_DispTest (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    OS_ENTER_CRITICAL();
    LCD_DIG_1 = 0xFF;
    LCD_DIG_2 = 0xFF;
    LCD_DIG_3 = 0xFF;
    LCD_DIG_4 = 0xFF;
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                               DISPLAY AN ASCII STRING USING 7-SEGMENTS
*********************************************************************************************************
*/

void  LCD_DispStr (INT8U dig, char *s)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    switch (dig) {
        case 1:
             OS_ENTER_CRITICAL();
             LCD_DIG_1 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the colon segment */
             LCD_DIG_2 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the DP2   segment */
             LCD_DIG_3 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the DP3   segment */
             LCD_DIG_4 = LCD_ASCIItoSegTbl[*s   - 0x20];              /* Display the ASCII character with the DP4   segment */
             OS_EXIT_CRITICAL();
             break;

        case 2:
             OS_ENTER_CRITICAL();
             LCD_DIG_2 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the DP2   segment */
             LCD_DIG_3 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the DP3   segment */
             LCD_DIG_4 = LCD_ASCIItoSegTbl[*s   - 0x20];              /* Display the ASCII character with the DP4   segment */
             OS_EXIT_CRITICAL();
             break;

        case 3:
             OS_ENTER_CRITICAL();
             LCD_DIG_3 = LCD_ASCIItoSegTbl[*s++ - 0x20];              /* Display the ASCII character with the DP3   segment */
             LCD_DIG_4 = LCD_ASCIItoSegTbl[*s   - 0x20];              /* Display the ASCII character with the DP4   segment */
             OS_EXIT_CRITICAL();
             break;

        case 4:
             OS_ENTER_CRITICAL();
             LCD_DIG_4 = LCD_ASCIItoSegTbl[*s   - 0x20];              /* Display the ASCII character with the DP4   segment */
             OS_EXIT_CRITICAL();
             break;
    }
}

/*
*********************************************************************************************************
*                                   DISPLAY A 16-bit UNSIGNED VALUE
*********************************************************************************************************
*/

void  LCD_DispINT16U (INT16U val)
{
    INT8U      digit;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    if (val > 9999) {                                                 /* Make sure value fits in 4 digits                   */
        val = 9999;
    }
    OS_ENTER_CRITICAL();
    digit     = (INT8U)(val / 1000);                                  /* Look up ASCII value for thousands digit            */
    LCD_DIG_1 = LCD_ASCIItoSegTbl[digit + '0' - ' '];

    val       = val % 1000;
    digit     = (INT8U)(val / 100);                                   /* Look up ASCII value for hundreds  digit            */
    LCD_DIG_2 = LCD_ASCIItoSegTbl[digit + '0' - ' '];

    val       = val % 100;
    digit     = (INT8U)(val / 10);                                    /* Look up ASCII value for tens      digit            */
    LCD_DIG_3 = LCD_ASCIItoSegTbl[digit + '0' - ' '];

    val       = val % 10;
    digit     = (INT8U)val;                                           /* Look up ASCII value for units     digit            */
    LCD_DIG_4 = LCD_ASCIItoSegTbl[digit + '0' - ' '];
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                            DISPLAY A 16-bit UNSIGNED VALUE AS HEXADECIMAL
*********************************************************************************************************
*/

void  LCD_DispINT16UHex (INT16U val)
{
    INT8U      digit;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    OS_ENTER_CRITICAL();
    digit     = (INT8U)((val & 0xF000) >> 12);                        /* Look up ASCII value for MS Hex Digit               */
    if (digit < 10) {
        LCD_DIG_1 = LCD_ASCIItoSegTbl[digit + '0' - ' '];
    } else {
        LCD_DIG_1 = LCD_ASCIItoSegTbl[digit - 10 + 'A' - ' '];
    }

    digit     = (INT8U)((val & 0x0F00) >> 8);                         /* Look up ASCII value for next MS digit              */
    if (digit < 10) {
        LCD_DIG_2 = LCD_ASCIItoSegTbl[digit + '0' - ' '];
    } else {
        LCD_DIG_2 = LCD_ASCIItoSegTbl[digit - 10 + 'A' - ' '];
    }

    digit     = (INT8U)((val & 0x00F0) >> 4);                         /* Look up ASCII value for next MS digit              */
    if (digit < 10) {
        LCD_DIG_3 = LCD_ASCIItoSegTbl[digit + '0' - ' '];
    } else {
        LCD_DIG_3 = LCD_ASCIItoSegTbl[digit - 10 + 'A' - ' '];
    }

    digit     = (INT8U)(val & 0x000F);                                /* Look up ASCII value for LS digit                   */
    if (digit < 10) {
        LCD_DIG_4 = LCD_ASCIItoSegTbl[digit + '0' - ' '];
    } else {
        LCD_DIG_4 = LCD_ASCIItoSegTbl[digit - 10 + 'A' - ' '];
    }
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                                            CLEAR ICON
*
* Description: This function is called to turn OFF a single icon (Decimal Point, Colon, UP/DOWN arrow)
* Arguments  : icon   is the ID number of the icon to turn OFF
* Returns    : none
*********************************************************************************************************
*/

void  LCD_DispIconClr (INT8U icon)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    switch (icon) {
        case 1:
             OS_ENTER_CRITICAL();
             LCD_DIG_1 &= 0x7F;
             OS_EXIT_CRITICAL();
             break;

        case 2:
             OS_ENTER_CRITICAL();
             LCD_DIG_2 &= 0x7F;
             OS_EXIT_CRITICAL();
             break;

        case 3:
             OS_ENTER_CRITICAL();
             LCD_DIG_3 &= 0x7F;
             OS_EXIT_CRITICAL();
             break;

        case 4:
             OS_ENTER_CRITICAL();
             LCD_DIG_4 &= 0x7F;
             OS_EXIT_CRITICAL();
             break;
    }
}

/*
*********************************************************************************************************
*                                            SET ICON
*
* Description: This function is called to turn ON a single icon (Decimal Point, Colon, UP/DOWN arrow)
* Arguments  : icon   is the ID number of the icon to turn ON
* Returns    : none
*********************************************************************************************************
*/

void  LCD_DispIconSet (INT8U icon)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif


    switch (icon) {
        case 1:
             OS_ENTER_CRITICAL();
             LCD_DIG_1 |= 0x80;
             OS_EXIT_CRITICAL();
             break;

        case 2:
             OS_ENTER_CRITICAL();
             LCD_DIG_2 |= 0x80;
             OS_EXIT_CRITICAL();
             break;

        case 3:
             OS_ENTER_CRITICAL();
             LCD_DIG_3 |= 0x80;
             OS_EXIT_CRITICAL();
             break;

        case 4:
             OS_ENTER_CRITICAL();
             LCD_DIG_4 |= 0x80;
             OS_EXIT_CRITICAL();
             break;
    }
}

⌨️ 快捷键说明

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