Étape 5: AVR - sortie 9-bit SPI avec un Assembly Inline
Pour implémenter le protocole de 9 bits en utilisant un AVR, j’ai trouvé une belle fonction ASM dans l’exemple de code SparkFun. Certains, j’ai modifié le code pour le nettoyer et l’adapter pour le contrôleur de Phillips. Ce code ASM est plus efficace que l’utilisation régulière C et permet plus rapide LCD écrit.Il utilise des goupilles ATMega168 11, 12, 13 et 14.
11 - data
12 - horloge
13 - chip Select
14 - remise à zéro (non couvert par cette fonction)
void soft_spi_send_byte (char cmd, données char)
{
activez chip_sel
ASM (« DRAS %0, 7 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit indicateur de commande
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 0 »:: « a » (cmd)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer 7 bits de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 7 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer 6 bits de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 6 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 5 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 5 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 4 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 4 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 3 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 3 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 2 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc 0 %, 2 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 1 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc 0 %, 1 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
Envoyer le bit 0 de données
ASM (« DRAS %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« DRAS %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbrc %0, 0 »:: « a » (données)) ;
ASM (« sbi %0, 5 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
ASM (« sbi %0, 6 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
désactiver chip_sel
ASM (« sbi %0, 7 »:: "Je" (_SFR_IO_ADDR(PORTD))) ;
}
Ce qui suit définit sont utilisés pour faciliter l’envoi des données et des commandes :
#define color_lcd_send_cmd(cmd) soft_spi_send_byte (0, cmd)
#define color_lcd_send_data(data) soft_spi_send_byte (1, données)