Demo Clock with Nucleo-F303RE and Starter Shield
Dependents: Nucleo_StarterShileld_Clock mojo main job ... more
TM1636.cpp@1:e4450fb0849a, 2018-05-03 (annotated)
- Committer:
- rogerzuber
- Date:
- Thu May 03 07:54:17 2018 +0000
- Revision:
- 1:e4450fb0849a
- Parent:
- 0:864e710889fa
Erste Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rogerzuber | 0:864e710889fa | 1 | // Author:Frankie.Chu |
rogerzuber | 0:864e710889fa | 2 | // Date:9 April,2012 |
rogerzuber | 0:864e710889fa | 3 | // |
rogerzuber | 0:864e710889fa | 4 | // This library is free software; you can redistribute it and/or |
rogerzuber | 0:864e710889fa | 5 | // modify it under the terms of the GNU Lesser General Public |
rogerzuber | 0:864e710889fa | 6 | // License as published by the Free Software Foundation; either |
rogerzuber | 0:864e710889fa | 7 | // version 2.1 of the License, or (at your option) any later version. |
rogerzuber | 0:864e710889fa | 8 | // |
rogerzuber | 0:864e710889fa | 9 | // This library is distributed in the hope that it will be useful, |
rogerzuber | 0:864e710889fa | 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
rogerzuber | 0:864e710889fa | 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
rogerzuber | 0:864e710889fa | 12 | // Lesser General Public License for more details. |
rogerzuber | 0:864e710889fa | 13 | // |
rogerzuber | 0:864e710889fa | 14 | // You should have received a copy of the GNU Lesser General Public |
rogerzuber | 0:864e710889fa | 15 | // License along with this library; if not, write to the Free Software |
rogerzuber | 0:864e710889fa | 16 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
rogerzuber | 0:864e710889fa | 17 | // |
rogerzuber | 0:864e710889fa | 18 | // Modified record: |
rogerzuber | 0:864e710889fa | 19 | // |
rogerzuber | 0:864e710889fa | 20 | /*******************************************************************************/ |
rogerzuber | 0:864e710889fa | 21 | #include "TM1636.h" |
rogerzuber | 0:864e710889fa | 22 | #include "mbed.h" |
rogerzuber | 0:864e710889fa | 23 | |
rogerzuber | 0:864e710889fa | 24 | static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, |
rogerzuber | 0:864e710889fa | 25 | 0x66,0x6d,0x7d,0x07, |
rogerzuber | 0:864e710889fa | 26 | 0x7f,0x6f,0x77,0x7c, |
rogerzuber | 0:864e710889fa | 27 | 0x39,0x5e,0x79,0x71, |
rogerzuber | 0:864e710889fa | 28 | 0x40,0x00}; //0~9,A,b,C,d,E,F,"-"," " |
rogerzuber | 0:864e710889fa | 29 | |
rogerzuber | 0:864e710889fa | 30 | TM1636::TM1636(PinName Clk, PinName Data) |
rogerzuber | 0:864e710889fa | 31 | : Clkpin(Clk), Datapin(Data) |
rogerzuber | 0:864e710889fa | 32 | { |
rogerzuber | 0:864e710889fa | 33 | Datapin.output(); |
rogerzuber | 0:864e710889fa | 34 | Clkpin.output(); |
rogerzuber | 0:864e710889fa | 35 | } |
rogerzuber | 0:864e710889fa | 36 | |
rogerzuber | 0:864e710889fa | 37 | /*Set the default brightness is BRIGHT_TYPICAL and clear the display*/ |
rogerzuber | 0:864e710889fa | 38 | void TM1636::init(void) |
rogerzuber | 0:864e710889fa | 39 | { |
rogerzuber | 0:864e710889fa | 40 | set(BRIGHTEST); |
rogerzuber | 0:864e710889fa | 41 | clearDisplay(); |
rogerzuber | 0:864e710889fa | 42 | } |
rogerzuber | 0:864e710889fa | 43 | |
rogerzuber | 0:864e710889fa | 44 | void TM1636::writeByte(int8_t wr_data) |
rogerzuber | 0:864e710889fa | 45 | { |
rogerzuber | 0:864e710889fa | 46 | uint8_t i,count1; |
rogerzuber | 0:864e710889fa | 47 | for(i=0;i<8;i++) // sent 8bit data |
rogerzuber | 0:864e710889fa | 48 | { |
rogerzuber | 0:864e710889fa | 49 | Clkpin = LOW; |
rogerzuber | 0:864e710889fa | 50 | if(wr_data & 0x01) Datapin = HIGH; // LSB first |
rogerzuber | 0:864e710889fa | 51 | else Datapin = LOW; |
rogerzuber | 0:864e710889fa | 52 | wr_data >>= 1; |
rogerzuber | 0:864e710889fa | 53 | Clkpin = HIGH; |
rogerzuber | 0:864e710889fa | 54 | } |
rogerzuber | 0:864e710889fa | 55 | Clkpin = LOW; //wait for the ACK |
rogerzuber | 0:864e710889fa | 56 | Datapin = HIGH; |
rogerzuber | 0:864e710889fa | 57 | Clkpin = HIGH; |
rogerzuber | 0:864e710889fa | 58 | Datapin.input(); |
rogerzuber | 0:864e710889fa | 59 | while(Datapin) |
rogerzuber | 0:864e710889fa | 60 | { |
rogerzuber | 0:864e710889fa | 61 | count1 +=1; |
rogerzuber | 0:864e710889fa | 62 | if(count1 == 200) |
rogerzuber | 0:864e710889fa | 63 | { |
rogerzuber | 0:864e710889fa | 64 | Datapin.output(); |
rogerzuber | 0:864e710889fa | 65 | Datapin = LOW; |
rogerzuber | 0:864e710889fa | 66 | count1 =0; |
rogerzuber | 0:864e710889fa | 67 | } |
rogerzuber | 0:864e710889fa | 68 | Datapin.input(); |
rogerzuber | 0:864e710889fa | 69 | } |
rogerzuber | 0:864e710889fa | 70 | Datapin.output(); |
rogerzuber | 0:864e710889fa | 71 | } |
rogerzuber | 0:864e710889fa | 72 | |
rogerzuber | 0:864e710889fa | 73 | //send start signal to TM1636 |
rogerzuber | 0:864e710889fa | 74 | void TM1636::start(void) |
rogerzuber | 0:864e710889fa | 75 | { |
rogerzuber | 0:864e710889fa | 76 | Clkpin = HIGH; //send start signal to TM1637 |
rogerzuber | 0:864e710889fa | 77 | Datapin = HIGH; |
rogerzuber | 0:864e710889fa | 78 | Datapin = LOW; |
rogerzuber | 0:864e710889fa | 79 | Clkpin = LOW; |
rogerzuber | 0:864e710889fa | 80 | } |
rogerzuber | 0:864e710889fa | 81 | |
rogerzuber | 0:864e710889fa | 82 | //End of transmission |
rogerzuber | 0:864e710889fa | 83 | void TM1636::stop(void) |
rogerzuber | 0:864e710889fa | 84 | { |
rogerzuber | 0:864e710889fa | 85 | Clkpin = LOW; |
rogerzuber | 0:864e710889fa | 86 | Datapin = LOW; |
rogerzuber | 0:864e710889fa | 87 | Clkpin = HIGH; |
rogerzuber | 0:864e710889fa | 88 | Datapin = HIGH; |
rogerzuber | 0:864e710889fa | 89 | } |
rogerzuber | 0:864e710889fa | 90 | |
rogerzuber | 0:864e710889fa | 91 | //display function.Write to full-screen. |
rogerzuber | 0:864e710889fa | 92 | void TM1636::display(int8_t DispData[]) |
rogerzuber | 0:864e710889fa | 93 | { |
rogerzuber | 0:864e710889fa | 94 | int8_t SegData[4]; |
rogerzuber | 0:864e710889fa | 95 | uint8_t i; |
rogerzuber | 0:864e710889fa | 96 | for(i = 0;i < 4;i ++) |
rogerzuber | 0:864e710889fa | 97 | { |
rogerzuber | 0:864e710889fa | 98 | SegData[i] = DispData[i]; |
rogerzuber | 0:864e710889fa | 99 | } |
rogerzuber | 0:864e710889fa | 100 | coding(SegData); |
rogerzuber | 0:864e710889fa | 101 | start(); //start signal sent to TM1637 from MCU |
rogerzuber | 0:864e710889fa | 102 | writeByte(ADDR_AUTO); |
rogerzuber | 0:864e710889fa | 103 | stop(); |
rogerzuber | 0:864e710889fa | 104 | start(); |
rogerzuber | 0:864e710889fa | 105 | writeByte(Cmd_SetAddr); |
rogerzuber | 0:864e710889fa | 106 | for(i=0;i < 4;i ++) |
rogerzuber | 0:864e710889fa | 107 | { |
rogerzuber | 0:864e710889fa | 108 | writeByte(SegData[i]); |
rogerzuber | 0:864e710889fa | 109 | } |
rogerzuber | 0:864e710889fa | 110 | stop(); |
rogerzuber | 0:864e710889fa | 111 | start(); |
rogerzuber | 0:864e710889fa | 112 | writeByte(Cmd_DispCtrl); |
rogerzuber | 0:864e710889fa | 113 | stop(); |
rogerzuber | 0:864e710889fa | 114 | } |
rogerzuber | 0:864e710889fa | 115 | |
rogerzuber | 0:864e710889fa | 116 | //****************************************** |
rogerzuber | 0:864e710889fa | 117 | void TM1636::display(uint8_t BitAddr,int8_t DispData) |
rogerzuber | 0:864e710889fa | 118 | { |
rogerzuber | 0:864e710889fa | 119 | int8_t SegData; |
rogerzuber | 0:864e710889fa | 120 | SegData = coding(DispData); |
rogerzuber | 0:864e710889fa | 121 | start(); //start signal sent to TM1637 from MCU |
rogerzuber | 0:864e710889fa | 122 | writeByte(ADDR_FIXED); |
rogerzuber | 0:864e710889fa | 123 | stop(); |
rogerzuber | 0:864e710889fa | 124 | start(); |
rogerzuber | 0:864e710889fa | 125 | writeByte(BitAddr|0xc0); |
rogerzuber | 0:864e710889fa | 126 | writeByte(SegData); |
rogerzuber | 0:864e710889fa | 127 | stop(); |
rogerzuber | 0:864e710889fa | 128 | start(); |
rogerzuber | 0:864e710889fa | 129 | writeByte(Cmd_DispCtrl); |
rogerzuber | 0:864e710889fa | 130 | stop(); |
rogerzuber | 0:864e710889fa | 131 | } |
rogerzuber | 0:864e710889fa | 132 | |
rogerzuber | 0:864e710889fa | 133 | void TM1636::clearDisplay(void) |
rogerzuber | 0:864e710889fa | 134 | { |
rogerzuber | 0:864e710889fa | 135 | display(0x00,0x7f); |
rogerzuber | 0:864e710889fa | 136 | display(0x01,0x7f); |
rogerzuber | 0:864e710889fa | 137 | display(0x02,0x7f); |
rogerzuber | 0:864e710889fa | 138 | display(0x03,0x7f); |
rogerzuber | 0:864e710889fa | 139 | } |
rogerzuber | 0:864e710889fa | 140 | |
rogerzuber | 0:864e710889fa | 141 | //To take effect the next time it displays. |
rogerzuber | 0:864e710889fa | 142 | void TM1636::set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr) |
rogerzuber | 0:864e710889fa | 143 | { |
rogerzuber | 0:864e710889fa | 144 | _brightness = brightness; |
rogerzuber | 0:864e710889fa | 145 | Cmd_SetData = SetData; |
rogerzuber | 0:864e710889fa | 146 | Cmd_SetAddr = SetAddr; |
rogerzuber | 0:864e710889fa | 147 | Cmd_DispCtrl = 0x88 + brightness; //Set the brightness and it takes effect the next time it displays. |
rogerzuber | 0:864e710889fa | 148 | } |
rogerzuber | 0:864e710889fa | 149 | |
rogerzuber | 0:864e710889fa | 150 | //Whether to light the clock point ":". |
rogerzuber | 0:864e710889fa | 151 | //To take effect the next time it displays. |
rogerzuber | 0:864e710889fa | 152 | void TM1636::point(bool PointFlag) |
rogerzuber | 0:864e710889fa | 153 | { |
rogerzuber | 0:864e710889fa | 154 | _PointFlag = PointFlag; |
rogerzuber | 0:864e710889fa | 155 | } |
rogerzuber | 0:864e710889fa | 156 | |
rogerzuber | 0:864e710889fa | 157 | void TM1636::coding(int8_t DispData[]) |
rogerzuber | 0:864e710889fa | 158 | { |
rogerzuber | 1:e4450fb0849a | 159 | int8_t PointData; |
rogerzuber | 1:e4450fb0849a | 160 | if(_PointFlag == POINT_ON) { |
rogerzuber | 1:e4450fb0849a | 161 | PointData = 0x80; |
rogerzuber | 1:e4450fb0849a | 162 | } |
rogerzuber | 1:e4450fb0849a | 163 | else { |
rogerzuber | 1:e4450fb0849a | 164 | PointData = 0x00; |
rogerzuber | 1:e4450fb0849a | 165 | } |
rogerzuber | 0:864e710889fa | 166 | for(uint8_t i = 0;i < 4;i ++) |
rogerzuber | 0:864e710889fa | 167 | { |
rogerzuber | 1:e4450fb0849a | 168 | if(DispData[i] == 0x7f){ |
rogerzuber | 1:e4450fb0849a | 169 | DispData[i] = 0x00; |
rogerzuber | 1:e4450fb0849a | 170 | } |
rogerzuber | 1:e4450fb0849a | 171 | else { |
rogerzuber | 1:e4450fb0849a | 172 | DispData[i] = TubeTab[DispData[i]] + PointData; |
rogerzuber | 1:e4450fb0849a | 173 | } |
rogerzuber | 0:864e710889fa | 174 | } |
rogerzuber | 0:864e710889fa | 175 | } |
rogerzuber | 0:864e710889fa | 176 | |
rogerzuber | 0:864e710889fa | 177 | int8_t TM1636::coding(int8_t DispData) |
rogerzuber | 0:864e710889fa | 178 | { |
rogerzuber | 1:e4450fb0849a | 179 | int8_t PointData; |
rogerzuber | 1:e4450fb0849a | 180 | if(_PointFlag == POINT_ON){ |
rogerzuber | 1:e4450fb0849a | 181 | PointData = 0x80; |
rogerzuber | 1:e4450fb0849a | 182 | } |
rogerzuber | 1:e4450fb0849a | 183 | else { |
rogerzuber | 1:e4450fb0849a | 184 | PointData = 0x00; |
rogerzuber | 1:e4450fb0849a | 185 | } |
rogerzuber | 1:e4450fb0849a | 186 | if (DispData == 0x7f) { |
rogerzuber | 1:e4450fb0849a | 187 | DispData = 0x00 + PointData; //The bit digital tube off |
rogerzuber | 1:e4450fb0849a | 188 | } |
rogerzuber | 1:e4450fb0849a | 189 | else { |
rogerzuber | 1:e4450fb0849a | 190 | DispData = TubeTab[DispData] + PointData; |
rogerzuber | 1:e4450fb0849a | 191 | } |
rogerzuber | 0:864e710889fa | 192 | return DispData; |
rogerzuber | 0:864e710889fa | 193 | } |