亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pcd8544.c

?? Nokia 6110 LCD 驅動 Atmega8
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 *
 * Name         :  pcd8544.c
 *
 * Description  :  This is a driver for the PCD8544 graphic LCD.
 *                 Based on the code written by Sylvain Bissonette 
 *                 This driver is buffered in 504 bytes memory be sure
 *                 that your MCU having bigger memory
 *
 * Author       :  Fandi Gunawan <fandigunawan@gmail.com>
 * Website      :  http://fandigunawan.wordpress.com
 *
 * Credit       :  Sylvain Bissonette (2003) 
 *
 * License      :  GPL v. 3
 *
 * Compiler     :  WinAVR, GCC for AVR platform 
 *                 Tested version :
 *                 - 20070525 (avr-libc 1.4)
 *                 - 20071221 (avr-libc 1.6)
 *                 - other version please contact me if you find out it is working
 * Compiler note:  Please be aware of using older/newer version since WinAVR 
 *                 is under extensive development. Please compile with parameter -O1 
 *
 * History      :
 * Version 0.2.5 (December 25, 2008) x-mas version :)
 * + Boundary check is added (reported by starlino on Dec 20, 2008)
 * + Return value is added, it will definitely useful for error checking
 * Version 0.2.4 (March 5, 2008)
 * + Multiplier was added to LcdBars to scale the bars
 * Version 0.2.3 (February 29, 2008)
 * + Rolled back LcdFStr function because of serious bug
 * + Stable release
 * Version 0.2.2 (February 27, 2008)
 * + Optimizing LcdFStr function
 * Version 0.2.1 (January 2, 2008)
 * + Clean up codes
 * + All settings were migrated to pcd8544.h
 * + Using _BV() instead of << to make a better readable code 
 * Version 0.2 (December 11-14, 2007)
 * + Bug fixed in LcdLine() and LcdStr()
 * + Adding new routine 
 *    - LcdFStr()
 *    - LcdSingleBar()
 *    - LcdBars()
 *    - LcdRect()
 *    - LcdImage()
 * + PROGMEM used instead of using.data section
 * Version 0.1 (December 3, 2007)
 * + First stable driver
 *
 * Note         :
 * Font will be displayed this way (16x6)
 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4
 * 2
 * 3
 * 4
 * 5
 * 6
 */

#include <stdio.h>
#include <avr/io.h>
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include "pcd8544.h"

/* Function prototypes */

static void LcdSend    ( byte data, LcdCmdData cd );
static void Delay      ( void );

/* Global variables */

/* Cache buffer in SRAM 84*48 bits or 504 bytes */
static byte  LcdCache [ LCD_CACHE_SIZE ];

/* Cache index */
static int   LcdCacheIdx;

/* Lower part of water mark */
static int   LoWaterMark;

/* Higher part of water mark */
static int   HiWaterMark;

/* Variable to decide whether update Lcd Cache is active/nonactive */
static bool  UpdateLcd;

/*
 * Name         :  LcdInit
 * Description  :  Performs MCU SPI & LCD controller initialization.
 * Argument(s)  :  None.
 * Return value :  None.
 */
void LcdInit ( void )
{
    /* Pull-up on reset pin. */
    LCD_PORT |= _BV ( LCD_RST_PIN );

    /* Set output bits on LCD Port. */
    LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( LCD_CE_PIN ) | _BV( SPI_MOSI_PIN ) | _BV( SPI_CLK_PIN );

    Delay();

    /* Toggle display reset pin. */
    LCD_PORT &= ~( _BV( LCD_RST_PIN ) );
    Delay();
    LCD_PORT |= _BV ( LCD_RST_PIN );

    /* Enable SPI port: 
    * No interrupt, MSBit first, Master mode, CPOL->0, CPHA->0, Clk/4
    */
    SPCR = 0x50;

    /* Disable LCD controller */
    LCD_PORT |= _BV( LCD_CE_PIN );

    LcdSend( 0x21, LCD_CMD ); /* LCD Extended Commands. */
    LcdSend( 0xC8, LCD_CMD ); /* Set LCD Vop (Contrast).*/
    LcdSend( 0x06, LCD_CMD ); /* Set Temp coefficent. */
    LcdSend( 0x13, LCD_CMD ); /* LCD bias mode 1:48. */
    LcdSend( 0x20, LCD_CMD ); /* LCD Standard Commands,Horizontal addressing mode */
    LcdSend( 0x0C, LCD_CMD ); /* LCD in normal mode. */

    /* Reset watermark pointers to empty */
    LoWaterMark = LCD_CACHE_SIZE;
    HiWaterMark = 0;

    /* Clear display on first time use */
    LcdClear();
    LcdUpdate();
}

/*
 * Name         :  LcdContrast
 * Description  :  Set display contrast.
 * Argument(s)  :  contrast -> Contrast value from 0x00 to 0x7F.
 * Return value :  None.
 */
void LcdContrast ( byte contrast )
{
    /* LCD Extended Commands. */
    LcdSend( 0x21, LCD_CMD );

    /* Set LCD contrast level. */
    LcdSend( 0x80 | contrast, LCD_CMD );

    /* LCD Standard Commands, horizontal addressing mode. */
    LcdSend( 0x20, LCD_CMD );
}

/*
 * Name         :  LcdClear
 * Description  :  Clears the display. LcdUpdate must be called next.
 * Argument(s)  :  None.
 * Return value :  None.
 * Note         :  Based on Sylvain Bissonette's code
 */
void LcdClear ( void )
{
    int i;
    
    /* Set 0x00 to all LcdCache's contents */
    for ( i = 0; i < LCD_CACHE_SIZE; i++ )
    {
        LcdCache[ i ] = 0x00;
    }

    /* Reset watermark pointers to full */
    LoWaterMark = 0;
    HiWaterMark = LCD_CACHE_SIZE - 1;
    
    /* Set update flag to be true */
    UpdateLcd = TRUE;
}

/*
 * Name         :  LcdGotoXYFont
 * Description  :  Sets cursor location to xy location corresponding to basic 
 *                 font size.
 * Argument(s)  :  x, y -> Coordinate for new cursor position. Range: 1,1 .. 14,6
 * Return value :  see return value in pcd8544.h
 * Note         :  Based on Sylvain Bissonette's code
 */
byte LcdGotoXYFont ( byte x, byte y )
{
    /* Boundary check, slow down the speed but will guarantee this code wont fail */
    /* Version 0.2.5 - Fixed on Dec 25, 2008 (XMAS) */
    if( x > 14)
        return OUT_OF_BORDER;
    if( y > 6)
        return OUT_OF_BORDER;
    /*  Calculate index. It is defined as address within 504 bytes memory */
    
    LcdCacheIdx = ( x - 1 ) * 6 + ( y - 1 ) * 84;
    return OK;
}

/*
 * Name         :  LcdChr
 * Description  :  Displays a character at current cursor location and 
 *                 increment cursor location.
 * Argument(s)  :  size -> Font size. See enum in pcd8544.h.
 *                 ch   -> Character to write.
 * Return value :  see pcd8544.h about return value
 */
byte LcdChr ( LcdFontSize size, byte ch )
{
    byte i, c;
    byte b1, b2;
    int  tmpIdx;

    if ( LcdCacheIdx < LoWaterMark )
    {
        /* Update low marker. */
        LoWaterMark = LcdCacheIdx;
    }

    if ( (ch < 0x20) || (ch > 0x7b) )
    {
        /* Convert to a printable character. */
        ch = 92;
    }

    if ( size == FONT_1X )
    {
        for ( i = 0; i < 5; i++ )
        {
            /* Copy lookup table from Flash ROM to LcdCache */
            LcdCache[LcdCacheIdx++] = pgm_read_byte(&( FontLookup[ ch - 32 ][ i ] ) ) << 1;
        }
    }
    else if ( size == FONT_2X )
    {
        tmpIdx = LcdCacheIdx - 84;

        if ( tmpIdx < LoWaterMark )
        {
            LoWaterMark = tmpIdx;
        }
        
        if ( tmpIdx < 0 ) return OUT_OF_BORDER;

        for ( i = 0; i < 5; i++ )
        {
            /* Copy lookup table from Flash ROM to temporary c */
            c = pgm_read_byte(&(FontLookup[ch - 32][i])) << 1;
            /* Enlarge image */
            /* First part */
            b1 =  (c & 0x01) * 3;
            b1 |= (c & 0x02) * 6;
            b1 |= (c & 0x04) * 12;
            b1 |= (c & 0x08) * 24;

            c >>= 4;
            /* Second part */
            b2 =  (c & 0x01) * 3;
            b2 |= (c & 0x02) * 6;
            b2 |= (c & 0x04) * 12;
            b2 |= (c & 0x08) * 24;
            
            /* Copy two parts into LcdCache */
            LcdCache[tmpIdx++] = b1;
            LcdCache[tmpIdx++] = b1;
            LcdCache[tmpIdx + 82] = b2;
            LcdCache[tmpIdx + 83] = b2;
        }

        /* Update x cursor position. */
        /* Version 0.2.5 - Possible bug fixed on Dec 25,2008 */
        LcdCacheIdx = (LcdCacheIdx + 11) % LCD_CACHE_SIZE;
    }

    if ( LcdCacheIdx > HiWaterMark )
    {
        /* Update high marker. */
        HiWaterMark = LcdCacheIdx;
    }

    /* Horizontal gap between characters. */
    /* Version 0.2.5 - Possible bug fixed on Dec 25,2008 */
    LcdCache[LcdCacheIdx] = 0x00;
    /* At index number LCD_CACHE_SIZE - 1, wrap to 0 */
    if(LcdCacheIdx == (LCD_CACHE_SIZE - 1) )
    {
        LcdCacheIdx = 0;
        return OK_WITH_WRAP;
    }
    /* Otherwise just increment the index */
    LcdCacheIdx++;
    return OK;
}

/*
 * Name         :  LcdStr
 * Description  :  Displays a character at current cursor location and increment 
 *                 cursor location according to font size. This function is 
 *                 dedicated to print string laid in SRAM
 * Argument(s)  :  size      -> Font size. See enum.
 *                 dataArray -> Array contained string of char to be written 
 *                              into cache.
 * Return value :  see return value on pcd8544.h
 */
byte LcdStr ( LcdFontSize size, byte dataArray[] )
{
    byte tmpIdx=0;
    byte response;
    while( dataArray[ tmpIdx ] != '\0' )
	{
        /* Send char */
		response = LcdChr( size, dataArray[ tmpIdx ] );
        /* Just in case OUT_OF_BORDER occured */
        /* Dont worry if the signal == OK_WITH_WRAP, the string will 
        be wrapped to starting point */
        if( response == OUT_OF_BORDER)
            return OUT_OF_BORDER;
        /* Increase index */
		tmpIdx++;
	}
    return OK;
}

/*
 * Name         :  LcdFStr
 * Description  :  Displays a characters at current cursor location and increment
 *                 cursor location according to font size. This function is 
 *                 dedicated to print string laid in Flash ROM
 * Argument(s)  :  size    -> Font size. See enum.
 *                 dataPtr -> Pointer contained string of char to be written 
 *                            into cache.
 * Return value :  see return value on pcd8544.h
 * Example      :  LcdFStr(FONT_1X, PSTR("Hello World"));
 *                 LcdFStr(FONT_1X, &name_of_string_as_array);
 */
byte LcdFStr ( LcdFontSize size, const byte *dataPtr )
{
    byte c;
    byte response;
    for ( c = pgm_read_byte( dataPtr ); c; ++dataPtr, c = pgm_read_byte( dataPtr ) )
    {
        /* Put char */
        response = LcdChr( size, c );
        if(response == OUT_OF_BORDER)
            return OUT_OF_BORDER;
    }

}

/*
 * Name         :  LcdPixel
 * Description  :  Displays a pixel at given absolute (x, y) location.
 * Argument(s)  :  x, y -> Absolute pixel coordinates
 *                 mode -> Off, On or Xor. See enum in pcd8544.h.
 * Return value :  see return value on pcd8544.h
 * Note         :  Based on Sylvain Bissonette's code
 */
byte LcdPixel ( byte x, byte y, LcdPixelMode mode )
{
    word  index;
    byte  offset;
    byte  data;
    
    /* Prevent from getting out of border */
    if ( x > LCD_X_RES ) return OUT_OF_BORDER;
    if ( y > LCD_Y_RES ) return OUT_OF_BORDER;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男同1069视频| 色哟哟在线观看一区二区三区| 亚洲一线二线三线久久久| 国产精品污www在线观看| 国产日韩欧美在线一区| 国产三级精品在线| 中文字幕乱码亚洲精品一区| 国产精品久久久久久久久久久免费看 | 久久精品999| 极品尤物av久久免费看| 国产伦理精品不卡| 成人午夜激情影院| 一本大道久久a久久精二百| 在线视频你懂得一区| 欧美日韩国产系列| 欧美大白屁股肥臀xxxxxx| 欧美电视剧免费全集观看| 久久婷婷国产综合精品青草| 国产精品欧美经典| 亚洲图片欧美一区| 激情成人午夜视频| av成人免费在线观看| 精品婷婷伊人一区三区三| 日韩一区二区三区视频| 欧美极品aⅴ影院| 亚洲一区在线播放| 国产中文字幕一区| 色综合 综合色| 亚洲精品一区二区三区蜜桃下载 | 亚洲国产精品一区二区久久恐怖片 | 日本特黄久久久高潮| 91在线精品一区二区| 99久久国产免费看| 亚洲美女淫视频| 中文字幕中文乱码欧美一区二区| 蜜臀久久99精品久久久画质超高清| 国产清纯白嫩初高生在线观看91| 欧美日韩在线综合| 欧美亚洲综合一区| 久久精品国产网站| 亚洲一区二区精品视频| 天天做天天摸天天爽国产一区| 国内精品免费在线观看| 日本道精品一区二区三区| 精品日韩一区二区| 亚洲二区视频在线| 99国产精品99久久久久久| 欧美电影免费观看高清完整版在线观看 | 91精品福利视频| 久久精品亚洲精品国产欧美| 午夜av一区二区三区| 久久久久99精品一区| 亚洲一区二三区| 99精品国产热久久91蜜凸| 国产欧美日韩在线| 久久99久国产精品黄毛片色诱| 欧美在线免费观看视频| 日本一区二区不卡视频| 紧缚奴在线一区二区三区| 日韩一区二区三区免费看| **网站欧美大片在线观看| 国产精品77777| 日韩精品中文字幕在线不卡尤物| 午夜精品久久久久久| 色先锋资源久久综合| 国产精品久久久久影院老司| 春色校园综合激情亚洲| 国产亚洲污的网站| 国产一区二区精品久久99| 欧美大黄免费观看| 麻豆免费看一区二区三区| 欧美高清激情brazzers| 日韩在线卡一卡二| 欧美一级免费大片| 九九精品视频在线看| 日韩免费一区二区| 国产中文一区二区三区| 久久精品一区二区三区四区| 国产精品羞羞答答xxdd| 国产婷婷色一区二区三区四区 | 国产精品卡一卡二卡三| 成人欧美一区二区三区黑人麻豆 | 欧美男人的天堂一二区| 亚洲欧洲另类国产综合| 成人国产视频在线观看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 成人精品小蝌蚪| 欧洲一区在线观看| 亚洲综合在线观看视频| 欧美成人官网二区| 男男gaygay亚洲| 日本一区二区三区dvd视频在线| 亚洲尤物视频在线| 日韩成人dvd| 日韩免费性生活视频播放| 日韩电影在线一区| 成人免费视频免费观看| 日韩久久久精品| 韩国精品免费视频| 日韩美女一区二区三区四区| 免费在线看一区| 欧美精品一区二区蜜臀亚洲| 国产91丝袜在线播放| 亚洲人吸女人奶水| 欧美日韩黄色一区二区| 久久精品国产一区二区| 国产精品久久网站| 欧美人狂配大交3d怪物一区| 久久国产精品99久久久久久老狼| 久久久久久97三级| 精品国产免费一区二区三区四区| 国产精品资源在线观看| 亚洲激情中文1区| 欧美激情一区在线| 不卡电影一区二区三区| 国产不卡视频在线观看| 欧美日韩日日夜夜| 国产成人av在线影院| 日韩在线a电影| 国产精品久久久久影院色老大| 91精品国产全国免费观看| 成人午夜在线播放| 婷婷久久综合九色国产成人| 中文字幕av一区二区三区| 欧美日韩午夜在线| hitomi一区二区三区精品| 蜜桃传媒麻豆第一区在线观看| 一色屋精品亚洲香蕉网站| 日韩你懂的在线观看| 欧美三区在线观看| 成人白浆超碰人人人人| 国内成人精品2018免费看| 亚洲午夜激情网站| 国产精品美女久久久久久久久 | 久久狠狠亚洲综合| 亚洲男同性恋视频| 国产精品美女久久福利网站| 精品久久久久久无| 欧美日韩另类一区| 色综合久久久久久久久久久| 国产成人av网站| 久久97超碰色| 美国毛片一区二区三区| 日本aⅴ免费视频一区二区三区 | 日韩欧美国产一区在线观看| 色婷婷综合久久| 91小视频在线| 成人激情综合网站| 国产不卡视频在线播放| 国产综合久久久久久久久久久久| 日本成人在线一区| 韩国视频一区二区| 国产精品91一区二区| 亚洲精品高清在线| 一区二区三区四区在线免费观看 | 成人av中文字幕| 狠狠色丁香婷婷综合久久片| 91精品国产aⅴ一区二区| 韩国午夜理伦三级不卡影院| 免费成人深夜小野草| 久久综合久色欧美综合狠狠| av中文字幕不卡| 高清国产一区二区三区| 亚洲一区二区视频在线| 中文字幕av免费专区久久| 91精品国产乱| 风间由美性色一区二区三区| 国内精品国产成人国产三级粉色 | 欧美日韩国产另类不卡| 国产成人福利片| 日韩电影在线免费观看| 一级女性全黄久久生活片免费| 亚洲成人av福利| 日韩一级黄色片| 久久精品视频免费| 自拍偷拍欧美精品| 亚洲一区在线电影| 麻豆91在线看| 欧美亚洲综合在线| 亚洲精品成人精品456| 亚洲你懂的在线视频| 中文字幕精品—区二区四季| 成人欧美一区二区三区白人| 亚洲成人免费观看| 精品制服美女久久| 99免费精品在线| 欧美日韩和欧美的一区二区| 久久久亚洲综合| 亚洲免费在线观看视频| 日韩精品高清不卡| 国内久久精品视频| 在线观看免费一区| 久久久.com| 亚洲风情在线资源站| 国产高清在线精品| 欧美日本一区二区三区| 亚洲国产电影在线观看| 日韩电影一二三区| 99精品视频一区二区三区| 日韩亚洲电影在线|