⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ks0108_8c-source.html

📁 avr应用测试程序
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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.4.2 --><div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div><h1>ks0108.c</h1><a href="ks0108_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">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 &lt;avr/io.h&gt;</span>00025 <span class="preprocessor">    #include &lt;avr/interrupt.h&gt;</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     outb(GLCD_DATA_PORT, 0x00);00067     <span class="comment">// initialize LCD data port to output</span>00068     outb(GLCD_DATA_DDR, 0xFF);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     outb(GLCD_DATA_PORT, 0xFF);00105     cbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);00106     outb(GLCD_DATA_DDR, 0x00);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>(inb(GLCD_DATA_PIN) &amp; 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     outb(GLCD_DATA_DDR, 0xFF);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) &amp; 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     outb(GLCD_DATA_DDR, 0xFF);00141     outb(GLCD_DATA_PORT, data);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     outb(GLCD_DATA_DDR, 0x00);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 = inb(GLCD_DATA_PIN);00171     cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);00172     cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);00173     outb(GLCD_DATA_DDR, 0xFF);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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -