Demo Clock with Nucleo-F303RE and Starter Shield

Dependents:   Nucleo_StarterShileld_Clock mojo main job ... more

Committer:
rogerzuber
Date:
Thu May 18 08:02:54 2017 +0000
Revision:
0:864e710889fa
Child:
1:e4450fb0849a
Demo Clock with Nucleo-F303RE and Starter Shield

Who changed what in which revision?

UserRevisionLine numberNew 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 0:864e710889fa 159 uint8_t PointData;
rogerzuber 0:864e710889fa 160 if(_PointFlag == POINT_ON)PointData = 0x80;
rogerzuber 0:864e710889fa 161 else PointData = 0;
rogerzuber 0:864e710889fa 162 for(uint8_t i = 0;i < 4;i ++)
rogerzuber 0:864e710889fa 163 {
rogerzuber 0:864e710889fa 164 if(DispData[i] == 0x7f)DispData[i] = 0x00;
rogerzuber 0:864e710889fa 165 else DispData[i] = TubeTab[DispData[i]] + PointData;
rogerzuber 0:864e710889fa 166 }
rogerzuber 0:864e710889fa 167 }
rogerzuber 0:864e710889fa 168
rogerzuber 0:864e710889fa 169 int8_t TM1636::coding(int8_t DispData)
rogerzuber 0:864e710889fa 170 {
rogerzuber 0:864e710889fa 171 uint8_t PointData;
rogerzuber 0:864e710889fa 172 if(_PointFlag == POINT_ON)PointData = 0x80;
rogerzuber 0:864e710889fa 173 else PointData = 0;
rogerzuber 0:864e710889fa 174 if(DispData == 0x7f) DispData = 0x00 + PointData; //The bit digital tube off
rogerzuber 0:864e710889fa 175 else DispData = TubeTab[DispData] + PointData;
rogerzuber 0:864e710889fa 176 return DispData;
rogerzuber 0:864e710889fa 177 }