The preloaded firmware shipped on the PowerMate

Dependencies:   USBDevice mbed

Committer:
Experiment626
Date:
Thu Dec 04 19:10:52 2014 +0000
Revision:
1:ea25641678f7
Parent:
0:c0f091562db4
Changed the voltage output precision to two places.

Who changed what in which revision?

UserRevisionLine numberNew 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 }