GHI Electronics
/
Official_PowerMate
The preloaded firmware shipped on the PowerMate
character_display/character_display.cpp@0:c0f091562db4, 2014-12-02 (annotated)
- Committer:
- Experiment626
- Date:
- Tue Dec 02 19:58:25 2014 +0000
- Revision:
- 0:c0f091562db4
Initial PowerMate Official Firmware
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Experiment626 | 0:c0f091562db4 | 1 | /* |
Experiment626 | 0:c0f091562db4 | 2 | Copyright 2013 GHI Electronics LLC |
Experiment626 | 0:c0f091562db4 | 3 | |
Experiment626 | 0:c0f091562db4 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); |
Experiment626 | 0:c0f091562db4 | 5 | you may not use this file except in compliance with the License. |
Experiment626 | 0:c0f091562db4 | 6 | You may obtain a copy of the License at |
Experiment626 | 0:c0f091562db4 | 7 | |
Experiment626 | 0:c0f091562db4 | 8 | http://www.apache.org/licenses/LICENSE-2.0 |
Experiment626 | 0:c0f091562db4 | 9 | |
Experiment626 | 0:c0f091562db4 | 10 | Unless required by applicable law or agreed to in writing, software |
Experiment626 | 0:c0f091562db4 | 11 | distributed under the License is distributed on an "AS IS" BASIS, |
Experiment626 | 0:c0f091562db4 | 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Experiment626 | 0:c0f091562db4 | 13 | See the License for the specific language governing permissions and |
Experiment626 | 0:c0f091562db4 | 14 | limitations under the License. |
Experiment626 | 0:c0f091562db4 | 15 | */ |
Experiment626 | 0:c0f091562db4 | 16 | |
Experiment626 | 0:c0f091562db4 | 17 | #include "mbed.h" |
Experiment626 | 0:c0f091562db4 | 18 | #include "character_display.h" |
Experiment626 | 0:c0f091562db4 | 19 | |
Experiment626 | 0:c0f091562db4 | 20 | |
Experiment626 | 0:c0f091562db4 | 21 | character_display::character_display( |
Experiment626 | 0:c0f091562db4 | 22 | PinName a_lcd_rs |
Experiment626 | 0:c0f091562db4 | 23 | ,PinName a_lcd_e |
Experiment626 | 0:c0f091562db4 | 24 | ,PinName a_lcd_d4 |
Experiment626 | 0:c0f091562db4 | 25 | ,PinName a_lcd_d5 |
Experiment626 | 0:c0f091562db4 | 26 | ,PinName a_lcd_d6 |
Experiment626 | 0:c0f091562db4 | 27 | ,PinName a_lcd_d7 |
Experiment626 | 0:c0f091562db4 | 28 | ) : |
Experiment626 | 0:c0f091562db4 | 29 | lcd_rs( a_lcd_rs,false) |
Experiment626 | 0:c0f091562db4 | 30 | , lcd_e( a_lcd_e,false) |
Experiment626 | 0:c0f091562db4 | 31 | , lcd_d4( a_lcd_d4,false) |
Experiment626 | 0:c0f091562db4 | 32 | , lcd_d5( a_lcd_d5,false) |
Experiment626 | 0:c0f091562db4 | 33 | , lcd_d6( a_lcd_d6,false) |
Experiment626 | 0:c0f091562db4 | 34 | , lcd_d7( a_lcd_d7,false) |
Experiment626 | 0:c0f091562db4 | 35 | { |
Experiment626 | 0:c0f091562db4 | 36 | lcd_rs=0; // command mode |
Experiment626 | 0:c0f091562db4 | 37 | wait_ms(2); // set-up time |
Experiment626 | 0:c0f091562db4 | 38 | for (int i=0; i<3; i++) { |
Experiment626 | 0:c0f091562db4 | 39 | send_nibble(0x3); |
Experiment626 | 0:c0f091562db4 | 40 | wait_ms(15); |
Experiment626 | 0:c0f091562db4 | 41 | } |
Experiment626 | 0:c0f091562db4 | 42 | send_nibble(0x02); // 4 bit mode |
Experiment626 | 0:c0f091562db4 | 43 | wait_us(40); |
Experiment626 | 0:c0f091562db4 | 44 | |
Experiment626 | 0:c0f091562db4 | 45 | send_command(character_display::FUNCTION_SET); // characteristics of display |
Experiment626 | 0:c0f091562db4 | 46 | clear(); |
Experiment626 | 0:c0f091562db4 | 47 | cursor_home(); |
Experiment626 | 0:c0f091562db4 | 48 | send_command(character_display::MODE_SET); |
Experiment626 | 0:c0f091562db4 | 49 | send_command(character_display::CUR_V_SHIFT); |
Experiment626 | 0:c0f091562db4 | 50 | send_command(character_display::DISP_ON); |
Experiment626 | 0:c0f091562db4 | 51 | |
Experiment626 | 0:c0f091562db4 | 52 | |
Experiment626 | 0:c0f091562db4 | 53 | wait_ms(4); |
Experiment626 | 0:c0f091562db4 | 54 | } |
Experiment626 | 0:c0f091562db4 | 55 | |
Experiment626 | 0:c0f091562db4 | 56 | |
Experiment626 | 0:c0f091562db4 | 57 | |
Experiment626 | 0:c0f091562db4 | 58 | |
Experiment626 | 0:c0f091562db4 | 59 | void character_display::send_nibble(unsigned char b) |
Experiment626 | 0:c0f091562db4 | 60 | { |
Experiment626 | 0:c0f091562db4 | 61 | lcd_e.write(true); |
Experiment626 | 0:c0f091562db4 | 62 | lcd_d7.write((b & 0x8) != 0); |
Experiment626 | 0:c0f091562db4 | 63 | lcd_d6.write((b & 0x4) != 0); |
Experiment626 | 0:c0f091562db4 | 64 | lcd_d5.write((b & 0x2) != 0); |
Experiment626 | 0:c0f091562db4 | 65 | lcd_d4.write((b & 0x1) != 0); |
Experiment626 | 0:c0f091562db4 | 66 | wait_us(1); |
Experiment626 | 0:c0f091562db4 | 67 | lcd_e.write(false); // enable data sampling |
Experiment626 | 0:c0f091562db4 | 68 | wait_us(1); |
Experiment626 | 0:c0f091562db4 | 69 | } |
Experiment626 | 0:c0f091562db4 | 70 | |
Experiment626 | 0:c0f091562db4 | 71 | void character_display::send_byte(unsigned char b) |
Experiment626 | 0:c0f091562db4 | 72 | { |
Experiment626 | 0:c0f091562db4 | 73 | |
Experiment626 | 0:c0f091562db4 | 74 | send_nibble(b >> 4); |
Experiment626 | 0:c0f091562db4 | 75 | send_nibble(b); |
Experiment626 | 0:c0f091562db4 | 76 | } |
Experiment626 | 0:c0f091562db4 | 77 | |
Experiment626 | 0:c0f091562db4 | 78 | void character_display::send_command(unsigned char c) |
Experiment626 | 0:c0f091562db4 | 79 | { |
Experiment626 | 0:c0f091562db4 | 80 | lcd_rs.write(false); //set LCD to command mode |
Experiment626 | 0:c0f091562db4 | 81 | wait_us(1); //for rs samplin |
Experiment626 | 0:c0f091562db4 | 82 | send_byte(c); |
Experiment626 | 0:c0f091562db4 | 83 | wait_us(40); |
Experiment626 | 0:c0f091562db4 | 84 | lcd_rs.write(true); //set LCD to data mode |
Experiment626 | 0:c0f091562db4 | 85 | wait_us(1); |
Experiment626 | 0:c0f091562db4 | 86 | } |
Experiment626 | 0:c0f091562db4 | 87 | |
Experiment626 | 0:c0f091562db4 | 88 | void character_display::print(const char* string) |
Experiment626 | 0:c0f091562db4 | 89 | { |
Experiment626 | 0:c0f091562db4 | 90 | while (*string != '\0') |
Experiment626 | 0:c0f091562db4 | 91 | print(*(string++)); |
Experiment626 | 0:c0f091562db4 | 92 | } |
Experiment626 | 0:c0f091562db4 | 93 | |
Experiment626 | 0:c0f091562db4 | 94 | void character_display::print(char character) |
Experiment626 | 0:c0f091562db4 | 95 | { |
Experiment626 | 0:c0f091562db4 | 96 | send_byte(character); |
Experiment626 | 0:c0f091562db4 | 97 | wait_us(40); |
Experiment626 | 0:c0f091562db4 | 98 | } |
Experiment626 | 0:c0f091562db4 | 99 | |
Experiment626 | 0:c0f091562db4 | 100 | void character_display::clear() |
Experiment626 | 0:c0f091562db4 | 101 | { |
Experiment626 | 0:c0f091562db4 | 102 | send_command(character_display::CLR_DISP); |
Experiment626 | 0:c0f091562db4 | 103 | wait_ms(10); |
Experiment626 | 0:c0f091562db4 | 104 | } |
Experiment626 | 0:c0f091562db4 | 105 | |
Experiment626 | 0:c0f091562db4 | 106 | void character_display::cursor_home() |
Experiment626 | 0:c0f091562db4 | 107 | { |
Experiment626 | 0:c0f091562db4 | 108 | send_command(character_display::CUR_HOME); |
Experiment626 | 0:c0f091562db4 | 109 | } |
Experiment626 | 0:c0f091562db4 | 110 | |
Experiment626 | 0:c0f091562db4 | 111 | void character_display::set_cursor(unsigned char row, unsigned char col) |
Experiment626 | 0:c0f091562db4 | 112 | { |
Experiment626 | 0:c0f091562db4 | 113 | char offsets[] = { 0x00, 0x40, 0x14, 0x54 }; |
Experiment626 | 0:c0f091562db4 | 114 | send_command(character_display::SET_CURSOR | offsets[row] | col); |
Experiment626 | 0:c0f091562db4 | 115 | } |