Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TextLCD_4x40/TextLCD_4x40.cpp@0:18d40dac71ff, 2012-05-29 (annotated)
- Committer:
- kevin_38
- Date:
- Tue May 29 09:30:20 2012 +0000
- Revision:
- 0:18d40dac71ff
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kevin_38 | 0:18d40dac71ff | 1 | /*Modification de :" mbed TextLCD Library, for a 4-bit LCD based on HD44780........" |
| kevin_38 | 0:18d40dac71ff | 2 | pour la commande d'un afficheur 4x40 (M4024) |
| kevin_38 | 0:18d40dac71ff | 3 | */ |
| kevin_38 | 0:18d40dac71ff | 4 | #include "TextLCD_4x40.h" |
| kevin_38 | 0:18d40dac71ff | 5 | #include "mbed.h" |
| kevin_38 | 0:18d40dac71ff | 6 | |
| kevin_38 | 0:18d40dac71ff | 7 | TextLCD_4x40::TextLCD_4x40(PinName rs, PinName e, PinName d0, PinName d1, PinName d2, PinName d3) : |
| kevin_38 | 0:18d40dac71ff | 8 | _rs(rs),_e(e), _d(d0, d1, d2, d3) { |
| kevin_38 | 0:18d40dac71ff | 9 | |
| kevin_38 | 0:18d40dac71ff | 10 | //------------------------------------- |
| kevin_38 | 0:18d40dac71ff | 11 | char euro_v1[8]={0x06,0x09,0x1c,0x08,0x1C,0x09,0x06,0}//symbole euro |
| kevin_38 | 0:18d40dac71ff | 12 | ,e_aigu[8] ={0x02,0x04,0x0e,0x11,0x1f,0x10,0x0e,0}//e accent aigu |
| kevin_38 | 0:18d40dac71ff | 13 | ; |
| kevin_38 | 0:18d40dac71ff | 14 | //------------------------------------- |
| kevin_38 | 0:18d40dac71ff | 15 | char i; |
| kevin_38 | 0:18d40dac71ff | 16 | _e = 1; |
| kevin_38 | 0:18d40dac71ff | 17 | _rs = 0; // command mode |
| kevin_38 | 0:18d40dac71ff | 18 | |
| kevin_38 | 0:18d40dac71ff | 19 | wait_ms(15); // Wait 15ms to ensure powered up |
| kevin_38 | 0:18d40dac71ff | 20 | |
| kevin_38 | 0:18d40dac71ff | 21 | // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) |
| kevin_38 | 0:18d40dac71ff | 22 | for (char i=0; i<3; i++) { |
| kevin_38 | 0:18d40dac71ff | 23 | writeByte(0x3); |
| kevin_38 | 0:18d40dac71ff | 24 | wait_us(1640); // this command takes 1.64ms, so wait for it |
| kevin_38 | 0:18d40dac71ff | 25 | } |
| kevin_38 | 0:18d40dac71ff | 26 | writeByte(0x2); // 4-bit mode |
| kevin_38 | 0:18d40dac71ff | 27 | wait_us(40); // most instructions take 40us |
| kevin_38 | 0:18d40dac71ff | 28 | |
| kevin_38 | 0:18d40dac71ff | 29 | writeCommand(0x28); // Function set 001 BW N F - - |
| kevin_38 | 0:18d40dac71ff | 30 | writeCommand(0x0C); |
| kevin_38 | 0:18d40dac71ff | 31 | writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes |
| kevin_38 | 0:18d40dac71ff | 32 | cls(); |
| kevin_38 | 0:18d40dac71ff | 33 | wait_ms(6); |
| kevin_38 | 0:18d40dac71ff | 34 | |
| kevin_38 | 0:18d40dac71ff | 35 | ////////////////////// Generateur de caracteres //////////////////////////////// |
| kevin_38 | 0:18d40dac71ff | 36 | //........ chargement du 1er caractere ......... |
| kevin_38 | 0:18d40dac71ff | 37 | for(i=0;i<=7;i++){ |
| kevin_38 | 0:18d40dac71ff | 38 | writeCommand(0x40+i); |
| kevin_38 | 0:18d40dac71ff | 39 | writeData(e_aigu[i]); |
| kevin_38 | 0:18d40dac71ff | 40 | } |
| kevin_38 | 0:18d40dac71ff | 41 | //........ chargement du 2eme caractere ......... |
| kevin_38 | 0:18d40dac71ff | 42 | for(i=0;i<=7;i++){ |
| kevin_38 | 0:18d40dac71ff | 43 | writeCommand(0x48+i); |
| kevin_38 | 0:18d40dac71ff | 44 | writeData(euro_v1[i]); |
| kevin_38 | 0:18d40dac71ff | 45 | } |
| kevin_38 | 0:18d40dac71ff | 46 | /////////////////////// Fin du generateur de caracteres /////////////////////// |
| kevin_38 | 0:18d40dac71ff | 47 | |
| kevin_38 | 0:18d40dac71ff | 48 | writeCommand(2);// "home" pour que l'afficheur soit pret a afficher, |
| kevin_38 | 0:18d40dac71ff | 49 | // pour sortir du generateur de caracteres |
| kevin_38 | 0:18d40dac71ff | 50 | } |
| kevin_38 | 0:18d40dac71ff | 51 | |
| kevin_38 | 0:18d40dac71ff | 52 | void TextLCD_4x40::character(char column, char row, char c) { |
| kevin_38 | 0:18d40dac71ff | 53 | char a = address(column, row); |
| kevin_38 | 0:18d40dac71ff | 54 | writeCommand(a); |
| kevin_38 | 0:18d40dac71ff | 55 | writeData(c); |
| kevin_38 | 0:18d40dac71ff | 56 | } |
| kevin_38 | 0:18d40dac71ff | 57 | |
| kevin_38 | 0:18d40dac71ff | 58 | void TextLCD_4x40::cls() { |
| kevin_38 | 0:18d40dac71ff | 59 | writeCommand(0x01); // cls, and set cursor to 0 |
| kevin_38 | 0:18d40dac71ff | 60 | wait_us(1640); // This command takes 1.64 ms |
| kevin_38 | 0:18d40dac71ff | 61 | // locate(0, 0); |
| kevin_38 | 0:18d40dac71ff | 62 | } |
| kevin_38 | 0:18d40dac71ff | 63 | |
| kevin_38 | 0:18d40dac71ff | 64 | void TextLCD_4x40::locate(char column, char row) { |
| kevin_38 | 0:18d40dac71ff | 65 | _column = column; |
| kevin_38 | 0:18d40dac71ff | 66 | _row = row; |
| kevin_38 | 0:18d40dac71ff | 67 | } |
| kevin_38 | 0:18d40dac71ff | 68 | |
| kevin_38 | 0:18d40dac71ff | 69 | //----------------------------- |
| kevin_38 | 0:18d40dac71ff | 70 | int TextLCD_4x40::_putc(int value) { |
| kevin_38 | 0:18d40dac71ff | 71 | switch(value) |
| kevin_38 | 0:18d40dac71ff | 72 | { |
| kevin_38 | 0:18d40dac71ff | 73 | case '\f': |
| kevin_38 | 0:18d40dac71ff | 74 | cls(); |
| kevin_38 | 0:18d40dac71ff | 75 | break; |
| kevin_38 | 0:18d40dac71ff | 76 | |
| kevin_38 | 0:18d40dac71ff | 77 | case '\n': |
| kevin_38 | 0:18d40dac71ff | 78 | _column = 0; |
| kevin_38 | 0:18d40dac71ff | 79 | _row++; |
| kevin_38 | 0:18d40dac71ff | 80 | if (_row >= 2) { |
| kevin_38 | 0:18d40dac71ff | 81 | _row = 0; |
| kevin_38 | 0:18d40dac71ff | 82 | } |
| kevin_38 | 0:18d40dac71ff | 83 | break; |
| kevin_38 | 0:18d40dac71ff | 84 | |
| kevin_38 | 0:18d40dac71ff | 85 | case '\b': |
| kevin_38 | 0:18d40dac71ff | 86 | writeCommand(0x10); |
| kevin_38 | 0:18d40dac71ff | 87 | break; |
| kevin_38 | 0:18d40dac71ff | 88 | |
| kevin_38 | 0:18d40dac71ff | 89 | case '\1': |
| kevin_38 | 0:18d40dac71ff | 90 | writeData(0); |
| kevin_38 | 0:18d40dac71ff | 91 | break; |
| kevin_38 | 0:18d40dac71ff | 92 | case '\2': |
| kevin_38 | 0:18d40dac71ff | 93 | writeData(1); |
| kevin_38 | 0:18d40dac71ff | 94 | break; |
| kevin_38 | 0:18d40dac71ff | 95 | default: |
| kevin_38 | 0:18d40dac71ff | 96 | writeData(value); |
| kevin_38 | 0:18d40dac71ff | 97 | break; |
| kevin_38 | 0:18d40dac71ff | 98 | } |
| kevin_38 | 0:18d40dac71ff | 99 | return value; |
| kevin_38 | 0:18d40dac71ff | 100 | } |
| kevin_38 | 0:18d40dac71ff | 101 | //----------------------------- |
| kevin_38 | 0:18d40dac71ff | 102 | int TextLCD_4x40::_getc() { |
| kevin_38 | 0:18d40dac71ff | 103 | return -1; |
| kevin_38 | 0:18d40dac71ff | 104 | } |
| kevin_38 | 0:18d40dac71ff | 105 | |
| kevin_38 | 0:18d40dac71ff | 106 | void TextLCD_4x40::writeByte(char value) { |
| kevin_38 | 0:18d40dac71ff | 107 | _d = value >> 4; |
| kevin_38 | 0:18d40dac71ff | 108 | wait_us(40); // most instructions take 40us |
| kevin_38 | 0:18d40dac71ff | 109 | _e = 0; |
| kevin_38 | 0:18d40dac71ff | 110 | wait_us(40); |
| kevin_38 | 0:18d40dac71ff | 111 | _e = 1; |
| kevin_38 | 0:18d40dac71ff | 112 | _d = value >> 0; |
| kevin_38 | 0:18d40dac71ff | 113 | wait_us(40); |
| kevin_38 | 0:18d40dac71ff | 114 | _e = 0; |
| kevin_38 | 0:18d40dac71ff | 115 | wait_us(40); // most instructions take 40us |
| kevin_38 | 0:18d40dac71ff | 116 | _e = 1; |
| kevin_38 | 0:18d40dac71ff | 117 | } |
| kevin_38 | 0:18d40dac71ff | 118 | |
| kevin_38 | 0:18d40dac71ff | 119 | void TextLCD_4x40::writeCommand(char command) { |
| kevin_38 | 0:18d40dac71ff | 120 | _rs = 0; |
| kevin_38 | 0:18d40dac71ff | 121 | writeByte(command); |
| kevin_38 | 0:18d40dac71ff | 122 | } |
| kevin_38 | 0:18d40dac71ff | 123 | |
| kevin_38 | 0:18d40dac71ff | 124 | void TextLCD_4x40::writeData(char data) { |
| kevin_38 | 0:18d40dac71ff | 125 | _rs = 1; |
| kevin_38 | 0:18d40dac71ff | 126 | writeByte(data); |
| kevin_38 | 0:18d40dac71ff | 127 | } |
| kevin_38 | 0:18d40dac71ff | 128 | |
| kevin_38 | 0:18d40dac71ff | 129 | char TextLCD_4x40::address(char column, char row) { |
| kevin_38 | 0:18d40dac71ff | 130 | return 0x80 + (row * 0x40) + column; |
| kevin_38 | 0:18d40dac71ff | 131 | } |