{"id":1015,"date":"2016-01-22T10:20:34","date_gmt":"2016-01-22T10:20:34","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1015"},"modified":"2016-01-22T10:20:34","modified_gmt":"2016-01-22T10:20:34","slug":"lcd-8-bit-interface-test","status":"publish","type":"post","link":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/","title":{"rendered":"Democode: LCD 8-Bit Interface Test"},"content":{"rendered":"<p>Standardcode f\u00fcr die parallele Ansteuerung eines LCD Moduls (Autor: Manfred Dietrich). Ausf\u00fchrliche Informationen zur LCD Ansteuerung findet man \u00fcberall, zum Beispiel hier:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\/LCD-Ansteuerung.<\/p>\n<p><span style=\"color: #3366ff;\">\/*<\/span><br \/>\n<span style=\"color: #3366ff;\"> * LCD 8-Bit Interface Test<\/span><br \/>\n<span style=\"color: #3366ff;\"> * fuer LCD-Controller KS0073 von SAMSUNG mit 4&#215;20 Display<\/span><br \/>\n<span style=\"color: #3366ff;\">* Anschlusskonfiguration:<\/span><br \/>\n<span style=\"color: #3366ff;\"> * LowerNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 4,5,6,7\u00a0\u00a0 = PD 4-7<\/span><br \/>\n<span style=\"color: #3366ff;\"> * HigherNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 8,9,10,11 = PB 0-3<\/span><br \/>\n<span style=\"color: #3366ff;\"> * RS = RegisterSelect:\u00a0\u00a0 IO-Pin 2 <\/span><br \/>\n<span style=\"color: #3366ff;\"> * RW = Read\/write\u00a0\u00a0\u00a0 :\u00a0\u00a0 immer 0 fest verdrahtet<\/span><br \/>\n<span style=\"color: #3366ff;\"> * E\u00a0 = Enable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pin 3 <\/span><br \/>\n<span style=\"color: #3366ff;\"> * Im 4 Bit Modus muessen D0-D3 des LCD auf 0 gelegt werden. D4-D7 muessen an an das LowerNibble angeschlossen werden.<\/span><br \/>\n<span style=\"color: #3366ff;\"> *\/<\/span><\/p>\n<hr \/>\n<pre>#include &lt;LCD4x20.h&gt;\n#include &lt;NibbleInterface.h&gt;\n#include \"WProgram.h\"\nvoid setup();\nvoid loop();\nLCD4x20 lcd = LCD4x20(); \/\/ So wird in der Arduino Umgebung ein Objekt erzeugt.\n\nvoid setup() \/\/ run once, when the sketch starts\n{\n  pinMode(13, OUTPUT);\n  digitalWrite(13, HIGH); \/\/ OK, Programm ist gestartet\n  pinMode(5, OUTPUT);\n  digitalWrite(5, HIGH);\n\n  lcd.initLCD(true);\n  lcd.lcdPrintString(\"Hallo Welt\");\n\n  \/\/char bTemp[16];\n  \/*\n  for(int i = 0; i &lt; 32767; i++)\n  {\n    lcd.setCursor(1,0);\n    lcd.lcdPrintString(itoa(i,bTemp,10)); \/\/ Benoetigt nur 160 Bytes\n    \/\/*dtostrf(double __val, char __width, char __prec, char *__s);\n    \/\/lcd.lcdPrintString(dtostrf(123.45, 8, 2, bTemp)); \/\/ Benoetigt mehr als 1.5kB Programmspeicher\n  }\n  *\/\n  \/*\n  volatile int i = B10101111;\n  lcd.setCursor(2,0);\n  lcd.lcdPrintString(itoa(i&gt;&gt;4,bTemp,10));\n  lcd.lcdPrintString(\";\");\n  lcd.lcdPrintString(itoa(i&amp;15,bTemp,10));\n  delay(2000);\n  *\/\n}\n\nvoid loop() \/\/ run over and over again\n{\n  for(byte i=0;i&lt;101;i++)\n  {\n    lcd.levelBarPosLR(i,i,1);\n    lcd.levelBarPosR(i,2,false);\n    lcd.levelBarPosL(i,3,false);\n    delay(50);\n  }\n\n for(byte i=100;i&gt;0;i--)\n  {\n   lcd.levelBarPosLR(100-i,i,1);\n   lcd.levelBarPosR(i,2,false);\n   lcd.levelBarPosL(i,3,false);\n   delay(50);\n  }\n}\n\n\/\/ main\nint main(void)\n{\n  init();\n  setup();\n  for (;;)\n  loop();\n  return 0;\n}<\/pre>\n<p>Die ben\u00f6tigen Libraries:<\/p>\n<p><strong>LCD4x20.h<\/strong><\/p>\n<pre>\/\/ ____________________________________________________________________________\n\/\/ LCD-Treiber 4x20\n\/\/ 081020 manfred.dietrich@clustertec.com\n\/\/ ____________________________________________________________________________\n\n\n#include \n#include &lt;..\/NibbleInterface\/NibbleInterface.h&gt;\n\n#define LCDPIN_RS 2\n#define LCDPIN_E  3\n#ifndef LCD4x20_h\n#define LCD4x20_h\n\n\nclass LCD4x20\n{\n\tpublic:\n\t\tLCD4x20();\n\t\tvoid sendDataByte(byte dataByte);\n\t\tvoid sendInstructionByte(byte instrByte);\n\t\tvoid clearDisplay();\n\t\tvoid clearLine(byte Line);\n\t\tvoid setCursor(byte Row, byte Col);\n\t\tvoid lcdPrintString(char *Text); \/\/ printString wird schon verwendet\n\t\tvoid levelBarPosR(byte Level, byte Row, bool fHalf);\n\t\tvoid levelBarPosL(byte Level, byte Row, bool fHalf);\n\t\tvoid levelBarPosLR(byte levelL, byte levelR, byte Row);\n\t\tvoid cursorOn(byte cursorMode);\n\t\tvoid initLCD(bool use4Bit);\n\t\n\tprivate:\n\t\tNibbleInterface nibble;\n\t\tvoid initLines();\n\t\tvoid initUserdefChars();\n\t\tvoid enableData(void);\n\t\tvoid sendDataByte8Bit(byte dataByte);\n\t\tvoid sendInstructionByte8Bit(byte instrByte);\n\t\tvoid sendDataByte4Bit(byte dataByte);\n\t\tvoid sendInstructionByte4Bit(byte instrByte);\n\t\tbyte levelPosR[4];\n\t\tbyte levelPosL[4];\n\t\tbool f4Bit;\t\t\n};\n\n#endif\n<\/pre>\n<p><strong>LCD4x20.cpp<\/strong><\/p>\n<pre>\/\/ LCD-Treiber 4x20\n\/\/ 080917 manfred.dietrich@clustertec.com\n\/\/ ____________________________________________________________________________\n\n\/*\n * Anschlusskonfiguration:\n * LowerNibble        :   IO-Pins 4,5,6,7   = PD 4-7\n * HigherNibble       :   IO-Pins 8,9,10,11 = PB 0-3\n * Im 4 Bit Modus m\u00fcssen D0-D3 des LCD auf 0 gelegt werden. D4-D7 m\u00fcssen an an das LowerNibble angeschlossen werden.\n * RS = RegisterSelect:   IO-Pin 2 \n * RW = Read\/write    :   immer 0 fest verdrahtet\n * E  = Enable        :   IO-Pin 3 \n*\/\n\n#include \n\nLCD4x20::LCD4x20()\n{\n\t\/\/ initLCD darf nicht schon im Konstruktor aufgerufen werden.\n\t\/\/ Dies f\u00fchrt zu Problemen mit den IO-Ports, wenn die Klasse global deklariert wird.\n\t\n\t\/\/initLCD();\n\tf4Bit = false; \n}\n\n\nvoid LCD4x20::initLines()\n{\n\tpinMode(LCDPIN_RS, OUTPUT);\n\tdigitalWrite(LCDPIN_RS,LOW);\n\tpinMode(LCDPIN_E,  OUTPUT);\n\tdigitalWrite(LCDPIN_E,LOW);\n}\n\nvoid LCD4x20::initLCD(bool use4Bit)\n{\n\tf4Bit = use4Bit;\n\tinitLines();\n    if(f4Bit)\n\t{\n\t\t\n\t\tnibble.setLowerNibble(3); \/\/ Sicherstellen, dass der 8 Bit Modus aktiv ist. Z.B. nach einem Reset des uP befindet sich das Display immer noch im 4 Bit Modus\n\t\tenableData();\n\t\tdelay(20);\n\t\tenableData();\n\t\tenableData();\n\t\t\n\t\tnibble.setLowerNibble(2); \/\/ 4 Bit Modus aktivieren\n\t\tenableData();\n\t\t\n\t\tsendInstructionByte(B00101100); \/\/ Function Set: 4-bit, RE(1)\n\t\tsendInstructionByte(B00001001); \/\/ Extended Function Set: 5-font, 4-lin\n\t    sendInstructionByte(B00101000); \/\/ Function Set: RE(0)\n\t}\n\telse\n\t{\n\t\tsendInstructionByte(B00111100); \/\/ Function Set: 8-bit, RE(1)\n\t\tsendInstructionByte(B00001001); \/\/ Extended Function Set: 5-font, 4-lin\n\t    sendInstructionByte(B00111000); \/\/ Function Set: RE(0)\n\t}\n\t\n   \n    clearDisplay();\n    sendInstructionByte(B00001100); \/\/ Display ON\/OFF Control: Display\/Cursor off \n\t\n\tinitUserdefChars();\n\t\n\tlevelPosR[0] = 0;\n\tlevelPosR[1] = 0;\n\tlevelPosR[2] = 0;\n\tlevelPosR[3] = 0;\n\t\n\tlevelPosL[0] = 0;\n\tlevelPosL[1] = 0;\n\tlevelPosL[2] = 0;\n\tlevelPosL[3] = 0;\n}\n\nvoid LCD4x20::initUserdefChars()\n{\n\t\/\/ 5 rechtsbuendige Bloecke definieren\n\t\/\/ Diese werden fuer den Balken von rechts nach links verwendet.\n\tsendInstructionByte(B01001000);\n\tbyte pattern = 1;\n\tfor(byte j=0; j &lt; 5; j++)\n\t{\n\t\tfor(byte i=0; i&lt;7; i++)\n\t\t{\n\t\t\tsendDataByte(pattern);\n\t\t}\n\t\tsendDataByte(0);\n\t\tpattern = (pattern&lt;&lt;1)+1; } setCursor(0,0); } void LCD4x20::enableData(void) { digitalWrite(LCDPIN_E,HIGH); delayMicroseconds(10); digitalWrite(LCDPIN_E,LOW); \/\/ Daten werden bei der fallenden Flanke uebernommen delayMicroseconds(40); \/\/ Im 4 Bit Modus gibt es unterhalb von 20 uS Probleme digitalWrite(LCDPIN_E,HIGH); } void LCD4x20::sendDataByte(byte dataByte) { if(f4Bit) sendDataByte4Bit(dataByte); else sendDataByte8Bit(dataByte); } void LCD4x20::sendDataByte8Bit(byte dataByte) { digitalWrite(LCDPIN_RS,HIGH); nibble.setByte(dataByte); enableData(); delayMicroseconds(50); \/\/ Siehe Datenblatt zu KS0073. Mit diesem Delay muss das Busyflag nicht abgefragt werden } void LCD4x20::sendDataByte4Bit(byte dataByte) { digitalWrite(LCDPIN_RS,HIGH); nibble.setLowerNibble(dataByte&gt;&gt;4);\n\tenableData();\n\tdelayMicroseconds(50); \n\tnibble.setLowerNibble(dataByte &amp; 15);\n\tenableData();\n\tdelayMicroseconds(50); \n}\n\nvoid LCD4x20::sendInstructionByte(byte instrByte)\n{\n\tif(f4Bit)\n\t\tsendInstructionByte4Bit(instrByte);\n\telse\n\t\tsendInstructionByte8Bit(instrByte);\n\t\n\tdelayMicroseconds(50);\n}\n\nvoid LCD4x20::sendInstructionByte8Bit(byte instrByte)\n{\n\tdigitalWrite(LCDPIN_RS,LOW);\n\tnibble.setByte(instrByte);\n\tenableData();\n\tdelayMicroseconds(50); \n}\n\nvoid LCD4x20::sendInstructionByte4Bit(byte instrByte)\n{\n\tdigitalWrite(LCDPIN_RS,LOW);\n\tnibble.setLowerNibble(instrByte&gt;&gt;4);\n\tenableData();\n\tdelayMicroseconds(50); \n\tnibble.setLowerNibble(instrByte &amp; 15);\n\tenableData();\n\tdelayMicroseconds(50); \n}\n\n\nvoid LCD4x20::clearDisplay()\n{\n\tsendInstructionByte(1);\n        delay(2);\n}\n\nvoid LCD4x20::clearLine(byte Line)\n{\n\tif(Line &gt; 3)\n\t\treturn;\n\tsetCursor(Line,0);\n\tlcdPrintString((char*)\"                    \");\n\t                    \/\/ 01234567890123456789\n\tsetCursor(Line,0);\t\n}\n\nvoid LCD4x20::setCursor(byte Row, byte Col)\n{\n\tif(Row &gt; 3 || Col &gt; 19)\n\t\treturn;\n\t\t\n\tsendInstructionByte(128+Row*32+Col);\n}\n\nvoid LCD4x20::lcdPrintString(char *Text)\n{\n\tbyte i = 0;\n\twhile(Text[i] !='\\0')\n\t{\n\t\t\/\/ Umlaute \u00fcbersetzen\n\t\t\n\t\tswitch(Text[i])\n\t\t{\n\t\t\t\/\/case '\u00e4': sendDataByte(123); break;\n\t\t\t\/\/case '\u00f6': sendDataByte(92); break;\n\t\t\t\/\/case '\u00fc': sendDataByte(126); break;\n\t\t\tdefault: sendDataByte((byte)Text[i]);break;\n\t\t}\n\t\t\n\t\ti++;\n\t}\n}\n\nvoid LCD4x20::levelBarPosR(byte Level, byte Row, bool fHalf)\n{\n\t\/\/ Links 0; rechts 100\n\tbyte offset = 0;\n\tbyte shrink = 0; \/\/ 0 mal rechts schieben \n\t\n\tif(fHalf)\n\t{\n\t\toffset = 10;\n\t\tshrink = 1; \/\/ 1 mal nach rechts schieben\n\t}\n\t\n\tif(Level &gt; 100)\n\t\tLevel = 100;\n\t\t\n\tbyte fullBlocks = (Level&gt;&gt;shrink)\/5;\n\tif(Level &lt; levelPosR[Row])\n\t{\t\n\t\tsetCursor(Row,offset + fullBlocks+1);\n\t\tfor(byte i = fullBlocks+1; i &lt; 20-offset; i++)\n\t\t\tsendDataByte(' ');\n\t}\n\t\/\/delay(250);\n\tsetCursor(Row,offset);\n\tlevelPosR[Row] = Level;\n\t\t\n\tfor(byte i= 0; i &lt; fullBlocks; i++) sendDataByte(214); \/\/delay(250); if(Level == 100) \/\/ Es wurden schon 20 Fullblocks gezeichnet, also kein Space mehr drucken, sonst wird an anderer Stelle etwas \u00fcberschrieben. return; switch((Level&gt;&gt;shrink) % 5)\n\t{\n\t\tcase 0: sendDataByte(' '); break;\n\t\tcase 1: sendDataByte(218); break;\n\t\tcase 2: sendDataByte(217); break;\n\t\tcase 3: sendDataByte(216); break;\n\t\tcase 4: sendDataByte(215); break;\n\t\tdefault: break;\n\t}\n}\n\n\nvoid LCD4x20::levelBarPosL(byte Level, byte Row, bool fHalf)\n{\n\t\/\/ Rechts 0; links 100\n\tbyte offset = 0;\n\tbyte shrink = 0; \/\/ 0 mal rechts schieben \n\t\n\tif(fHalf)\n\t{\n\t\toffset = 10;\n\t\tshrink = 1; \/\/ 1 mal nach rechts schieben\n\t}\n\t\n\tif(Level &gt; 100)\n\t\tLevel = 100;\n\t\t\n\tbyte fullBlocks = (Level&gt;&gt;shrink)\/5;\n\tif(Level &lt; levelPosL[Row])\n\t{\t\n\t\tsetCursor(Row,0);\n\t\tfor(byte i = 0; i &lt; 20-offset-fullBlocks; i++)\n\t\t\tsendDataByte(' ');\n\t}\n\t\/\/delay(250);\n\tlevelPosL[Row] = Level;\n\t\n\tif(fullBlocks &lt; 20-offset) { setCursor(Row,19-offset-fullBlocks); switch((Level&gt;&gt;shrink) % 5)\n\t\t{\n\t\t\tcase 1: sendDataByte(1); break;\n\t\t\tcase 2: sendDataByte(2); break;\n\t\t\tcase 3: sendDataByte(3); break;\n\t\t\tcase 4: sendDataByte(4); break;\n\t\t\tdefault:break;\n\t\t}\n\t}\n\tsetCursor(Row,20-offset-fullBlocks);\n\tfor(byte i= 0; i &lt; fullBlocks; i++)\n\t\tsendDataByte(5);\n}\n\n\nvoid LCD4x20::levelBarPosLR(byte levelL, byte levelR, byte Row)\n{\n\tlevelBarPosL(levelL,Row,true);\n\tlevelBarPosR(levelR,Row,true);\n}\n\nvoid LCD4x20::cursorOn(byte cursorMode)\n{\n\t\/\/ 0 = kein Cursor\n\t\/\/ 1 = Cursorblock blinken\n\t\/\/ 2 = underscore Cursor\n\tsendInstructionByte(B00001100 + cursorMode);\n}\n<\/pre>\n<p><strong>NibbleInterface.h<\/strong><\/p>\n<pre>\/\/ 2*4 Bit output interface\n\/\/ 080917 manfred.dietrich@clustertec.com\n\/\/ ____________________________________________________________________________\n\n#include \n#include \n\n#undef int\n#undef abs\n#undef double\n#undef float\n#undef round\n\n#ifndef nibbleinterface_h\n#define nibbleinterface_h\n\nclass NibbleInterface\n{\n\tpublic:\n\t\tNibbleInterface();\n\t\tbool setLowerNibble(byte mask);\n\t\tbool setHigherNibble(byte mask);\n\t\tvoid setByte(byte mask);\n\t\n\tprivate:\n\t\tvoid setLowerNibbleAsOutput();\n\t\tvoid setHigherNibbleAsOutput();\n\t\t\n};\n\n#endif\n<\/pre>\n<p><strong>NibbleInterface.cpp<\/strong><\/p>\n<pre>\/\/ 2*4 Bit output interface\n\/\/ Lower Nibble auf Pins \t4,5,6,7\n\/\/ Higher Nibble auf Pins\t8,9,10,11\n\/\/ 080917 manfred.dietrich@clustertec.com\n\/\/ ____________________________________________________________________________\n\n\/\/#include \n#include \n\n\nNibbleInterface::NibbleInterface()\n{\n\tsetLowerNibbleAsOutput();\n\tsetHigherNibbleAsOutput();\t\t\n}\n\n\nbool NibbleInterface::setLowerNibble(byte mask)\n{\n\t\/\/ IO-Pins 4,5,6,7 = PD 4-7 auf L oder H setzen\n\t\n\tif(mask &gt; 15)\n\t\treturn false;\n\tbyte pd = PORTD;\n\tpd &amp;= B00001111; \/\/ Bit 4-7 auf 0 setzen\n\tpd |= mask&lt;&lt;4; PORTD = pd; return true; } bool NibbleInterface::setHigherNibble(byte mask) { \/\/ IO-Pins 8,9,10,11 = PB 0-3 auf L oder H setzen if(mask &gt; 15)\n\t\treturn false;\n\t\t\t\n\tbyte pb = PORTB;\n\tpb &amp;= B11110000; \/\/ Bit 0-3 auf 0 setzen\n\tpb |= mask;\n\tPORTB = pb;\n\treturn true;\n}\n\n\nvoid NibbleInterface::setLowerNibbleAsOutput()\n{\n\t\/\/ IO-Pins 4,5,6,7 = PD 4-7 \n\tsetLowerNibble(0);\n\tDDRD |= B11110000;\n}\n\n\nvoid NibbleInterface::setHigherNibbleAsOutput()\n{\n\t\/\/ IO-Pins 8,9,10,11 = PB 0-3\t\n\tsetHigherNibble(0);\n\tDDRB |= B00001111;\n}\n\n\nvoid NibbleInterface::setByte(byte mask)\n{\n\tsetLowerNibble(mask &amp; B00001111);\n\tsetHigherNibble(mask&gt;&gt;4);\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Standardcode f\u00fcr die parallele Ansteuerung eines LCD Moduls (Autor: Manfred Dietrich). Ausf\u00fchrliche Informationen zur LCD Ansteuerung findet man \u00fcberall, zum Beispiel hier:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\/LCD-Ansteuerung. \/* * LCD 8-Bit Interface Test * fuer LCD-Controller KS0073 von SAMSUNG mit 4&#215;20 Display * Anschlusskonfiguration: * LowerNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 4,5,6,7\u00a0\u00a0 = PD 4-7 * HigherNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 8,9,10,11 = PB 0-3 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[38,71],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Democode: LCD 8-Bit Interface Test - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Democode: LCD 8-Bit Interface Test - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"Standardcode f\u00fcr die parallele Ansteuerung eines LCD Moduls (Autor: Manfred Dietrich). Ausf\u00fchrliche Informationen zur LCD Ansteuerung findet man \u00fcberall, zum Beispiel hier:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\/LCD-Ansteuerung. \/* * LCD 8-Bit Interface Test * fuer LCD-Controller KS0073 von SAMSUNG mit 4&#215;20 Display * Anschlusskonfiguration: * LowerNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 4,5,6,7\u00a0\u00a0 = PD 4-7 * HigherNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 8,9,10,11 = PB 0-3 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-22T10:20:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\",\"url\":\"http:\/\/52.29.166.97\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#webpage\",\"url\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/\",\"name\":\"Democode: LCD 8-Bit Interface Test - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\"},\"datePublished\":\"2016-01-22T10:20:34+00:00\",\"dateModified\":\"2016-01-22T10:20:34+00:00\",\"author\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/52.29.166.97\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Democode: LCD 8-Bit Interface Test\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Democode: LCD 8-Bit Interface Test - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/","og_locale":"de_DE","og_type":"article","og_title":"Democode: LCD 8-Bit Interface Test - Merkbar.","og_description":"Standardcode f\u00fcr die parallele Ansteuerung eines LCD Moduls (Autor: Manfred Dietrich). Ausf\u00fchrliche Informationen zur LCD Ansteuerung findet man \u00fcberall, zum Beispiel hier:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\/LCD-Ansteuerung. \/* * LCD 8-Bit Interface Test * fuer LCD-Controller KS0073 von SAMSUNG mit 4&#215;20 Display * Anschlusskonfiguration: * LowerNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 4,5,6,7\u00a0\u00a0 = PD 4-7 * HigherNibble\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0\u00a0 IO-Pins 8,9,10,11 = PB 0-3 [&hellip;]","og_url":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/","og_site_name":"Merkbar.","article_published_time":"2016-01-22T10:20:34+00:00","twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"7 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/52.29.166.97\/myblog\/#website","url":"http:\/\/52.29.166.97\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"WebPage","@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#webpage","url":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/","name":"Democode: LCD 8-Bit Interface Test - Merkbar.","isPartOf":{"@id":"http:\/\/52.29.166.97\/myblog\/#website"},"datePublished":"2016-01-22T10:20:34+00:00","dateModified":"2016-01-22T10:20:34+00:00","author":{"@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/52.29.166.97\/myblog\/2016\/01\/22\/lcd-8-bit-interface-test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/52.29.166.97\/myblog\/"},{"@type":"ListItem","position":2,"name":"Democode: LCD 8-Bit Interface Test"}]},{"@type":"Person","@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/52.29.166.97\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts\/1015"}],"collection":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/comments?post=1015"}],"version-history":[{"count":0,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts\/1015\/revisions"}],"wp:attachment":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/media?parent=1015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/categories?post=1015"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/tags?post=1015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}