Stap 5: AVR - outputten 9-bits SPI met Inline vergadering
Ter uitvoering van het protocol van de 9-bits met behulp van een AVR, vond ik een aardige ASM-functie in de voorbeeldcode van SparkFun. Ik wijzigde de code wat om het schoon te maken en aan te passen voor de Phillips-controller. Deze ASM-code is efficiënter dan het gebruik van reguliere C en laat snellere LCD schrijft.Het maakt gebruik van ATMega168 pinnen 11, 12, 13 en 14.
11 - data
12 - klok
13 - chip Select
14 - reset (niet gedekt door deze functie)
VOID soft_spi_send_byte (char cmd, char data)
{
chip_sel inschakelen
ASM ("cbi %0, 7":: "I" (_SFR_IO_ADDR(PORTD)));
Verzenden van de opdracht vlag bit
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (cmd));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 7 van gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 7":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 6 van gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 6":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 5 gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 5":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 4 van gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 4":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Beetje 3 gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 3":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 2 gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 2":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 1 voor data versturen
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 1":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
Bit 0 van gegevens verzenden
ASM ("cbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (gegevens));
ASM ("sbi %0, 5":: "I" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "I" (_SFR_IO_ADDR(PORTD)));
uitschakelen van chip_sel
ASM ("sbi %0, 7":: "I" (_SFR_IO_ADDR(PORTD)));
}
Het volgende definieert om gemakkelijker het verzenden van gegevens en opdrachten worden gebruikt:
#define color_lcd_send_cmd(cmd) soft_spi_send_byte (0, cmd)
#define color_lcd_send_data(data) soft_spi_send_byte (1, gegevens)