Medica demo control system.

Dependencies:   mbed

Committer:
sjk127
Date:
Thu Oct 28 13:27:46 2010 +0000
Revision:
0:00a9f58f32d0

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sjk127 0:00a9f58f32d0 1 /* mbed TextLCD Library
sjk127 0:00a9f58f32d0 2 * Copyright (c) 2007-2009 sford
sjk127 0:00a9f58f32d0 3 * Released under the MIT License: http://mbed.org/license/mit
sjk127 0:00a9f58f32d0 4 *
sjk127 0:00a9f58f32d0 5 * TODO: Needs serious rework/neatening up!
sjk127 0:00a9f58f32d0 6 */
sjk127 0:00a9f58f32d0 7
sjk127 0:00a9f58f32d0 8 #include "TextLCD.h"
sjk127 0:00a9f58f32d0 9
sjk127 0:00a9f58f32d0 10 #include "mbed.h"
sjk127 0:00a9f58f32d0 11 #include "error.h"
sjk127 0:00a9f58f32d0 12
sjk127 0:00a9f58f32d0 13 using namespace mbed;
sjk127 0:00a9f58f32d0 14
sjk127 0:00a9f58f32d0 15
sjk127 0:00a9f58f32d0 16
sjk127 0:00a9f58f32d0 17 TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1,
sjk127 0:00a9f58f32d0 18 PinName d2, PinName d3, int columns, int rows) : _rw(rw), _rs(rs),
sjk127 0:00a9f58f32d0 19 _e(e), _d(d0, d1, d2, d3), _columns(columns), _rows(rows) {
sjk127 0:00a9f58f32d0 20
sjk127 0:00a9f58f32d0 21 // _rows = 2;
sjk127 0:00a9f58f32d0 22 // _columns = 16;
sjk127 0:00a9f58f32d0 23 // Mon, 27 Apr 2009 23:32:34 +0200
sjk127 0:00a9f58f32d0 24 // Kevin Konradt:
sjk127 0:00a9f58f32d0 25 // When using a LCD with 1 row x 16 characters
sjk127 0:00a9f58f32d0 26 // instead of 2x16, try changing _columns to 8.
sjk127 0:00a9f58f32d0 27 // (display seems to split the 16 characters into
sjk127 0:00a9f58f32d0 28 // 2 virtual rows with 8 characters each.)
sjk127 0:00a9f58f32d0 29
sjk127 0:00a9f58f32d0 30 _rw = 0;
sjk127 0:00a9f58f32d0 31 _e = 1;
sjk127 0:00a9f58f32d0 32 _rs = 0; // command mode
sjk127 0:00a9f58f32d0 33
sjk127 0:00a9f58f32d0 34 // Should theoretically wait 15ms, but most things will be powered up pre-reset
sjk127 0:00a9f58f32d0 35 // so i'll disable that for the minute. If implemented, could wait 15ms post reset
sjk127 0:00a9f58f32d0 36 // instead
sjk127 0:00a9f58f32d0 37 // wait(0.015);
sjk127 0:00a9f58f32d0 38
sjk127 0:00a9f58f32d0 39 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
sjk127 0:00a9f58f32d0 40 for(int i=0; i<3; i++) {
sjk127 0:00a9f58f32d0 41 writeNibble(0x3);
sjk127 0:00a9f58f32d0 42 wait(0.00164); // this command takes 1.64ms, so wait for it
sjk127 0:00a9f58f32d0 43 }
sjk127 0:00a9f58f32d0 44 writeNibble(0x2); // 4-bit mode
sjk127 0:00a9f58f32d0 45
sjk127 0:00a9f58f32d0 46 writeCommand(0x28); // Function set 001 BW N F - -
sjk127 0:00a9f58f32d0 47 writeCommand(0x0C);
sjk127 0:00a9f58f32d0 48 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
sjk127 0:00a9f58f32d0 49
sjk127 0:00a9f58f32d0 50 cls();
sjk127 0:00a9f58f32d0 51 }
sjk127 0:00a9f58f32d0 52
sjk127 0:00a9f58f32d0 53 int TextLCD::_putc(int value) {
sjk127 0:00a9f58f32d0 54 if(value == '\n') {
sjk127 0:00a9f58f32d0 55 newline();
sjk127 0:00a9f58f32d0 56 } else {
sjk127 0:00a9f58f32d0 57 writeData(value);
sjk127 0:00a9f58f32d0 58 }
sjk127 0:00a9f58f32d0 59 return value;
sjk127 0:00a9f58f32d0 60 }
sjk127 0:00a9f58f32d0 61
sjk127 0:00a9f58f32d0 62 int TextLCD::_getc() {
sjk127 0:00a9f58f32d0 63 return 0;
sjk127 0:00a9f58f32d0 64 }
sjk127 0:00a9f58f32d0 65
sjk127 0:00a9f58f32d0 66 void TextLCD::newline() {
sjk127 0:00a9f58f32d0 67 _column = 0;
sjk127 0:00a9f58f32d0 68 _row++;
sjk127 0:00a9f58f32d0 69 if(_row >= _rows) {
sjk127 0:00a9f58f32d0 70 _row = 0;
sjk127 0:00a9f58f32d0 71 }
sjk127 0:00a9f58f32d0 72 locate(_column, _row);
sjk127 0:00a9f58f32d0 73 }
sjk127 0:00a9f58f32d0 74
sjk127 0:00a9f58f32d0 75 void TextLCD::locate(int column, int row) {
sjk127 0:00a9f58f32d0 76 if(column < 0 || column >= _columns || row < 0 || row >= _rows) {
sjk127 0:00a9f58f32d0 77 error("locate(%d,%d) out of range on %dx%d display", column, row, _columns, _rows);
sjk127 0:00a9f58f32d0 78 return;
sjk127 0:00a9f58f32d0 79 }
sjk127 0:00a9f58f32d0 80
sjk127 0:00a9f58f32d0 81 _row = row;
sjk127 0:00a9f58f32d0 82 _column = column;
sjk127 0:00a9f58f32d0 83 int address=0;
sjk127 0:00a9f58f32d0 84
sjk127 0:00a9f58f32d0 85 if (_rows > 2) {
sjk127 0:00a9f58f32d0 86 // row 0 : 0x0->0x13
sjk127 0:00a9f58f32d0 87 // row 1 : 0x40->0x53
sjk127 0:00a9f58f32d0 88 // row 2 : 0x14->0x27
sjk127 0:00a9f58f32d0 89 // row 3 : 0x54->0x67
sjk127 0:00a9f58f32d0 90
sjk127 0:00a9f58f32d0 91 switch (_row) {
sjk127 0:00a9f58f32d0 92 case (0) : address = 0x80 + _column;
sjk127 0:00a9f58f32d0 93 break;
sjk127 0:00a9f58f32d0 94 case (1) : address = 0xc0 + _column;
sjk127 0:00a9f58f32d0 95 break;
sjk127 0:00a9f58f32d0 96 case (2) : address = 0x94 + _column;
sjk127 0:00a9f58f32d0 97 break;
sjk127 0:00a9f58f32d0 98 case (3) : address = 0xd4 + _column;
sjk127 0:00a9f58f32d0 99 break;
sjk127 0:00a9f58f32d0 100 }
sjk127 0:00a9f58f32d0 101
sjk127 0:00a9f58f32d0 102 }
sjk127 0:00a9f58f32d0 103 else {
sjk127 0:00a9f58f32d0 104 // memory starts at 0x80, and is 40 chars long per row
sjk127 0:00a9f58f32d0 105 address = 0x80 + (_row * 40) + _column;
sjk127 0:00a9f58f32d0 106 }
sjk127 0:00a9f58f32d0 107
sjk127 0:00a9f58f32d0 108 writeCommand(address);
sjk127 0:00a9f58f32d0 109 }
sjk127 0:00a9f58f32d0 110
sjk127 0:00a9f58f32d0 111 void TextLCD::cls() {
sjk127 0:00a9f58f32d0 112 writeCommand(0x01); // Clear Display
sjk127 0:00a9f58f32d0 113 wait(0.005); // This command takes 1.64 ms
sjk127 0:00a9f58f32d0 114 locate(0, 0);
sjk127 0:00a9f58f32d0 115 }
sjk127 0:00a9f58f32d0 116
sjk127 0:00a9f58f32d0 117 void TextLCD::reset() {
sjk127 0:00a9f58f32d0 118 cls();
sjk127 0:00a9f58f32d0 119 }
sjk127 0:00a9f58f32d0 120
sjk127 0:00a9f58f32d0 121 void TextLCD::clock() {
sjk127 0:00a9f58f32d0 122 wait(0.005);
sjk127 0:00a9f58f32d0 123 _e = 0;
sjk127 0:00a9f58f32d0 124 wait(0.005); // most instructions take 40us
sjk127 0:00a9f58f32d0 125 _e = 1;
sjk127 0:00a9f58f32d0 126 }
sjk127 0:00a9f58f32d0 127
sjk127 0:00a9f58f32d0 128 void TextLCD::writeNibble(int value) {
sjk127 0:00a9f58f32d0 129 _d = value;
sjk127 0:00a9f58f32d0 130 clock();
sjk127 0:00a9f58f32d0 131 }
sjk127 0:00a9f58f32d0 132
sjk127 0:00a9f58f32d0 133 void TextLCD::writeByte(int value) {
sjk127 0:00a9f58f32d0 134 writeNibble(value >> 4);
sjk127 0:00a9f58f32d0 135 writeNibble(value >> 0);
sjk127 0:00a9f58f32d0 136 }
sjk127 0:00a9f58f32d0 137
sjk127 0:00a9f58f32d0 138 void TextLCD::writeCommand(int command) {
sjk127 0:00a9f58f32d0 139 _rs = 0;
sjk127 0:00a9f58f32d0 140 writeByte(command);
sjk127 0:00a9f58f32d0 141 }
sjk127 0:00a9f58f32d0 142
sjk127 0:00a9f58f32d0 143 void TextLCD::writeData(int data) {
sjk127 0:00a9f58f32d0 144 _rs = 1;
sjk127 0:00a9f58f32d0 145 writeByte(data);
sjk127 0:00a9f58f32d0 146 _column++;
sjk127 0:00a9f58f32d0 147 if(_column >= _columns) {
sjk127 0:00a9f58f32d0 148 newline();
sjk127 0:00a9f58f32d0 149 }
sjk127 0:00a9f58f32d0 150 }