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

📄 s7lstklcd.c

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 C
字号:
/* ---------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support
 * ----------------------------------------------------------------------------
 * Copyright (c 2006, Atmel Corporation

 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaiimer below.
 * 
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the disclaimer below in the documentation and/or
 * other materials provided with the distribution. 
 * 
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission. 
 * 
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//-----------------------------------------------------------------------------
//         Headers
//-----------------------------------------------------------------------------

#include "s7lstklcd.h"
#include "font.h"
#include <board.h>
#include <utility/assert.h>
#include <utility/trace.h>

//-----------------------------------------------------------------------------
//         Global functions
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/// Switches a pixel on the SLCD on or off.
/// \param x  X-coordinate of pixel.
/// \param y  Y-coordinate of pixel.
/// \param set  If 1, pixel is displayed; otherwise it is hidden.
//-----------------------------------------------------------------------------
void S7LSTKLCD_Pixel(unsigned char x, unsigned char y, unsigned char set)
{
    unsigned int symbol = y * S7LSTKLCD_WIDTH + x;
    unsigned int common  = symbol / S7LSTKLCD_NUM_SEGMENTS;
    unsigned int segment = symbol % S7LSTKLCD_NUM_SEGMENTS;
    unsigned int reg = segment / 32;
    unsigned int bit = segment % 32;

    SANITY_CHECK(x < S7LSTKLCD_WIDTH);
    SANITY_CHECK(y < S7LSTKLCD_HEIGHT);

    if (set) {

        AT91C_BASE_SLCDC->SLCDC_MEM[common * 2 + reg] |=  (1 << bit);
    }
    else {

        AT91C_BASE_SLCDC->SLCDC_MEM[common * 2 + reg] &= ~(1 << bit);
    }
}

//-----------------------------------------------------------------------------
/// Displays a character at the given position on the SLCD. The character is
/// clipped according to the SLCD dimensions.
/// Note that x and y can be negative (upper-left part of character will be
/// clipped).
/// \param x  X-coordinate of upper-left corner of character.
/// \param y  Y-coordinate of upper-left corner of character.
/// \param c  Character to display.
//-----------------------------------------------------------------------------
void S7LSTKLCD_Char(signed int x, signed int y, unsigned char c)
{
    const unsigned char *pChar;
    signed int i, j;

    SANITY_CHECK(c >= gFont.firstCharacter);
    SANITY_CHECK(c <= gFont.lastCharacter);

    // Optimization: return if coordinates are out of bounds
    if ((x > S7LSTKLCD_WIDTH) || ((x+gFont.width) < 0)
        || (y > S7LSTKLCD_HEIGHT) || ((y+gFont.height) < 0)) {

        return;
    }

    // Get pointer to character in font data
    pChar = &(gFont.pData[(c - gFont.firstCharacter) * gFont.height]);

    // Display character at requested location
    for (j=0; j < gFont.height; j++) {
        for (i=0; i < gFont.width; i++) {

            if (((x+i) >= 0) && ((x+i) < S7LSTKLCD_WIDTH)
                && ((y+i >= 0)) && ((y+i) < S7LSTKLCD_HEIGHT)) {

                S7LSTKLCD_Pixel(x+i, y+j, (pChar[j] & (1 << (FONT_CHAR_MAX_WIDTH-i-1))));
            }
        }
    }
}

//-----------------------------------------------------------------------------
/// Displays a string on the SLCD given the top-left corner coordinates. String
/// is clipped according to the SLCD dimensions.
/// X and Y can be negative (top-left clipping).
/// \param x  X-coordinate of top-left corner.
/// \param y  Y-coordinate of top-left corner.
/// \param pString  String to display.
//-----------------------------------------------------------------------------
void S7LSTKLCD_String(signed int x, signed int y, const char *pString)
{
    signed int j;
    while (*pString != 0) {
    
        // Display character
        S7LSTKLCD_Char(x, y, *pString);
        x += gFont.width + 1;
        pString++;

        // Vertical blank line
        if ((*pString != 0) && ((x-1) < S7LSTKLCD_WIDTH) && ((x-1) > 0)) {

            for (j=0; j < gFont.height; j++) {

                if (((j+y) >= 0) && ((j+y) < S7LSTKLCD_HEIGHT)) {

                    S7LSTKLCD_Pixel(x-1, y+j, 0);
                }
            }
        }
    }
}

//-----------------------------------------------------------------------------
/// Returns the height and width in pixels of the given string.
/// \param pString  String to examinate.
/// \param pWidth  Width of string in pixels.
/// \param pHeight  Height of string in pixels.
//-----------------------------------------------------------------------------
void S7LSTKLCD_GetStringSize(
    const char *pString,
    signed int *pWidth,
    signed int *pHeight)
{
    unsigned int size = 0;

    // Get string size
    while (*pString != 0) {

        size++;
        pString++;
    }

    // Return size in pixel
    if (pWidth) {
        
        *pWidth = size * (gFont.width + 1) - 1;
    }
    if (pHeight) {

        *pHeight = gFont.height;
    }
}

//-----------------------------------------------------------------------------
/// Displays the given string on the SLCD, centered along the X and Y axis
/// (this may result in the string being clipped).
/// \param pString  String to display.
//-----------------------------------------------------------------------------
void S7LSTKLCD_PutString(const char *pString)
{
    signed int width, height;
    SANITY_CHECK(pString);

    S7LSTKLCD_GetStringSize(pString, &width, &height);
    S7LSTKLCD_String((S7LSTKLCD_WIDTH - width) / 2, (S7LSTKLCD_HEIGHT - height) / 2, pString);
}

⌨️ 快捷键说明

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