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

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

?? ks0108.c

?? 液晶相關使用程序 我自己的一點小看法 希望能被接受
?? 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一区二区三区免费野_久草精品视频
久久久99久久精品欧美| 亚洲一区成人在线| 亚洲视频一区二区免费在线观看| 一区二区三区国产| 国产成人综合在线| 欧美一区二区三区免费视频| 亚洲精品免费播放| 东方欧美亚洲色图在线| 欧美哺乳videos| 日韩专区中文字幕一区二区| 色av一区二区| 亚洲精品国产无天堂网2021| 成人午夜av在线| 久久久蜜臀国产一区二区| 美女一区二区在线观看| 欧美色涩在线第一页| 综合分类小说区另类春色亚洲小说欧美 | 亚洲国产美女搞黄色| 成人福利视频网站| 日本一区二区三区高清不卡| 激情文学综合插| 欧美精品一区二区在线观看| 青青草国产成人99久久| 911精品国产一区二区在线| 亚洲综合网站在线观看| 在线观看欧美黄色| 亚洲一区二区精品3399| 在线视频你懂得一区| 亚洲欧美日韩电影| 91传媒视频在线播放| 亚洲美女屁股眼交| 欧美日韩另类一区| 视频一区中文字幕国产| 91精品免费在线观看| 久久99久久99| 亚洲国产精品成人综合色在线婷婷| 国产曰批免费观看久久久| 欧美精品一区二区三区在线| 国内久久精品视频| 国产精品天天摸av网| 99久久久精品| 亚洲午夜久久久久久久久电影院| 欧美午夜理伦三级在线观看| 亚洲aⅴ怡春院| 精品福利一二区| va亚洲va日韩不卡在线观看| 尤物在线观看一区| 日韩亚洲欧美成人一区| 国产在线播精品第三| 国产精品成人一区二区艾草 | 丁香六月久久综合狠狠色| 欧美国产乱子伦| 色婷婷综合久色| 日韩av在线免费观看不卡| 欧美电视剧在线看免费| 成人免费看黄yyy456| 一级中文字幕一区二区| 日韩美女视频一区二区在线观看| 69久久99精品久久久久婷婷| 天天av天天翘天天综合网色鬼国产 | 激情综合网av| 中文字幕亚洲一区二区va在线| 在线视频你懂得一区二区三区| 轻轻草成人在线| 中文字幕视频一区二区三区久| 在线观看成人免费视频| 久久99精品久久久久久动态图| 国产精品系列在线| 91精品福利在线一区二区三区| 国产精品一区二区91| 亚洲成a人v欧美综合天堂| 久久综合九色综合欧美就去吻 | 久久美女高清视频| 色天天综合色天天久久| 国产一区二区电影| 天天亚洲美女在线视频| 国产精品少妇自拍| 欧美一区二区三区四区高清| 91小视频免费看| 国产主播一区二区三区| 日韩国产一二三区| 亚洲激情欧美激情| 欧美激情艳妇裸体舞| 91精品国产91久久综合桃花| 色综合久久中文综合久久97| 国产福利一区二区三区视频| 日本大胆欧美人术艺术动态| 亚洲卡通动漫在线| 中文字幕第一区第二区| 久久网这里都是精品| 欧美二区三区91| 欧美在线观看你懂的| 99国产麻豆精品| 国产精品亚洲综合一区在线观看| 日本午夜精品视频在线观看 | 欧美精品日日鲁夜夜添| 91色|porny| 99久久国产综合精品色伊| 国产精品一区在线| 国精产品一区一区三区mba桃花| 午夜视频一区二区| 亚洲 欧美综合在线网络| 亚洲综合小说图片| 一区二区三区中文字幕在线观看| 中文字幕一区三区| 国产精品二区一区二区aⅴ污介绍| 精品三级在线看| 精品国产一区二区国模嫣然| 欧美xxxxx裸体时装秀| 日韩欧美国产wwwww| 欧美成人综合网站| 久久在线观看免费| 久久亚洲综合av| 久久久久久久久久美女| 国产亚洲精久久久久久| 日本一区二区免费在线| 国产精品午夜春色av| 成人欧美一区二区三区白人| 亚洲三级在线免费| 一级女性全黄久久生活片免费| 亚洲亚洲人成综合网络| 丝袜亚洲另类欧美| 经典三级视频一区| 成人在线综合网| 色婷婷综合中文久久一本| 欧美亚洲动漫另类| 91精品国产全国免费观看| 日韩欧美久久一区| 欧美高清在线一区二区| 亚洲视频1区2区| 亚洲第一激情av| 九九精品一区二区| 成人av电影在线播放| 91高清视频在线| 91精品国产综合久久久蜜臀图片| 日韩欧美www| 国产精品色呦呦| 亚洲亚洲精品在线观看| 久久99久久精品欧美| 国产精品亚洲人在线观看| 91视频一区二区| 欧美一区二区在线播放| 国产视频不卡一区| 亚洲高清免费在线| 精品在线观看视频| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美自拍丝袜亚洲| 久久久夜色精品亚洲| 一区二区三区四区蜜桃| 国内国产精品久久| 91福利小视频| 国产色一区二区| 午夜精品视频一区| 99久久久久久| 久久免费美女视频| 亚洲香肠在线观看| 不卡一区二区在线| 日韩免费看网站| 一区二区三区小说| 国产99久久久久久免费看农村| 欧美日韩国产综合一区二区| 国产精品嫩草影院av蜜臀| 美女视频黄 久久| 91免费版在线看| 久久久久久97三级| 美女看a上一区| 91久久精品一区二区| 国产清纯在线一区二区www| 日韩在线一二三区| 一本到不卡精品视频在线观看 | 国产高清不卡一区二区| 欧美一区三区二区| 亚洲国产美女搞黄色| 99视频精品全部免费在线| 精品久久久久香蕉网| 日本女优在线视频一区二区| 色88888久久久久久影院野外| 国产网站一区二区三区| 狂野欧美性猛交blacked| 欧美挠脚心视频网站| 一区二区三区日本| 99re6这里只有精品视频在线观看| 欧美一级爆毛片| 蜜桃视频在线一区| 91精品在线免费| 视频一区欧美日韩| 欧美日韩国产在线播放网站| 自拍偷拍亚洲综合| a级精品国产片在线观看| 日本一区二区三级电影在线观看 | 欧美性xxxxxxxx| 亚洲男人都懂的| 色婷婷国产精品| 亚洲国产美女搞黄色| 欧美日韩视频在线观看一区二区三区 | 欧美私人免费视频| 亚洲国产你懂的| 在线综合亚洲欧美在线视频| 日日噜噜夜夜狠狠视频欧美人| 在线观看国产91|