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

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

?? ks0108.c

?? ATMEL的AVR單片機庫文件
?? C
字號:
/*! \file ks0108.c \brief Graphic LCD driver for HD61202/KS0108 displays. */
//*****************************************************************************
//
// File Name	: 'ks0108.c'
// Title		: Graphic LCD driver for HD61202/KS0108 displays
// Author		: Pascal Stang - Copyright (C) 2001-2003
// Date			: 10/19/2002
// Revised		: 5/5/2003
// Version		: 0.5
// Target MCU	: Atmel AVR
// Editor Tabs	: 4
//
// NOTE: This code is currently below version 1.0, and therefore is considered
// to be lacking in some functionality or documentation, or may not be fully
// tested.  Nonetheless, you can expect most functions to work.
//
// This code is distributed under the GNU Public License
//		which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#ifndef WIN32
// AVR specific includes
	#include <avr/io.h>
	#include <avr/interrupt.h>
#endif

#include "global.h"
#include "ks0108.h"

// global variables
GrLcdStateType GrLcdState;

/*************************************************************/
/********************** LOCAL FUNCTIONS **********************/
/*************************************************************/

void glcdInitHW(void)
{
	// initialize I/O ports
	// if I/O interface is in use
#ifdef GLCD_PORT_INTERFACE

	//TODO: make setup of chip select lines contingent on how
	// many controllers are actually in the display
	
	// initialize LCD control lines levels
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RESET);
	// initialize LCD control port to output
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_RS);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_E);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS0);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS1);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS2);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS3);
	sbi(GLCD_CTRL_DDR, GLCD_CTRL_RESET);
	// initialize LCD data
	outp(0x00, GLCD_DATA_PORT);
	// initialize LCD data port to output
	outp(0xFF, GLCD_DATA_DDR);
#endif
}

void glcdControllerSelect(u08 controller)
{
#ifdef GLCD_PORT_INTERFACE
	//TODO: make control of chip select lines contingent on how
	// many controllers are actually in the display

	// unselect all controllers
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3);

	// select requested controller
	switch(controller)
	{
	case 0:	sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0); break;
	case 1:	sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1); break;
	case 2:	sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2); break;
	case 3:	sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3); break;
	default: break;
	}
#endif
}

void glcdBusyWait(u08 controller)
{
#ifdef GLCD_PORT_INTERFACE
	cli();
	// wait until LCD busy bit goes to zero
	// select the controller chip
	glcdControllerSelect(controller);
	// do a read from control register
	outp(0xFF, GLCD_DATA_PORT);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	outp(0x00, GLCD_DATA_DDR);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	asm volatile ("nop"); asm volatile ("nop");
	while(inp(GLCD_DATA_PIN) & GLCD_STATUS_BUSY)
	{
		cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
		asm volatile ("nop"); asm volatile ("nop");
		asm volatile ("nop"); asm volatile ("nop");
		sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
		asm volatile ("nop"); asm volatile ("nop");
		asm volatile ("nop"); asm volatile ("nop");
	}
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	outp(0xFF, GLCD_DATA_DDR);
	sei();
#else
	// sbi(MCUCR, SRW);			// enable RAM waitstate
	// wait until LCD busy bit goes to zero
	while(*(volatile unsigned char *)
		(GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) & GLCD_STATUS_BUSY);
	// cbi(MCUCR, SRW);			// disable RAM waitstate
#endif
}

void glcdControlWrite(u08 controller, u08 data)
{
#ifdef GLCD_PORT_INTERFACE
	cli();
	glcdBusyWait(controller);	// wait until LCD not busy
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	outp(0xFF, GLCD_DATA_DDR);
	outp(data, GLCD_DATA_PORT);
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	sei();
#else
	//sbi(MCUCR, SRW);				// enable RAM waitstate
	glcdBusyWait(controller);		// wait until LCD not busy
	*(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) = data;
	//cbi(MCUCR, SRW);				// disable RAM waitstate
#endif
}

u08 glcdControlRead(u08 controller)
{
	register u08 data;
#ifdef GLCD_PORT_INTERFACE
	cli();
	glcdBusyWait(controller);		// wait until LCD not busy
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	outp(0x00, GLCD_DATA_DDR);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	data = inp(GLCD_DATA_PIN);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	outp(0xFF, GLCD_DATA_DDR);
	sei();
#else
	//sbi(MCUCR, SRW);				// enable RAM waitstate
	glcdBusyWait(controller);		// wait until LCD not busy
	data = *(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller);
	//cbi(MCUCR, SRW);				// disable RAM waitstate
#endif
	return data;
}

void glcdDataWrite(u08 data)
{
	register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS);
#ifdef GLCD_PORT_INTERFACE
	cli();
	glcdBusyWait(controller);		// wait until LCD not busy
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	outp(0xFF, GLCD_DATA_DDR);
	outp(data, GLCD_DATA_PORT);
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	sei();
#else
	//sbi(MCUCR, SRW);				// enable RAM waitstate
	glcdBusyWait(controller);		// wait until LCD not busy
	*(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) = data;
	//cbi(MCUCR, SRW);				// disable RAM waitstate
#endif
	// increment our local address counter
	GrLcdState.ctrlr[controller].xAddr++;
	GrLcdState.lcdXAddr++;
	if(GrLcdState.lcdXAddr >= GLCD_XPIXELS)
	{
		GrLcdState.lcdYAddr++;
		glcdSetYAddress(GrLcdState.lcdYAddr);
		glcdSetXAddress(0);
	}
}

u08 glcdDataRead(void)
{
	register u08 data;
	register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS);
#ifdef GLCD_PORT_INTERFACE
	cli();
	glcdBusyWait(controller);		// wait until LCD not busy
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
	outp(0x00, GLCD_DATA_DDR);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	asm volatile ("nop"); asm volatile ("nop");
	data = inp(GLCD_DATA_PIN);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
	cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
	sei();
#else
	//sbi(MCUCR, SRW);				// enable RAM waitstate
	glcdBusyWait(controller);		// wait until LCD not busy
	data = *(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller);
	//cbi(MCUCR, SRW);				// disable RAM waitstate
#endif
	// increment our local address counter
	GrLcdState.ctrlr[controller].xAddr++;
	GrLcdState.lcdXAddr++;
	if(GrLcdState.lcdXAddr >= GLCD_XPIXELS)
	{
		GrLcdState.lcdYAddr++;
		glcdSetYAddress(GrLcdState.lcdYAddr);
		glcdSetXAddress(0);
	}
	return data;
}

void glcdReset(u08 resetState)
{
	// reset lcd if argument is true
	// run lcd if argument is false
#ifdef GLCD_PORT_INTERFACE
	if(resetState)
		cbi(GLCD_CTRL_PORT, GLCD_CTRL_RESET);
	else
		sbi(GLCD_CTRL_PORT, GLCD_CTRL_RESET);
#endif
}

void glcdSetXAddress(u08 xAddr)
{
	u08 i;
	// record address change locally
	GrLcdState.lcdXAddr = xAddr;
	
	// clear y (col) address on all controllers
	for(i=0; i<GLCD_NUM_CONTROLLERS; i++)
	{
		glcdControlWrite(i, GLCD_SET_Y_ADDR | 0x00);
		GrLcdState.ctrlr[i].xAddr = 0;
	}

	// set y (col) address on destination controller
	glcdControlWrite((GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS),
		GLCD_SET_Y_ADDR | (GrLcdState.lcdXAddr & 0x3F));
}

void glcdSetYAddress(u08 yAddr)
{
	u08 i;
	// record address change locally
	GrLcdState.lcdYAddr = yAddr;
	// set page address for all controllers
	for(i=0; i<GLCD_NUM_CONTROLLERS; i++)
	{
		glcdControlWrite(i, GLCD_SET_PAGE | yAddr);
	}
}

/*************************************************************/
/********************* PUBLIC FUNCTIONS **********************/
/*************************************************************/

void glcdInit()
{
	u08 i;
	// initialize hardware
	glcdInitHW();
	// bring lcd out of reset
	glcdReset(FALSE);
	// Turn on LCD
	for(i=0; i<GLCD_NUM_CONTROLLERS; i++)
	{
		glcdControlWrite(i, GLCD_ON_CTRL | GLCD_ON_DISPLAY);
	}
	// clear lcd
	glcdClearScreen();
	// initialize positions
	glcdHome();
}

void glcdHome(void)
{
	u08 i;
	// initialize addresses/positions
	glcdStartLine(0);
	glcdSetAddress(0,0);
	// initialize local data structures
	for(i=0; i<GLCD_NUM_CONTROLLERS; i++)
	{
		GrLcdState.ctrlr[i].xAddr = 0;
		GrLcdState.ctrlr[i].yAddr = 0;
	}
}

void glcdClearScreen(void)
{
	u08 pageAddr;
	u08 xAddr;

	// clear LCD
	// loop through all pages
	for(pageAddr=0; pageAddr<(GLCD_YPIXELS>>3); pageAddr++)
	{
		// set page address
		glcdSetAddress(0, pageAddr);
		// clear all lines of this page of display memory
		for(xAddr=0; xAddr<GLCD_XPIXELS; xAddr++)
		{
			glcdDataWrite(0x00);
		}
	}
}

void glcdStartLine(u08 start)
{
	glcdControlWrite(0, GLCD_START_LINE | start);
	glcdControlWrite(1, GLCD_START_LINE | start);
}

void glcdSetAddress(u08 x, u08 yLine)
{
	// set addresses
	glcdSetYAddress(yLine);
	glcdSetXAddress(x);
}

void glcdGotoChar(u08 line, u08 col)
{
	glcdSetAddress(col*6, line);
}

void glcdDelay(u16 p)			// 1-8us      ...2-13us     ...5-31us
{								// 10-60us    ...50-290us
	unsigned int i;				// 100-580us  ...500-2,9ms
	unsigned char j; 			// 1000-5,8ms ...5000-29ms
								// 10000-56ms ...30000-170ms
								// 50000-295ms...60000-345ms
//	for (i = 0; i < p; i++) for (j = 0; j < 10; j++) asm volatile ("nop");
	for (i = 0; i < p; i++) for (j = 0; j < 10; j++);
}


// Higher level functionality has been moved to the API-layer glcd.c/glcd.h

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费观看高清| 精品国产伦一区二区三区免费| 日韩高清欧美激情| 欧美高清在线一区| 欧美日韩高清在线播放| 懂色av一区二区夜夜嗨| 青青草伊人久久| 一区二区欧美在线观看| 中文字幕乱码一区二区免费| 欧美一区二区久久久| 在线免费观看不卡av| 国产成人av一区| 国模无码大尺度一区二区三区 | 中文字幕中文字幕在线一区 | 欧美视频一区在线观看| 成人黄动漫网站免费app| 久久66热偷产精品| 日韩av网站在线观看| 亚洲综合一区二区| 亚洲欧洲成人av每日更新| 久久九九国产精品| 精品国产乱码久久久久久牛牛| 欧美欧美欧美欧美首页| 色呦呦一区二区三区| 99国产精品国产精品毛片| 国产精品66部| 国产精品一区二区免费不卡| 日本v片在线高清不卡在线观看| 亚洲一区二区在线观看视频 | 精品一区二区三区久久| 欧美a级理论片| 奇米精品一区二区三区在线观看一| 亚洲精品欧美在线| 亚洲男人的天堂网| 亚洲欧美日韩久久精品| 自拍偷拍欧美激情| 亚洲欧美日韩在线不卡| 亚洲免费观看高清完整版在线观看| 国产精品视频一二三区| 国产女主播一区| 国产亚洲一区字幕| 国产日韩欧美精品一区| 国产精品高潮呻吟久久| 国产欧美日韩亚州综合| 久久久久久日产精品| 久久精品人人做人人爽97| 久久午夜国产精品| 国产精品三级在线观看| 国产日产精品1区| 国产精品国产三级国产aⅴ中文| 国产精品人妖ts系列视频| 中文字幕精品在线不卡| 亚洲少妇最新在线视频| 亚洲人成网站影音先锋播放| 亚洲一区在线看| 日韩精品欧美精品| 日本亚洲欧美天堂免费| 色综合久久综合网97色综合 | 亚洲一区二区三区在线播放| 亚洲欧美另类小说| 亚洲综合色在线| 日本欧美一区二区| 丰满放荡岳乱妇91ww| 91碰在线视频| 91精品中文字幕一区二区三区| 欧美精品三级日韩久久| 26uuu国产日韩综合| 国产精品福利一区| 日本不卡视频一二三区| 国产91丝袜在线观看| 91福利国产成人精品照片| 91精品国产综合久久香蕉的特点| 精品国产麻豆免费人成网站| 亚洲天堂av一区| 日本视频一区二区| 成人app网站| 欧美日韩国产一级| 国产三级精品三级| 亚洲高清免费视频| 国产精品一区免费在线观看| 色又黄又爽网站www久久| 欧美草草影院在线视频| 亚洲乱码国产乱码精品精小说 | 亚洲成av人片| 国产成人av在线影院| 欧美三片在线视频观看| 久久久精品蜜桃| 日韩中文字幕1| hitomi一区二区三区精品| 4438x成人网最大色成网站| 国产午夜精品一区二区| 亚洲成人先锋电影| av亚洲精华国产精华精华| 欧美一区二区三区免费大片| 一区在线观看视频| 国模冰冰炮一区二区| 欧美日韩精品免费| 中文字幕一区二区日韩精品绯色| 日本在线不卡一区| 在线免费不卡电影| 中文字幕一区免费在线观看| 久久99国产精品麻豆| 久久精品在这里| 午夜视频久久久久久| av成人免费在线观看| 亚洲精品在线免费播放| 香蕉乱码成人久久天堂爱免费| 岛国精品在线播放| 精品国产制服丝袜高跟| 亚洲国产精品久久一线不卡| 99精品视频在线观看| 中文字幕+乱码+中文字幕一区| 日本aⅴ亚洲精品中文乱码| 色综合久久久久综合体| 国产精品国产自产拍在线| 国产一区二区久久| 精品日韩在线一区| 日韩一区精品字幕| 欧美日韩卡一卡二| 亚洲最色的网站| 色94色欧美sute亚洲线路二| 国产精品久久久久久久久果冻传媒| 国产精品资源网站| 久久久久久久性| 国产福利一区二区| 久久女同精品一区二区| 久久av老司机精品网站导航| 欧美一卡2卡三卡4卡5免费| 午夜在线电影亚洲一区| 欧美日韩一区二区欧美激情| 亚洲综合丁香婷婷六月香| 色婷婷香蕉在线一区二区| 亚洲欧美日韩国产综合在线| 99久久精品免费看| 中文字幕亚洲综合久久菠萝蜜| 成人免费毛片高清视频| 国产三级精品在线| 成人黄色av电影| 国产精品福利一区| 97se亚洲国产综合自在线观| 亚洲黄一区二区三区| 欧美性大战久久| 亚洲午夜在线观看视频在线| 9191国产精品| 蜜桃视频第一区免费观看| 久久综合久久综合亚洲| 国产精品99久| 亚洲日本va在线观看| 欧美最猛性xxxxx直播| 亚洲成人av在线电影| 这里只有精品免费| 九色综合国产一区二区三区| 精品不卡在线视频| 岛国一区二区三区| 亚洲永久免费视频| 91精品久久久久久久久99蜜臂| 久久成人久久鬼色| 欧美国产精品一区二区| 日本高清成人免费播放| 日韩av午夜在线观看| 国产性做久久久久久| 91视视频在线观看入口直接观看www| 亚洲愉拍自拍另类高清精品| 欧美一卡二卡三卡| 成人黄色国产精品网站大全在线免费观看| 亚洲色图制服诱惑| 日韩一级免费一区| 成+人+亚洲+综合天堂| 亚洲国产精品久久人人爱蜜臀 | 日韩午夜在线观看| 波多野结衣91| 三级欧美在线一区| 国产日产精品一区| 欧美精选午夜久久久乱码6080| 国产精品综合在线视频| 一区二区免费在线| 久久综合色之久久综合| 欧洲一区在线电影| 麻豆国产一区二区| 自拍偷自拍亚洲精品播放| 欧美tk—视频vk| 在线看一区二区| 国产jizzjizz一区二区| 图片区小说区国产精品视频| 国产欧美精品一区二区三区四区| 欧美日韩中文一区| 成人国产精品免费观看| 视频一区免费在线观看| 国产精品国产三级国产普通话三级| 欧美一区二区免费| 欧洲在线/亚洲| 波多野结衣欧美| 韩国av一区二区三区在线观看| 亚洲一区中文日韩| 国产精品久久久久久久浪潮网站 | 美女高潮久久久| 亚洲一区二区三区自拍| 中文字幕一区二区三区在线播放| 日韩视频在线观看一区二区| 欧美亚洲免费在线一区|