Maxim Integrated
/
MAXREFDES99_demo
Demo for MAXREFDES99
Diff: maxrefdes99.cpp
- Revision:
- 2:9fdd01cf0f88
- Parent:
- 0:6b0161c3e440
- Child:
- 3:41bdbc9b3cec
--- a/maxrefdes99.cpp Tue Jan 26 02:39:36 2016 +0000 +++ b/maxrefdes99.cpp Thu Mar 24 23:35:56 2016 +0000 @@ -149,8 +149,10 @@ static uint8_t display_buff[256]; static uint8_t temp_buff[256]; -static const uint8_t DISPLAY_BUFF_START = 112; -static const uint8_t DISPLAY_BUFF_END = 143; +static const uint8_t DISPLAY_BUFF_START = 0; +static const uint8_t DISPLAY_BUFF_END = 31; + +static uint8_t buff_end = 0; static const uint32_t MAX_STRING_LENGTH = 32; static char str[MAX_STRING_LENGTH]; @@ -178,77 +180,82 @@ //********************************************************************* -void print_char(Max7219 *p_display, uint8_t position, char c) +void print_char(Max7219 *p_display, uint8_t position99, char c) { uint8_t idx; + uint8_t char_buff[6]; + uint8_t device; uint8_t wrap_device; uint8_t wrap_idx; - uint8_t char_buff[6]; - uint8_t device; - uint8_t display_buff_idx = 0; + uint8_t buff_start = position99; get_5x7_character(c, char_buff); - - //get device and device_position - if(position > 8) + + if(position99 < 33) { - if(position%8) - { - device = ((position/8) + 1); - position = position%8; - } - else - { - device = position/8; - position = 8; - } + //get device and device_position + if(position99 > 8) + { + if(position99%8) + { + device = ((position99/8) + 1); + position99 = position99%8; + } + else + { + device = position99/8; + position99 = 8; + } + } + else + { + device = 1; + } + + //check for dispaly wrap around + //(moving to next 8x8 grid cause character doesn't fit on current one) + if(position99 > 3) + { + wrap_idx = (9 - position99); + if(device < 4) + { + wrap_device = (device + 1); + } + else + { + wrap_device = 1; + } + } + else + { + wrap_idx = 6; //make bigger than idx, not used + wrap_device = 0; //not used + } + + //print character to position + for(idx = 0; idx < 6; idx++) + { + //check for wrap + if((idx >= wrap_idx) && (device != 4)) + { + p_display->write_digit(wrap_device, ((idx - wrap_idx) + 1), char_buff[idx]); + } + else + { + p_display->write_digit(device, (position99 + idx), char_buff[idx]); + } + + buff_end = ((buff_start - 1) + idx); + display_buff[buff_end] = char_buff[idx]; + } } else { - device = 1; - } - - //check for dispaly wrap around - //(moving to next 8x8 grid cause character doesn't fit on current one) - if(position > 3) - { - wrap_idx = (9 - position); - if(device < 4) - { - wrap_device = (device + 1); - } - else - { - wrap_device = 1; - } - } - else - { - wrap_idx = 6; //make bigger than idx, not used - wrap_device = 0; //not used - } - - //print character to position - for(idx = 0; idx < 6; idx++) - { - //check for wrap - if(idx >= wrap_idx) - { - p_display->write_digit(wrap_device, ((idx - wrap_idx) + 1), char_buff[idx]); - } - else - { - p_display->write_digit(device, (position + idx), char_buff[idx]); - } - - //get index for display buffer, keeps image of display for shifting - display_buff_idx = (((device - 1) * 8) + (position - 1) + idx + DISPLAY_BUFF_START); - //wrap buff back around - if(display_buff_idx > 255) - { - display_buff_idx = display_buff_idx - 256; - } - display_buff[display_buff_idx] = char_buff[idx]; + for(idx = 0; idx < 6; idx++) + { + buff_end = ((buff_start - 1) + idx); + display_buff[buff_end] = char_buff[idx]; + } } } @@ -267,16 +274,16 @@ //********************************************************************* -void shift_display_right(Max7219 *p_display, uint8_t count, uint8_t delay) +void shift_display_right(Max7219 *p_display, uint8_t count, uint8_t ms_delay) { uint16_t idx, idy; - uint8_t position; + uint8_t position99; for(idx = 0; idx < count; idx++) { - for(idy = 0; idy < 256; idy++) + for(idy = 0; idy < (buff_end + 1); idy++) { - if(idy == 255) + if(idy == buff_end) { temp_buff[0] = display_buff[idy]; } @@ -286,74 +293,75 @@ } } - for(idy = 0; idy < 256; idy++) + for(idy = 0; idy < (buff_end + 1); idy++) { //save shifted display in buffer display_buff[idy] = temp_buff[idy]; - if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END)) + if(idy <= DISPLAY_BUFF_END) { - position = ((idy - DISPLAY_BUFF_START) + 1); - if(position > 24) + position99 = ((idy - DISPLAY_BUFF_START) + 1); + if(position99 > 24) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(4, position, display_buff[idy]); + p_display->write_digit(4, position99, display_buff[idy]); } - else if(position > 16) + else if(position99 > 16) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(3, position, display_buff[idy]); + p_display->write_digit(3, position99, display_buff[idy]); } - else if(position > 8) + else if(position99 > 8) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(2, position, display_buff[idy]); + p_display->write_digit(2, position99, display_buff[idy]); } else { - p_display->write_digit(1, position, display_buff[idy]); + p_display->write_digit(1, position99, display_buff[idy]); } } } - - wait_ms(delay); + + wait_ms(ms_delay); } } -void shift_display_left(Max7219 *p_display, uint8_t count, uint8_t delay) +//********************************************************************* +void shift_display_left(Max7219 *p_display, uint8_t count, uint8_t ms_delay) { uint16_t idx, idy; - uint8_t position; + uint8_t position99; for(idx = 0; idx < count; idx++) { - for(idy = 0; idy < 256; idy++) + for(idy = 0; idy < (buff_end + 1); idy++) { if(idy == 0) { - temp_buff[255] = display_buff[idy]; + temp_buff[buff_end] = display_buff[idy]; } else { @@ -361,58 +369,58 @@ } } - for(idy = 0; idy < 256; idy++) + for(idy = 0; idy < (buff_end + 1); idy++) { //save shifted display in buffer display_buff[idy] = temp_buff[idy]; - if((idy >= DISPLAY_BUFF_START) && ( idy <= DISPLAY_BUFF_END)) + if(idy <= DISPLAY_BUFF_END) { - position = ((idy - DISPLAY_BUFF_START) + 1); - if(position > 24) + position99 = ((idy - DISPLAY_BUFF_START) + 1); + if(position99 > 24) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(4, position, display_buff[idy]); + p_display->write_digit(4, position99, display_buff[idy]); } - else if(position > 16) + else if(position99 > 16) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(3, position, display_buff[idy]); + p_display->write_digit(3, position99, display_buff[idy]); } - else if(position > 8) + else if(position99 > 8) { - if(position % 8) + if(position99 % 8) { - position = position % 8; + position99 = position99 % 8; } else { - position = 8; + position99 = 8; } - p_display->write_digit(2, position, display_buff[idy]); + p_display->write_digit(2, position99, display_buff[idy]); } else { - p_display->write_digit(1, position, display_buff[idy]); + p_display->write_digit(1, position99, display_buff[idy]); } } } - - wait_ms(delay); + + wait_ms(ms_delay); } } @@ -434,6 +442,11 @@ display_buff[idx + DISPLAY_BUFF_START] = 0xFF; } } + + if(buff_end < (quad * 8)) + { + buff_end = (quad * 8); + } p_display->device_all_on(quad); } @@ -456,6 +469,13 @@ display_buff[idx + DISPLAY_BUFF_START] = 0; } } + + //is buff_end in the quad? + if((((quad - 1) * 8) < buff_end) && ((quad * 8) > buff_end)) + { + buff_end = ((quad - 1) * 8); + } + //leave it alone otherwise p_display->device_all_off(quad); } @@ -464,10 +484,15 @@ //********************************************************************* void all_on(Max7219 *p_display) { - for(uint16_t idx = 0; idx < 256; idx++) + for(uint16_t idx = 0; idx < 32; idx++) { display_buff[idx] = 0xFF; } + + if(buff_end < 32) + { + buff_end = 32; + } p_display->display_all_on(); } @@ -476,10 +501,15 @@ //********************************************************************* void all_off(Max7219 *p_display) { - for(uint16_t idx = 0; idx < 256; idx++) + for(uint16_t idx = 0; idx < 32; idx++) { display_buff[idx] = 0; } + + if(buff_end < 32) + { + buff_end = 0; + } p_display->display_all_off(); } @@ -633,7 +663,7 @@ printf(msg); //get user input - fgets(str, 2, stdin); + fgets(str, 4, stdin); //Remove trailing newline and CR, if there. if((strlen(str) > 0 ) && (str[strlen(str) - 1] == 0x0A) && (str[strlen(str) - 2] == 0x0D))