?? ks0108_8c-source.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Procyon AVRlib: ks0108.c Source File</title><link href="dox.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.6 --><div class="qindex"><a class="qindex" href="main.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a></div><h1>ks0108.c</h1><a href="ks0108_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*! \file ks0108.c \brief Graphic LCD driver for HD61202/KS0108 displays. */</span>00002 <span class="comment">//*****************************************************************************</span>00003 <span class="comment">//</span>00004 <span class="comment">// File Name : 'ks0108.c'</span>00005 <span class="comment">// Title : Graphic LCD driver for HD61202/KS0108 displays</span>00006 <span class="comment">// Author : Pascal Stang - Copyright (C) 2001-2003</span>00007 <span class="comment">// Date : 10/19/2002</span>00008 <span class="comment">// Revised : 5/5/2003</span>00009 <span class="comment">// Version : 0.5</span>00010 <span class="comment">// Target MCU : Atmel AVR</span>00011 <span class="comment">// Editor Tabs : 4</span>00012 <span class="comment">//</span>00013 <span class="comment">// NOTE: This code is currently below version 1.0, and therefore is considered</span>00014 <span class="comment">// to be lacking in some functionality or documentation, or may not be fully</span>00015 <span class="comment">// tested. Nonetheless, you can expect most functions to work.</span>00016 <span class="comment">//</span>00017 <span class="comment">// This code is distributed under the GNU Public License</span>00018 <span class="comment">// which can be found at http://www.gnu.org/licenses/gpl.txt</span>00019 <span class="comment">//</span>00020 <span class="comment">//*****************************************************************************</span>00021 00022 <span class="preprocessor">#ifndef WIN32</span>00023 <span class="preprocessor"></span><span class="comment">// AVR specific includes</span>00024 <span class="preprocessor"> #include <avr/io.h></span>00025 <span class="preprocessor"> #include <avr/interrupt.h></span>00026 <span class="preprocessor">#endif</span>00027 <span class="preprocessor"></span>00028 <span class="preprocessor">#include "<a class="code" href="global_8h.html">global.h</a>"</span>00029 <span class="preprocessor">#include "<a class="code" href="ks0108_8h.html">ks0108.h</a>"</span>00030 00031 <span class="comment">// global variables</span>00032 GrLcdStateType GrLcdState;00033 00034 <span class="comment">/*************************************************************/</span>00035 <span class="comment">/********************** LOCAL FUNCTIONS **********************/</span>00036 <span class="comment">/*************************************************************/</span>00037 00038 <span class="keywordtype">void</span> glcdInitHW(<span class="keywordtype">void</span>)00039 {00040 <span class="comment">// initialize I/O ports</span>00041 <span class="comment">// if I/O interface is in use</span>00042 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00043 <span class="preprocessor"></span>00044 <span class="comment">//TODO: make setup of chip select lines contingent on how</span>00045 <span class="comment">// many controllers are actually in the display</span>00046 00047 <span class="comment">// initialize LCD control lines levels</span>00048 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00049 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00050 cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00051 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0);00052 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1);00053 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2);00054 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3);00055 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RESET);00056 <span class="comment">// initialize LCD control port to output</span>00057 sbi(GLCD_CTRL_DDR, GLCD_CTRL_RS);00058 sbi(GLCD_CTRL_DDR, GLCD_CTRL_RW);00059 sbi(GLCD_CTRL_DDR, GLCD_CTRL_E);00060 sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS0);00061 sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS1);00062 sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS2);00063 sbi(GLCD_CTRL_DDR, GLCD_CTRL_CS3);00064 sbi(GLCD_CTRL_DDR, GLCD_CTRL_RESET);00065 <span class="comment">// initialize LCD data</span>00066 outp(0x00, GLCD_DATA_PORT);00067 <span class="comment">// initialize LCD data port to output</span>00068 outp(0xFF, GLCD_DATA_DDR);00069 <span class="preprocessor">#endif</span>00070 <span class="preprocessor"></span>}00071 00072 <span class="keywordtype">void</span> glcdControllerSelect(u08 controller)00073 {00074 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00075 <span class="preprocessor"></span> <span class="comment">//TODO: make control of chip select lines contingent on how</span>00076 <span class="comment">// many controllers are actually in the display</span>00077 00078 <span class="comment">// unselect all controllers</span>00079 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0);00080 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1);00081 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2);00082 cbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3);00083 00084 <span class="comment">// select requested controller</span>00085 <span class="keywordflow">switch</span>(controller)00086 {00087 <span class="keywordflow">case</span> 0: sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS0); <span class="keywordflow">break</span>;00088 <span class="keywordflow">case</span> 1: sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS1); <span class="keywordflow">break</span>;00089 <span class="keywordflow">case</span> 2: sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS2); <span class="keywordflow">break</span>;00090 <span class="keywordflow">case</span> 3: sbi(GLCD_CTRL_PORT, GLCD_CTRL_CS3); <span class="keywordflow">break</span>;00091 <span class="keywordflow">default</span>: <span class="keywordflow">break</span>;00092 }00093 <span class="preprocessor">#endif</span>00094 <span class="preprocessor"></span>}00095 00096 <span class="keywordtype">void</span> glcdBusyWait(u08 controller)00097 {00098 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00099 <span class="preprocessor"></span> cli();00100 <span class="comment">// wait until LCD busy bit goes to zero</span>00101 <span class="comment">// select the controller chip</span>00102 glcdControllerSelect(controller);00103 <span class="comment">// do a read from control register</span>00104 outp(0xFF, GLCD_DATA_PORT);00105 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00106 outp(0x00, GLCD_DATA_DDR);00107 sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00108 sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00109 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00110 <span class="keywordflow">while</span>(inp(GLCD_DATA_PIN) & GLCD_STATUS_BUSY)00111 {00112 cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00113 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00114 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00115 sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00116 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00117 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00118 }00119 cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00120 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00121 outp(0xFF, GLCD_DATA_DDR);00122 sei();00123 <span class="preprocessor">#else</span>00124 <span class="preprocessor"></span> <span class="comment">// sbi(MCUCR, SRW); // enable RAM waitstate</span>00125 <span class="comment">// wait until LCD busy bit goes to zero</span>00126 <span class="keywordflow">while</span>(*(<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)00127 (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) & GLCD_STATUS_BUSY);00128 <span class="comment">// cbi(MCUCR, SRW); // disable RAM waitstate</span>00129 <span class="preprocessor">#endif</span>00130 <span class="preprocessor"></span>}00131 00132 <span class="keywordtype">void</span> glcdControlWrite(u08 controller, u08 data)00133 {00134 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00135 <span class="preprocessor"></span> cli();00136 glcdBusyWait(controller); <span class="comment">// wait until LCD not busy</span>00137 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00138 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00139 sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00140 outp(0xFF, GLCD_DATA_DDR);00141 outp(data, GLCD_DATA_PORT);00142 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00143 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00144 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00145 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00146 cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00147 sei();00148 <span class="preprocessor">#else</span>00149 <span class="preprocessor"></span> <span class="comment">//sbi(MCUCR, SRW); // enable RAM waitstate</span>00150 glcdBusyWait(controller); <span class="comment">// wait until LCD not busy</span>00151 *(<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) = data;00152 <span class="comment">//cbi(MCUCR, SRW); // disable RAM waitstate</span>00153 <span class="preprocessor">#endif</span>00154 <span class="preprocessor"></span>}00155 00156 u08 glcdControlRead(u08 controller)00157 {00158 <span class="keyword">register</span> u08 data;00159 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00160 <span class="preprocessor"></span> cli();00161 glcdBusyWait(controller); <span class="comment">// wait until LCD not busy</span>00162 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00163 outp(0x00, GLCD_DATA_DDR);00164 sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00165 sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00166 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00167 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00168 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00169 <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>); <span class="keyword">asm</span> <span class="keyword">volatile</span> (<span class="stringliteral">"nop"</span>);00170 data = inp(GLCD_DATA_PIN);00171 cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00172 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00173 outp(0xFF, GLCD_DATA_DDR);00174 sei();00175 <span class="preprocessor">#else</span>00176 <span class="preprocessor"></span> <span class="comment">//sbi(MCUCR, SRW); // enable RAM waitstate</span>00177 glcdBusyWait(controller); <span class="comment">// wait until LCD not busy</span>00178 data = *(<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller);00179 <span class="comment">//cbi(MCUCR, SRW); // disable RAM waitstate</span>00180 <span class="preprocessor">#endif</span>00181 <span class="preprocessor"></span> <span class="keywordflow">return</span> data;00182 }00183 00184 <span class="keywordtype">void</span> glcdDataWrite(u08 data)00185 {00186 <span class="keyword">register</span> u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS);00187 <span class="preprocessor">#ifdef GLCD_PORT_INTERFACE</span>00188 <span class="preprocessor"></span> cli();00189 glcdBusyWait(controller); <span class="comment">// wait until LCD not busy</span>00190 sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00191 cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -