Ejemplo n.º 1
0
/**
 * Écrit une chaîne à l'index désiré, en effaçant tout avant ou non.
 *
 * @param msg	Message à écrire (chaîne ASCIIZ composée du jeu de l'afficheur)
 * @param index	Index où écrire le message (0 à 31)
 * @param cb	Effacer tout le contenu affiché avant
 */
void LCM::write(const char* msg, const uint8_t index, const bool cb) {
	if (msg == NULL) {
		return;
	}
	uint8_t msg_len = cp_strlen(msg), // Taille totale de la chaîne
		up_len = 0, // Taille de la sous-chaîne sur la première ligne
		i;

	// Désactiver le `blink'/curseur pendant l'ajout (esthétique)
	const bool blink_en_bkup = _blink_en, cur_en_bkup = _cur_en;
	en_blink(false);
	en_cur(false);
	
	if (cb) {
		clear();
	}
	if (index >= LCM_FW_TOT_CH || LCM_FW_TOT_CH - index < msg_len) {
		return;
	}
	
	
	if (index < LCM_FW_HALF_CH) {
		if (msg_len + index < LCM_LINE1_ADR + LCM_FW_HALF_CH) {
			up_len = msg_len;
		} else {
			up_len = LCM_FW_HALF_CH - index;
		}
		
		lcmd_ddr_set_addr(index + LCM_LINE1_ADR, _port);
		for (i = 0; i < up_len; ++i) {
			lcmd_write(msg[i], _port);
		}
		
		lcmd_ddr_set_addr(LCM_LINE2_ADR, _port);
		for (i = up_len; i < msg_len; ++i) {
			lcmd_write(msg[i], _port);
		}
	} else {
		lcmd_ddr_set_addr(index + LCM_LINE2_ADR - LCM_FW_HALF_CH,
			_port);
		for (i = 0; i < msg_len; ++i) {
			lcmd_write(msg[i], _port);
		}
	}

	// Réactiver le `blink'/curseur
	set_bc_index(_last_bc_index);
	en_blink(blink_en_bkup);
	en_cur(cur_en_bkup);
	
	// Ajuster l'index virtuel
	_last_index = index + msg_len;
}
Ejemplo n.º 2
0
void hd44780fw_write(struct hd44780fw_conf* conf, const char* msg,
uint8_t index, uint8_t cb) {
    uint8_t msg_len = cp_strlen(msg);

    hd44780fw_write_len(conf, msg, msg_len, index, cb);
}