Testbespiel 1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers C12832.cpp Source File

C12832.cpp

00001 /* mbed library for the mbed Lab Board  128*32 pixel LCD
00002  * use C12832 controller
00003  * Copyright (c) 2012 Peter Drescher - DC2PD
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  *
00006  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00007  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00008  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00009  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00010  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00011  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00012  * THE SOFTWARE.
00013  *
00014  * Library überarbeitet: 15.1.2014 Copyright (c) Dr.C.Eichtinger
00015  * File GraphicDisplay und TextDisplay, sowie small_7 font gestrichen
00016  * C12832.h und C12832.cpp überarbeitet und mit Ziffernfont ergänzt
00017  * Erweiterung: Zeichengröße 1..4
00018  */
00019 
00020 #include "mbed.h"
00021 #include "C12832.h"
00022 #include <stdio.h>
00023 #include "font.h"
00024 
00025 
00026 
00027 C12832::C12832(PinName mosi, PinName sck, PinName reset, PinName a0, PinName ncs)
00028     : _spi(mosi,NC,sck),_reset(reset),_A0(a0),_CS(ncs)
00029 {  
00030     lcd_reset();
00031 }
00032 
00033 void C12832::invert(unsigned int o)
00034 {
00035     if(o == 0) wr_cmd(0xA6);
00036     else wr_cmd(0xA7);
00037 }
00038 
00039 
00040 
00041 void C12832::wr_cmd(unsigned char cmd)
00042 {
00043     _A0 = 0;
00044     _CS = 0;
00045     _spi.write(cmd);
00046     _CS = 1;
00047 }
00048 
00049 void C12832::wr_dat(unsigned char dat)
00050 {
00051     _A0 = 1;
00052     _CS = 0;
00053     _spi.write(dat);
00054     _CS = 1;
00055 }
00056 
00057 void C12832::lcd_reset()
00058 {
00059 
00060     _spi.format(8,3);                 // 8 bit spi mode 3
00061     _spi.frequency(20000000);          // 19,2 Mhz SPI clock
00062     _A0 = 0;
00063     _CS = 1;
00064     _reset = 0;                        // display reset
00065     wait_us(50);
00066     _reset = 1;                       // end reset
00067     wait_ms(5);
00068 
00069     /* Start Initial Sequence ----------------------------------------------------*/
00070 
00071     wr_cmd(0xAE);   //  display off
00072     wr_cmd(0xA2);   //  bias voltage
00073 
00074     wr_cmd(0xA0);
00075     wr_cmd(0xC8);   //  colum normal
00076 
00077     wr_cmd(0x22);   //  voltage resistor ratio
00078     wr_cmd(0x2F);   //  power on
00079     //wr_cmd(0xA4);   //  LCD display ram
00080     wr_cmd(0x40);   // start line = 0
00081     wr_cmd(0xAF);     // display ON
00082 
00083     wr_cmd(0x81);   //  set contrast
00084     wr_cmd(0x17);   //  set contrast
00085 
00086     wr_cmd(0xA6);     // display normal
00087 
00088 
00089     // clear and update LCD
00090     memset(buffer,0x00,512);  // clear display buffer
00091     copy_to_lcd();
00092 }
00093 
00094 void C12832::pixel(int x, int y, int color)
00095 {
00096     // first check parameter
00097     if(x > 127 || y > 31 || x < 0 || y < 0) return;
00098 
00099         if(color == 0)
00100             buffer[x + ((y/8) * 128)] &= ~(1 << (y%8));  // erase pixel
00101         else
00102             buffer[x + ((y/8) * 128)] |= (1 << (y%8));   // set pixel
00103 
00104 }
00105 
00106 void C12832::copy_to_lcd(void)
00107 {
00108     
00109     int i=0;
00110     
00111     //page 0
00112     wr_cmd(0x00);      // set column low nibble 0
00113     wr_cmd(0x10);      // set column hi  nibble 0
00114     wr_cmd(0xB0);      // set page address  0
00115     _A0 = 1;
00116     for(i=0; i<128; i++) {
00117         wr_dat(buffer[i]);
00118     }
00119 
00120     // page 1
00121     wr_cmd(0x00);      // set column low nibble 0
00122     wr_cmd(0x10);      // set column hi  nibble 0
00123     wr_cmd(0xB1);      // set page address  1
00124     _A0 = 1;
00125     for(i=128; i<256; i++) {
00126         wr_dat(buffer[i]);
00127     }
00128 
00129     //page 2
00130     wr_cmd(0x00);      // set column low nibble 0
00131     wr_cmd(0x10);      // set column hi  nibble 0
00132     wr_cmd(0xB2);      // set page address  2
00133     _A0 = 1;
00134     for(i=256; i<384; i++) {
00135         wr_dat(buffer[i]);
00136     }
00137 
00138     //page 3
00139     wr_cmd(0x00);      // set column low nibble 0
00140     wr_cmd(0x10);      // set column hi  nibble 0
00141     wr_cmd(0xB3);      // set page address  3
00142     _A0 = 1;
00143 
00144     _CS = 0;
00145     
00146     for(i=384; i<512; i++) {
00147         wr_dat(buffer[i]);
00148     }
00149 
00150 }
00151 
00152 void C12832::cls(void)
00153 {
00154     memset(buffer,0x00,512);  // clear display buffer
00155     copy_to_lcd();
00156 }
00157 
00158 void C12832::rectangle(int x1, int x2, int y1, int y2)
00159 {
00160     for(int i=x1;i<=x2;i++)
00161     {
00162         pixel(i,y1,1);
00163         pixel(i,y2,1);
00164     }
00165     
00166     for(int i=y1;i<=y2;i++)
00167     {
00168         pixel(x1,i,1);
00169         pixel(x2,i,1);
00170     }
00171 }
00172 
00173 
00174 void C12832::text(int ix, int iy, char* ctext, int length, int size)
00175 {
00176     int i;
00177     for(i=0;i<length;i++)
00178     {
00179         character(ix+i*6*size,iy,ctext[i],size);    
00180     }
00181 }
00182 
00183 
00184 int C12832::character(int ix, int iy, char c, int size)
00185 {
00186     int code = 0;
00187     
00188     if(ix >127 || ix < 0) return -1;
00189     if(iy >31  || iy < 0) return -1;
00190     if(c>= 0x20){
00191         code = (int)(c - 0x20);
00192     } else if(c == 0x00) {
00193         code = 96;
00194     } else {
00195         return -1;
00196     }   
00197     if((size < 0)||(size > 4)) return -1;
00198     
00199     int index = code*5;
00200     unsigned char  codebyte = 0;
00201     unsigned char codebit = 0;
00202     
00203     
00204     for(int i=0; i< 5 ; i++)
00205     {
00206         codebyte = font[index+i];
00207         for(int j=0; j<7; j++)
00208         {
00209              codebit =  codebyte & (1<<j);
00210              for (int k=0; k<size; k++) {
00211                 for(int l=0;l<size;l++) {
00212                     pixel(ix+i*size+k,iy+l+j*size,codebit);   
00213                 }             
00214              }
00215              
00216         }     
00217     } 
00218     return 0;
00219 }    
00220 
00221 void C12832::set_contrast(unsigned char volume)
00222 {
00223     wr_cmd(0x81);      //  set volume
00224     wr_cmd(volume & 0x3F);
00225 }   
00226 
00227