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

📄 lcd_support.c

📁 eCos1.31版
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (X >= width) X = width-1;    curX = X;    if (Y < 0) Y = 0;    if (Y >= height) Y = height-1;    curY = Y;    lcd_drawc(CURSOR_ON, curX, curY);}// Render a character at position (X,Y) with current background/foregroundstatic voidlcd_drawc(cyg_int8 c, int x, int y){    // Note: this only works for fonts which are a multiple of 8 bits wide!    cyg_uint8 *bufptr, bits;    int l, p, w;    switch (lcd_depth) {    case 1:        bufptr = lcd_base + ((y * FONT_HEIGHT * (lcd_width*lcd_depth)) + (x * FONT_WIDTH)) / 8;        for (l = 0;  l < FONT_HEIGHT;  l++) {            *bufptr = font_table[c][l];            bufptr += (lcd_width*lcd_depth)/8;        }        break;    case 2:        diag_printf("Depth 2 not implemented\n");        break;    case 4:        bufptr = lcd_base + ((y * (FONT_HEIGHT*SCREEN_SCALE) * (lcd_width*lcd_depth))                              + (x * (FONT_WIDTH*SCREEN_SCALE) * lcd_depth)) / 8;        for (l = 0;  l < FONT_HEIGHT;  l++) {            for (w = 0;  w < SCREEN_SCALE;  w++) {                bits = font_table[c-FIRST_CHAR][l];                 for (p = 0;  p < 8;  p += PIXELS_PER_BYTE) {                    switch (bits & PIXEL_MASK) {                    case 0:                        *bufptr++ = (bg << 4) | bg;                        break;                    case 1:#if SCREEN_SCALE == 1                        *bufptr++ = (bg << 4) | fg;#else                        *bufptr++ = (fg << 4) | fg;#endif                        break;#if SCREEN_SCALE == 1                    case 2:                        *bufptr++ = (fg << 4) | bg;                        break;                    case 3:                        *bufptr++ = (fg << 4) | fg;                        break;#endif                    }                    bits >>= PIXELS_PER_BYTE;                }                bufptr += (lcd_width*lcd_depth)/8 - (8/PIXELS_PER_BYTE);            }        }        break;    }}// Draw one character at the current positionvoidlcd_putc(cyg_int8 c){    lcd_drawc(CURSOR_OFF, curX, curY);    switch (c) {    case '\r':        curX = 0;        break;    case '\n':        curY++;        break;    case '\b':        curX--;        if (curX < 0) {            curY--;            if (curY < 0) curY = 0;            curX = width-1;        }        break;    default:        lcd_drawc(c, curX, curY);        curX++;        if (curX == width) {            curY++;            curX = 0;        }    }     lcd_drawc(CURSOR_ON, curX, curY);}// Basic LCD 'printf()' support#ifndef FALSE#define FALSE 0#define TRUE  1#endif#include <stdarg.h>#define is_digit(c) ((c >= '0') && (c <= '9'))static int_cvt(unsigned long val, char *buf, long radix, char *digits){    char temp[80];    char *cp = temp;    int length = 0;    if (val == 0) {        /* Special case */        *cp++ = '0';    } else {        while (val) {            *cp++ = digits[val % radix];            val /= radix;        }    }    while (cp != temp) {        *buf++ = *--cp;        length++;    }    *buf = '\0';    return (length);}intlcd_vprintf(void (*putc)(cyg_int8), const char *fmt0, va_list ap){    char c, sign, *cp;    int left_prec, right_prec, zero_fill, length, pad, pad_on_right;    char buf[32];    long val;    while ((c = *fmt0++)) {        cp = buf;        length = 0;        if (c == '%') {            c = *fmt0++;            left_prec = right_prec = pad_on_right = 0;            if (c == '-') {                c = *fmt0++;                pad_on_right++;            }            if (c == '0') {                zero_fill = TRUE;                c = *fmt0++;            } else {                zero_fill = FALSE;            }            while (is_digit(c)) {                left_prec = (left_prec * 10) + (c - '0');                c = *fmt0++;            }            if (c == '.') {                c = *fmt0++;                zero_fill++;                while (is_digit(c)) {                    right_prec = (right_prec * 10) + (c - '0');                    c = *fmt0++;                }            } else {                right_prec = left_prec;            }            sign = '\0';            switch (c) {            case 'd':            case 'x':            case 'X':                val = va_arg(ap, long);                switch (c) {                case 'd':                    if (val < 0) {                        sign = '-';                        val = -val;                    }                    length = _cvt(val, buf, 10, "0123456789");                    break;                case 'x':                    length = _cvt(val, buf, 16, "0123456789abcdef");                    break;                case 'X':                    length = _cvt(val, buf, 16, "0123456789ABCDEF");                    break;                }                break;            case 's':                cp = va_arg(ap, char *);                length = strlen(cp);                break;            case 'c':                c = va_arg(ap, long /*char*/);                (*putc)(c);                continue;            default:                (*putc)('?');            }            pad = left_prec - length;            if (sign != '\0') {                pad--;            }            if (zero_fill) {                c = '0';                if (sign != '\0') {                    (*putc)(sign);                    sign = '\0';                }            } else {                c = ' ';            }            if (!pad_on_right) {                while (pad-- > 0) {                    (*putc)(c);                }            }            if (sign != '\0') {                (*putc)(sign);            }            while (length-- > 0) {                (*putc)(c = *cp++);                if (c == '\n') {                    (*putc)('\r');                }            }            if (pad_on_right) {                while (pad-- > 0) {                    (*putc)(' ');                }            }        } else {            (*putc)(c);            if (c == '\n') {                (*putc)('\r');            }        }    }}intlcd_printf(char const *fmt, ...){	int ret;	va_list ap;	va_start(ap, fmt);	ret = lcd_vprintf(lcd_putc, fmt, ap);	va_end(ap);	return (ret);}

⌨️ 快捷键说明

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