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.
main.cpp@1:009c799bb5d1, 2019-05-09 (annotated)
- Committer:
- kechbs
- Date:
- Thu May 09 17:09:02 2019 +0000
- Revision:
- 1:009c799bb5d1
- Parent:
- 0:1d2b7ae1269a
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kechbs | 0:1d2b7ae1269a | 1 | #include "main.h" |
kechbs | 1:009c799bb5d1 | 2 | #include <mbed.h> |
kechbs | 0:1d2b7ae1269a | 3 | #include "charmap.h" |
kechbs | 1:009c799bb5d1 | 4 | #include "stm32f70rb.h" |
kechbs | 0:1d2b7ae1269a | 5 | |
kechbs | 1:009c799bb5d1 | 6 | #define USE_PLL_HSE_XTAL (1) /* Use external xtal */ |
kechbs | 0:1d2b7ae1269a | 7 | |
kechbs | 0:1d2b7ae1269a | 8 | #define DIGIT_CONTROLLER_ID 0xA8 |
kechbs | 0:1d2b7ae1269a | 9 | #define SLEEP_INTERVAL 0.003f |
kechbs | 0:1d2b7ae1269a | 10 | |
kechbs | 0:1d2b7ae1269a | 11 | #define D_ON 0x3F |
kechbs | 0:1d2b7ae1269a | 12 | #define DISPLAYTIMEOUT 5 |
kechbs | 0:1d2b7ae1269a | 13 | |
kechbs | 0:1d2b7ae1269a | 14 | DigitalInOut shutdown(PB_7,PIN_OUTPUT,PullNone,1); |
kechbs | 0:1d2b7ae1269a | 15 | |
kechbs | 0:1d2b7ae1269a | 16 | DigitalInOut dig_1(PB_4,PIN_OUTPUT,OpenDrain,1); |
kechbs | 0:1d2b7ae1269a | 17 | DigitalInOut dig_2(PB_5,PIN_OUTPUT,OpenDrain,1); |
kechbs | 0:1d2b7ae1269a | 18 | DigitalInOut dig_3(PB_6,PIN_OUTPUT,OpenDrain,1); |
kechbs | 0:1d2b7ae1269a | 19 | I2C digit_driver(PB_9, PB_8); |
kechbs | 0:1d2b7ae1269a | 20 | |
kechbs | 0:1d2b7ae1269a | 21 | //SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk |
kechbs | 0:1d2b7ae1269a | 22 | SPISlave device(PA_7, PA_6, PA_5, PA_15); |
kechbs | 0:1d2b7ae1269a | 23 | //DigitalOut cs(PA_15); //should be cs but seems to be CE_E maybe mislabel |
kechbs | 1:009c799bb5d1 | 24 | int spiDATA[4]; |
kechbs | 1:009c799bb5d1 | 25 | |
kechbs | 1:009c799bb5d1 | 26 | |
kechbs | 0:1d2b7ae1269a | 27 | |
kechbs | 0:1d2b7ae1269a | 28 | int main() |
kechbs | 1:009c799bb5d1 | 29 | { |
kechbs | 1:009c799bb5d1 | 30 | //RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; |
kechbs | 1:009c799bb5d1 | 31 | //RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
kechbs | 1:009c799bb5d1 | 32 | //RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
kechbs | 1:009c799bb5d1 | 33 | //RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
kechbs | 0:1d2b7ae1269a | 34 | |
kechbs | 1:009c799bb5d1 | 35 | digit_driver.frequency(400000); |
kechbs | 0:1d2b7ae1269a | 36 | |
kechbs | 0:1d2b7ae1269a | 37 | char shutdown_reg[2]; |
kechbs | 0:1d2b7ae1269a | 38 | shutdown_reg[0] = 0x00; |
kechbs | 0:1d2b7ae1269a | 39 | shutdown_reg[1] = 0x01; |
kechbs | 0:1d2b7ae1269a | 40 | |
kechbs | 0:1d2b7ae1269a | 41 | //Command to |
kechbs | 0:1d2b7ae1269a | 42 | char updateI2C[2]; |
kechbs | 0:1d2b7ae1269a | 43 | updateI2C[0] = 0x16; |
kechbs | 0:1d2b7ae1269a | 44 | updateI2C[1] = 0xFF; |
kechbs | 0:1d2b7ae1269a | 45 | |
kechbs | 0:1d2b7ae1269a | 46 | //*************** CH 1-6 ENABLE BITS *************************************** |
kechbs | 0:1d2b7ae1269a | 47 | char ledBank1[2]; |
kechbs | 0:1d2b7ae1269a | 48 | ledBank1[0]=0x13; |
kechbs | 0:1d2b7ae1269a | 49 | ledBank1[1]=0xff; |
kechbs | 0:1d2b7ae1269a | 50 | //*************** CH 7-12 ENABLE BITS ************************************** |
kechbs | 0:1d2b7ae1269a | 51 | char ledBank2[2]; |
kechbs | 0:1d2b7ae1269a | 52 | ledBank2[0]=0x14; |
kechbs | 0:1d2b7ae1269a | 53 | ledBank2[1]=0xff; |
kechbs | 0:1d2b7ae1269a | 54 | //*************** CH 13-18 ENABLE BITS ************************************* |
kechbs | 0:1d2b7ae1269a | 55 | char ledBank3[2]; |
kechbs | 0:1d2b7ae1269a | 56 | ledBank3[0]=0x15; |
kechbs | 0:1d2b7ae1269a | 57 | ledBank3[1]=0xff; |
kechbs | 0:1d2b7ae1269a | 58 | |
kechbs | 0:1d2b7ae1269a | 59 | //Init programmable registers |
kechbs | 0:1d2b7ae1269a | 60 | shutdown = 1; |
kechbs | 0:1d2b7ae1269a | 61 | digit_driver.write(DIGIT_CONTROLLER_ID, shutdown_reg, 2); |
kechbs | 0:1d2b7ae1269a | 62 | wait(0.3); |
kechbs | 0:1d2b7ae1269a | 63 | |
kechbs | 0:1d2b7ae1269a | 64 | //************** SET BRIGHTNESS FOR ALL SEGMENTS *************************** |
kechbs | 0:1d2b7ae1269a | 65 | //If changed, must also modify segValDisp |
kechbs | 0:1d2b7ae1269a | 66 | char pwmData1[2]; |
kechbs | 0:1d2b7ae1269a | 67 | pwmData1[0]=0x01; |
kechbs | 0:1d2b7ae1269a | 68 | pwmData1[1]=0xFF; |
kechbs | 0:1d2b7ae1269a | 69 | |
kechbs | 0:1d2b7ae1269a | 70 | //******************* PWM FOR ALL BITS FOR REFRESH ************************* |
kechbs | 0:1d2b7ae1269a | 71 | for (pwmData1[0]=0x01; pwmData1[0] < 0x13; pwmData1[0]++){ |
kechbs | 0:1d2b7ae1269a | 72 | digit_driver.write(DIGIT_CONTROLLER_ID, pwmData1,2); |
kechbs | 0:1d2b7ae1269a | 73 | } |
kechbs | 0:1d2b7ae1269a | 74 | wait(0.1); |
kechbs | 0:1d2b7ae1269a | 75 | //********* SETUP LCD INPUTS FOR ALL BITS ********************************** |
kechbs | 0:1d2b7ae1269a | 76 | digit_driver.write(DIGIT_CONTROLLER_ID, ledBank1,2); |
kechbs | 0:1d2b7ae1269a | 77 | digit_driver.write(DIGIT_CONTROLLER_ID, ledBank2,2); |
kechbs | 0:1d2b7ae1269a | 78 | digit_driver.write(DIGIT_CONTROLLER_ID, ledBank3,2); |
kechbs | 0:1d2b7ae1269a | 79 | digit_driver.write(DIGIT_CONTROLLER_ID, updateI2C,2); |
kechbs | 0:1d2b7ae1269a | 80 | digit_driver.write(DIGIT_CONTROLLER_ID, shutdown_reg, 2); |
kechbs | 0:1d2b7ae1269a | 81 | wait(0.1); |
kechbs | 0:1d2b7ae1269a | 82 | |
kechbs | 0:1d2b7ae1269a | 83 | device.frequency(976000); |
kechbs | 0:1d2b7ae1269a | 84 | device.reply(0x00); |
kechbs | 0:1d2b7ae1269a | 85 | |
kechbs | 0:1d2b7ae1269a | 86 | int blinkRate = 50; |
kechbs | 0:1d2b7ae1269a | 87 | |
kechbs | 1:009c799bb5d1 | 88 | //*********** 70 seccond count for PI Modual boot time ******************** |
kechbs | 1:009c799bb5d1 | 89 | for (int j = 7; j >= 0; j--) { |
kechbs | 1:009c799bb5d1 | 90 | for (int i = 9; i >= 0; i--) { |
kechbs | 1:009c799bb5d1 | 91 | for (int x = 0; x <= 250; x++){ |
kechbs | 1:009c799bb5d1 | 92 | segValDisplay(j, 3); |
kechbs | 1:009c799bb5d1 | 93 | segValDisplay(i, 2); |
kechbs | 1:009c799bb5d1 | 94 | wait(0.001); |
kechbs | 1:009c799bb5d1 | 95 | } |
kechbs | 1:009c799bb5d1 | 96 | } |
kechbs | 1:009c799bb5d1 | 97 | } |
kechbs | 1:009c799bb5d1 | 98 | //************************************************************************** |
kechbs | 0:1d2b7ae1269a | 99 | |
kechbs | 0:1d2b7ae1269a | 100 | while(1) { |
kechbs | 0:1d2b7ae1269a | 101 | //Check if data exists on SPI BUSS |
kechbs | 0:1d2b7ae1269a | 102 | if(device.receive()) { |
kechbs | 0:1d2b7ae1269a | 103 | //Save both bytes of data |
kechbs | 0:1d2b7ae1269a | 104 | for (int i = 0; i < 2; i++) { |
kechbs | 0:1d2b7ae1269a | 105 | spiDATA[i] = device.read(); |
kechbs | 0:1d2b7ae1269a | 106 | } |
kechbs | 0:1d2b7ae1269a | 107 | |
kechbs | 0:1d2b7ae1269a | 108 | } |
kechbs | 0:1d2b7ae1269a | 109 | //spiDATA[1] = 1; |
kechbs | 0:1d2b7ae1269a | 110 | //Check if LCD should blink data and set time accordingly |
kechbs | 0:1d2b7ae1269a | 111 | if (spiDATA[1] == 0){ |
kechbs | 0:1d2b7ae1269a | 112 | blinkRate--; |
kechbs | 0:1d2b7ae1269a | 113 | }else{ |
kechbs | 0:1d2b7ae1269a | 114 | blinkRate = 50; |
kechbs | 0:1d2b7ae1269a | 115 | } |
kechbs | 0:1d2b7ae1269a | 116 | |
kechbs | 0:1d2b7ae1269a | 117 | //Loop display for 5 cycles to minimize flicker before checking |
kechbs | 0:1d2b7ae1269a | 118 | //SPI BUSS |
kechbs | 0:1d2b7ae1269a | 119 | for(int i = 0; i < 4; i++) { |
kechbs | 0:1d2b7ae1269a | 120 | if (spiDATA[0] == 0) { // || blinkRate > 150) |
kechbs | 0:1d2b7ae1269a | 121 | dig_1 = 1; dig_2 = 1; dig_3 = 1; |
kechbs | 0:1d2b7ae1269a | 122 | }else{ |
kechbs | 0:1d2b7ae1269a | 123 | segValDisplay(spiDATA[0] ,1); |
kechbs | 1:009c799bb5d1 | 124 | segValDisplay(18, 2); |
kechbs | 1:009c799bb5d1 | 125 | segValDisplay(13, 3); |
kechbs | 0:1d2b7ae1269a | 126 | } |
kechbs | 0:1d2b7ae1269a | 127 | if (blinkRate <= 25) { |
kechbs | 0:1d2b7ae1269a | 128 | dig_1 = 1; dig_2 = 1; dig_3 = 1; |
kechbs | 0:1d2b7ae1269a | 129 | segValDisplay(-1 ,1); |
kechbs | 0:1d2b7ae1269a | 130 | segValDisplay(-1, 2); |
kechbs | 0:1d2b7ae1269a | 131 | segValDisplay(-1, 3); |
kechbs | 0:1d2b7ae1269a | 132 | } |
kechbs | 0:1d2b7ae1269a | 133 | } |
kechbs | 0:1d2b7ae1269a | 134 | |
kechbs | 0:1d2b7ae1269a | 135 | if (blinkRate < 0){blinkRate = 50;} |
kechbs | 0:1d2b7ae1269a | 136 | } |
kechbs | 0:1d2b7ae1269a | 137 | } |
kechbs | 0:1d2b7ae1269a | 138 | |
kechbs | 0:1d2b7ae1269a | 139 | void segValDisplay (int val, int dispNum) { |
kechbs | 0:1d2b7ae1269a | 140 | //Turn off all illumination for refresh |
kechbs | 0:1d2b7ae1269a | 141 | if (dispNum == 1 || dispNum == 2 || dispNum == 3){dig_1 = 1;dig_2 = 1;dig_3 = 1;} |
kechbs | 0:1d2b7ae1269a | 142 | |
kechbs | 0:1d2b7ae1269a | 143 | uint8_t GraphicSeg[4]; |
kechbs | 0:1d2b7ae1269a | 144 | char updateI2C[2]; |
kechbs | 0:1d2b7ae1269a | 145 | updateI2C[0] = 0x16; |
kechbs | 0:1d2b7ae1269a | 146 | updateI2C[1] = 0xFF; |
kechbs | 0:1d2b7ae1269a | 147 | //get charmap for chosen val |
kechbs | 0:1d2b7ae1269a | 148 | GraphicSeg[0] = 0x13; |
kechbs | 0:1d2b7ae1269a | 149 | GraphicSeg[1] = SegTable[1 + val][2]; |
kechbs | 0:1d2b7ae1269a | 150 | GraphicSeg[2] = SegTable[1 + val][1]; |
kechbs | 0:1d2b7ae1269a | 151 | GraphicSeg[3] = SegTable[1 + val][0]; |
kechbs | 0:1d2b7ae1269a | 152 | digit_driver.write(DIGIT_CONTROLLER_ID, (char *)GraphicSeg, 4); |
kechbs | 0:1d2b7ae1269a | 153 | digit_driver.write(DIGIT_CONTROLLER_ID, updateI2C, 2); |
kechbs | 0:1d2b7ae1269a | 154 | //turn on current digit leaving un-refreshed digits off |
kechbs | 0:1d2b7ae1269a | 155 | if (dispNum == 1){dig_1 = 0;dig_2 = 1;dig_3 = 1;} |
kechbs | 0:1d2b7ae1269a | 156 | if (dispNum == 2){dig_1 = 1;dig_2 = 0;dig_3 = 1;} |
kechbs | 0:1d2b7ae1269a | 157 | if (dispNum == 3){dig_1 = 1;dig_2 = 1;dig_3 = 0;} |
kechbs | 0:1d2b7ae1269a | 158 | |
kechbs | 0:1d2b7ae1269a | 159 | wait(0.001); |
kechbs | 0:1d2b7ae1269a | 160 | |
kechbs | 0:1d2b7ae1269a | 161 | } |
kechbs | 0:1d2b7ae1269a | 162 | |
kechbs | 0:1d2b7ae1269a | 163 | |
kechbs | 0:1d2b7ae1269a | 164 |