I would like to advise you, I create software for the STM32L151C8 microcontroller that will control the LCD segment display via the I2C PCF85176 driver
Design:
battery powered
configurable by the attached bluetooth module and keeping configuration values in EEPROM / FLASH
pulse ounter on the interrupt and holding the value in the flash, the device does not reset after inserting the battery
displaying on LCD pulse values after simple mathematical operations (addition, multiplication)
My questions:
using the snprintf / sprintf function to convert floats to char array - it uses a lot of memory? using float (this MCU don't have FPU i should using uint and only add dot on LCD?) I choose good MCU for this application?
void LCD_Update(void) {
uint8_t msg[2+20];
uint8_t *display_mem=msg+2;
msg[0]=CMD_OPCODE_DEVICE_SELECT | 0 | CMD_CONTINUE;
msg[1]=CMD_OPCODE_LOAD_DATA_POINTER | 0;
memset(display_mem, 0, 20);
int i,j;
for(i=0;i<8;i++) {
for(j=0;j<4;j++) {
uint8_t nibble=(display_digits[i]>>(4*j))&0xf;
uint8_t nibbleaddr=digit_addrs[i][j];
uint8_t byteaddr=nibbleaddr>>1;
nibbleaddr&=1;
display_mem[byteaddr]|=nibble<<(4*nibbleaddr);
}
}
HAL_I2C_Master_Transmit(&hi2c1, PCF8576_ADDR, msg, sizeof(msg), 100);
}
void LCD_Clear(void) {
for(int i=0;i<=8;i++) {
display_digits[i]=0;
}
LCD_Update();
}
void LCD_Print(char* str) {
int idx=0;
for(int i=0;i<=8;i++) {
char c=str[i];
if(c>='A' && c<='Z') {
display_digits[idx]=alpha[c-'A'];
}
else if (c=='.') {
display_digits[idx-1]=numsDot[str[i-1]-'0'];
idx--;
}
else if(c>='0' && c<='9') {
display_digits[idx]=nums[c-'0'];
}
idx++;
}
LCD_Update();
}
void LCD_PrintInt(int value) {
char str[8];
sprintf(str, "%d", value);
LCD_Print(str);
}
void LCD_PrintFloat(float value, uint8_t length) {
char str[length];
snprintf(str, length + 1, "%f", value);
LCD_Print(str);
}
Above is fragment of my program to control LCD