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

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

?? lcd_driver.c

?? The collection of AVR source code in C.
?? C
字號:
//
//  Author(s)...: ATMEL Norway
//
//  Target(s)...: ATmega169
//
//  mt - used for debugging only - may not work

// Include files.
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <avr/signal.h>

#include "lcd_driver.h"

#define BOOL    char
#define FALSE   0
#define TRUE    (!FALSE)

// Variable from "button.c" to prevent button-bouncing
extern unsigned char gButtonTimeout;    

extern BOOL gAutoPressJoystick;

// Used to indicate when the LCD interrupt handler should update the LCD
// mt jw char gLCD_Update_Required = FALSE;
volatile char gLCD_Update_Required = FALSE;

// LCD display buffer (for double buffering).
char LCD_Data[LCD_REGISTER_COUNT];

// Buffer that contains the text to be displayed
// Note: Bit 7 indicates that this character is flashing
char gTextBuffer[TEXTBUFFER_SIZE];

// Only six letters can be shown on the LCD.
// With the gScroll and gScrollMode variables,
// one can select which part of the buffer to show
volatile signed char gScroll;
volatile char gScrollMode;

////Start-up delay before scrolling a string over the LCD
char gLCD_Start_Scroll_Timer = 0;

// The gFlashTimer is used to determine the on/off
// timing of flashing characters
char gFlashTimer = 0;

// Turns on/off the colons on the LCD
char gColon = 0;


// Look-up table used when converting ASCII to
// LCD display data (segment control)
// mt __flash unsigned int LCD_character_table[] =
unsigned int LCD_character_table[] PROGMEM =
{
    0x0A51,     // '*' (?)
    0x2A80,     // '+'
    0x0000,     // ',' (Not defined)
    0x0A00,     // '-'
    0x0A51,     // '.' Degree sign
    0x0000,     // '/' (Not defined)
    0x5559,     // '0'
    0x0118,     // '1'
    0x1e11,     // '2
    0x1b11,     // '3
    0x0b50,     // '4
    0x1b41,     // '5
    0x1f41,     // '6
    0x0111,     // '7
    0x1f51,     // '8
    0x1b51,     // '9'
    0x0000,     // ':' (Not defined)
    0x0000,     // ';' (Not defined)
    0x0000,     // '<' (Not defined)
    0x0000,     // '=' (Not defined)
    0x0000,     // '>' (Not defined)
    0x0000,     // '?' (Not defined)
    0x0000,     // '@' (Not defined)
    0x0f51,     // 'A' (+ 'a')
    0x3991,     // 'B' (+ 'b')
    0x1441,     // 'C' (+ 'c')
    0x3191,     // 'D' (+ 'd')
    0x1e41,     // 'E' (+ 'e')
    0x0e41,     // 'F' (+ 'f')
    0x1d41,     // 'G' (+ 'g')
    0x0f50,     // 'H' (+ 'h')
    0x2080,     // 'I' (+ 'i')
    0x1510,     // 'J' (+ 'j')
    0x8648,     // 'K' (+ 'k')
    0x1440,     // 'L' (+ 'l')
    0x0578,     // 'M' (+ 'm')
    0x8570,     // 'N' (+ 'n')
    0x1551,     // 'O' (+ 'o')
    0x0e51,     // 'P' (+ 'p')
    0x9551,     // 'Q' (+ 'q')
    0x8e51,     // 'R' (+ 'r')
    0x9021,     // 'S' (+ 's')
    0x2081,     // 'T' (+ 't')
    0x1550,     // 'U' (+ 'u')
    0x4448,     // 'V' (+ 'v')
    0xc550,     // 'W' (+ 'w')
    0xc028,     // 'X' (+ 'x')
    0x2028,     // 'Y' (+ 'y')
    0x5009,     // 'Z' (+ 'z')
    0x0000,     // '[' (Not defined)
    0x0000,     // '\' (Not defined)
    0x0000,     // ']' (Not defined)
    0x0000,     // '^' (Not defined)
    0x0000      // '_'
};


/*****************************************************************************
*
*   Function name : LCD_Init
*
*   Returns :       None
*
*   Parameters :    None
*
*   Purpose :       Initialize LCD_displayData buffer.
*                   Set up the LCD (timing, contrast, etc.)
*
*****************************************************************************/
void LCD_Init (void)
{
    LCD_AllSegments(FALSE);                     // Clear segment buffer.

    LCD_CONTRAST_LEVEL(LCD_INITIAL_CONTRAST);    //Set the LCD contrast level

    // Select asynchronous clock source, enable all COM pins and enable all
    // segment pins.
    LCDCRB = (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0);

    // Set LCD prescaler to give a framerate of 32,0 Hz
    LCDFRR = (0<<LCDPS0) | (7<<LCDCD0);    

    LCDCRA = (1<<LCDEN) | (1<<LCDAB);           // Enable LCD and set low power waveform

    //Enable LCD start of frame interrupt
    LCDCRA |= (1<<LCDIE);

    gLCD_Update_Required = FALSE;


}


/*****************************************************************************
*
*   Function name : LCD_WriteDigit(char c, char digit)
*
*   Returns :       None
*
*   Parameters :    Inputs
*                   c: The symbol to be displayed in a LCD digit
*                   digit: In which digit (0-5) the symbol should be displayed
*                   Note: Digit 0 is the first used digit on the LCD,
*                   i.e LCD digit 2
*
*   Purpose :       Stores LCD control data in the LCD_displayData buffer.
*                   (The LCD_displayData is latched in the LCD_SOF interrupt.)
*
*****************************************************************************/
void LCD_WriteDigit(char c, char digit)
{

    unsigned int seg = 0x0000;                  // Holds the segment pattern
    char mask, nibble;
    char *ptr;
    char i;


    if (digit > 5)                              // Skip if digit is illegal
        return;

    //Lookup character table for segmet data
    if ((c >= '*') && (c <= 'z'))
    {
        // c is a letter
        if (c >= 'a')                           // Convert to upper case
            c &= ~0x20;                         // if necessarry

        c -= '*';

		//mt seg = LCD_character_table[c];
		seg = (unsigned int) pgm_read_word(&LCD_character_table[(uint8_t)c]); 
	}

    // Adjust mask according to LCD segment mapping
    if (digit & 0x01)
        mask = 0x0F;                // Digit 1, 3, 5
    else
        mask = 0xF0;                // Digit 0, 2, 4

    ptr = LCD_Data + (digit >> 1);  // digit = {0,0,1,1,2,2}

    for (i = 0; i < 4; i++)
    {
        nibble = seg & 0x000F;
        seg >>= 4;
        if (digit & 0x01)
            nibble <<= 4;
        *ptr = (*ptr & mask) | nibble;
        ptr += 5;
    }
}



/*****************************************************************************
*
*   Function name : LCD_AllSegments(unsigned char input)
*
*   Returns :       None
*
*   Parameters :    show -  [TRUE;FALSE]
*
*   Purpose :       shows or hide all all LCD segments on the LCD
*
*****************************************************************************/
void LCD_AllSegments(char show)
{
    unsigned char i;

    if (show)
        show = 0xFF;

    // Set/clear all bits in all LCD registers
    for (i=0; i < LCD_REGISTER_COUNT; i++)
        *(LCD_Data + i) = show;
}


/*****************************************************************************
*
*   LCD Interrupt Routine
*
*   Returns :       None
*
*   Parameters :    None
*
*   Purpose: Latch the LCD_displayData and Set LCD_status.updateComplete
*
*****************************************************************************/

SIGNAL(SIG_LCD)
{
    static char LCD_timer = LCD_TIMER_SEED;
    char c;
    char c_flash;
    char flash;

    char EOL;
    unsigned char i;

///!!!    static char timeout_count;
///!!!    static char auto_joystick_count;
	
	c_flash=0; // mt
    
/**************** Button timeout for the button.c, START ****************/
/*!!!    if(!gButtonTimeout)
    {
        timeout_count++;
        
        if(timeout_count > 3)
        {
            gButtonTimeout = TRUE;
            timeout_count = 0;
        }
    }
*/
/**************** Button timeout for the button.c, END ******************/

/**************** Auto press joystick for the main.c, START *************/

/*!!!    if(gAutoPressJoystick == AUTO)
    {
        auto_joystick_count++;
        
        if(auto_joystick_count > 16)
        {
            gAutoPressJoystick = TRUE;
            auto_joystick_count = 15;
        }
    }
    else
        auto_joystick_count = 0;
*/

/**************** Auto press joystick for the main.c, END ***************/    

    LCD_timer--;                    // Decreased every LCD frame

    if (gScrollMode)
    {
        // If we are in scroll mode, and the timer has expired,
        // we will update the LCD
        if (LCD_timer == 0)
        {
            if (gLCD_Start_Scroll_Timer == 0)
            {
                gLCD_Update_Required = TRUE;
            }
            else
                gLCD_Start_Scroll_Timer--;
        }
    }
    else    
    {   // if not scrolling,
        // disble LCD start of frame interrupt
//        cbi(LCDCRA, LCDIE);   //DEBUG
        gScroll = 0;
    }


    EOL = FALSE;
    if (gLCD_Update_Required == TRUE)
    {
        // Duty cycle of flashing characters
        if (gFlashTimer < (LCD_FLASH_SEED >> 1))
            flash = 0;
        else
            flash = 1;

        // Repeat for the six LCD characters
        for (i = 0; i < 6; i++)
        {
            if ((gScroll+i) >= 0 && (!EOL))
            {
                // We have some visible characters
                c = gTextBuffer[i + gScroll];
                c_flash = c & 0x80 ? 1 : 0;
                c = c & 0x7F;

                if (c == '\0')
                    EOL = i+1;      // End of character data
            }
            else
                c = ' ';

            // Check if this character is flashing

            if (c_flash && flash)
                LCD_WriteDigit(' ', i);
            else
                LCD_WriteDigit(c, i);
        }

        // Copy the segment buffer to the real segments
        for (i = 0; i < LCD_REGISTER_COUNT; i++)
            *(pLCDREG + i) = *(LCD_Data+i);

        // Handle colon
        if (gColon)
            *(pLCDREG + 8) = 0x01;
        else
            *(pLCDREG + 8) = 0x00;

        // If the text scrolled off the display,
        // we have to start over again.
        if (EOL == 1)
            gScroll = -6;
        else
            gScroll++;

        // No need to update anymore
        gLCD_Update_Required = FALSE;
    }


    // LCD_timer is used when scrolling text
    if (LCD_timer == 0)
    {
/*        if ((gScroll <= 0) || EOL)
            LCD_timer = LCD_TIMER_SEED/2;
        else*/
            LCD_timer = LCD_TIMER_SEED;
    }

    // gFlashTimer is used when flashing characters
    if (gFlashTimer == LCD_FLASH_SEED)
        gFlashTimer= 0;
    else
        gFlashTimer++;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色爱综合网| 91国偷自产一区二区开放时间| 在线亚洲免费视频| 久久尤物电影视频在线观看| 一区二区三区四区精品在线视频| 国产夫妻精品视频| 欧美一区二区三区播放老司机| 亚洲人成亚洲人成在线观看图片| 经典三级一区二区| 911精品产国品一二三产区| 最新国产精品久久精品| 国产一区二区电影| 日韩美女一区二区三区| 亚洲va欧美va人人爽午夜| 91香蕉视频污| 国产精品亲子乱子伦xxxx裸| 国产在线日韩欧美| 欧美一二三区在线| 午夜电影一区二区| 在线一区二区三区四区| 国产精品久久久久影视| 国产电影精品久久禁18| 精品国产三级a在线观看| 日韩精品一二三区| 欧美日韩一区二区在线视频| 亚洲美女免费视频| 99国产欧美久久久精品| 乱一区二区av| 不卡电影一区二区三区| 日本一区二区三区电影| 国产风韵犹存在线视精品| 久久久久久麻豆| 加勒比av一区二区| 欧美成人官网二区| 老司机免费视频一区二区| 日韩欧美亚洲另类制服综合在线| 视频一区视频二区在线观看| 欧美理论在线播放| 香蕉成人伊视频在线观看| 欧美一a一片一级一片| 亚洲一区在线播放| 欧美色综合久久| 亚洲丶国产丶欧美一区二区三区| 欧美在线影院一区二区| 亚洲一区二区三区小说| 欧美日韩久久不卡| 视频一区中文字幕| 欧美xxxxxxxx| 国产精品乡下勾搭老头1| 亚洲国产成人一区二区三区| 成人蜜臀av电影| 中文字幕人成不卡一区| 91免费国产在线| 亚洲一二三四久久| 欧美高清视频一二三区| 麻豆国产欧美日韩综合精品二区| 精品欧美黑人一区二区三区| 国产一区二区0| 国产精品污污网站在线观看| 色偷偷久久人人79超碰人人澡| 一区二区三区在线看| 欧美日韩国产一级二级| 日韩中文字幕1| 亚洲精品在线免费播放| 成人禁用看黄a在线| 亚洲美女在线一区| 日韩一区二区精品在线观看| 国产一区二区在线影院| 国产精品久久二区二区| 欧美亚洲高清一区二区三区不卡| 日韩黄色在线观看| 久久久久久久性| 91网站在线播放| 亚洲电影中文字幕在线观看| 欧美大胆人体bbbb| 成人黄色免费短视频| 亚洲第一福利一区| 精品1区2区在线观看| 97超碰欧美中文字幕| 三级在线观看一区二区| 2020国产精品自拍| av高清久久久| 午夜精品久久久久影视| 久久免费看少妇高潮| 色网综合在线观看| 91精品国产综合久久久蜜臀粉嫩 | 一区二区免费看| 91精品国产一区二区三区| 国产精品综合久久| 亚洲综合一区二区精品导航| 精品久久国产97色综合| 色综合久久中文综合久久97| 麻豆精品视频在线| 亚洲色图视频免费播放| 日韩一区二区高清| 99久久精品久久久久久清纯| 人人爽香蕉精品| 亚洲视频一区二区在线| 日韩美一区二区三区| 色美美综合视频| 九九九精品视频| 亚洲国产成人高清精品| 国产精品嫩草99a| 欧美精品丝袜中出| zzijzzij亚洲日本少妇熟睡| 日本大胆欧美人术艺术动态| 欧美激情一区二区三区在线| 在线不卡a资源高清| av在线播放一区二区三区| 久久99久久99精品免视看婷婷| 一区二区日韩电影| 国产人成一区二区三区影院| 91精品国产综合久久久久久久久久| 97精品久久久久中文字幕| 国产综合色精品一区二区三区| 午夜久久久久久| 自拍偷拍国产亚洲| 国产清纯在线一区二区www| 日韩欧美一二三| 欧美日韩三级一区二区| 91网上在线视频| 福利一区二区在线观看| 伦理电影国产精品| 日精品一区二区三区| 亚洲免费观看视频| 亚洲国产成人私人影院tom | 色哟哟一区二区在线观看| 高清免费成人av| 精品在线你懂的| 蜜臀久久久久久久| 午夜影院在线观看欧美| 亚洲精品乱码久久久久久黑人| 国产欧美日本一区二区三区| 精品国产髙清在线看国产毛片| 欧美日韩一区中文字幕| 欧美综合视频在线观看| 91女厕偷拍女厕偷拍高清| 成人网在线免费视频| 国产河南妇女毛片精品久久久| 久草精品在线观看| 免费在线看成人av| 视频一区欧美精品| 亚洲成av人片在线观看无码| 一区二区国产盗摄色噜噜| 一区二区三区中文在线| 亚洲天堂免费看| 最新热久久免费视频| 自拍偷拍欧美精品| 亚洲裸体xxx| 亚洲精品欧美激情| 亚洲乱码国产乱码精品精可以看| 亚洲手机成人高清视频| 亚洲女厕所小便bbb| 亚洲女女做受ⅹxx高潮| 一区二区三区四区高清精品免费观看| 亚洲精品日韩一| 亚洲精品va在线观看| 一区二区三区国产| 亚洲午夜久久久久| 亚洲妇熟xx妇色黄| 天天综合色天天综合| 首页国产欧美久久| 久久99热99| 国产激情视频一区二区三区欧美| 国内不卡的二区三区中文字幕| 国产乱码精品一区二区三区忘忧草 | 免费在线观看日韩欧美| 麻豆精品在线播放| 国产综合色产在线精品| 国产精品一区二区三区网站| 国产电影一区在线| 99久久er热在这里只有精品66| 色综合视频在线观看| 91传媒视频在线播放| 欧美精品1区2区| 亚洲精品在线观看网站| 中文字幕免费一区| 亚洲欧美日本韩国| 亚洲午夜在线电影| 琪琪一区二区三区| 国产精品主播直播| 99精品国产99久久久久久白柏 | 国产大陆亚洲精品国产| 成人app软件下载大全免费| 日本道色综合久久| 欧美另类变人与禽xxxxx| 精品播放一区二区| 国产精品国产三级国产| 亚洲一区二区三区中文字幕| 青青草国产成人99久久| 国产成人8x视频一区二区| av亚洲精华国产精华| 欧美蜜桃一区二区三区| 精品国产一二三区| 亚洲欧美区自拍先锋| 免费三级欧美电影| 成人av资源站| 欧美精品在欧美一区二区少妇 | 欧美日韩欧美一区二区| 精品国产乱码久久|