Hur du använder en Nokia färg LCD! (5 / 11 steg)
Steg 5: AVR - matar 9-bitars SPI med Inline församling
För tilläggsprotokollet 9-bit med en AVR, hittade jag en fin ASM funktion i SparkFun exempelkod. Jag ändrade koden lite för att rensa upp och anpassa det för Phillips-styrenhet. Här ASM koden är effektivare än med vanliga C och tillåter snabbare LCD skriver.Det använder ATMega168 stift 11, 12, 13 och 14.
11 - data
12 - klocka
13 - chip Välj
14 - reset (inte omfattas av denna funktion)
void soft_spi_send_byte (char cmd, röding data)
{
Aktivera chip_sel
ASM ("cbi %0, 7":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka kommando flagga lite
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (cmd));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka lite 7 av data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 7":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka Bit 6 i data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 6":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka bit 5 i data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 5":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka bit 4 i data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 4":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka bit 3 av data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 3":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka bit 2 av data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 2":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka 1 bit av data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 1":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Skicka bit 0 av data
ASM ("cbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (data));
ASM ("sbi %0, 5":: "Jag" (_SFR_IO_ADDR(PORTD)));
ASM ("sbi %0, 6":: "Jag" (_SFR_IO_ADDR(PORTD)));
Inaktivera chip_sel
ASM ("sbi %0, 7":: "Jag" (_SFR_IO_ADDR(PORTD)));
}
Följande definierar används för att skicka data och kommandon lättare:
#define color_lcd_send_cmd(cmd) soft_spi_send_byte (0, cmd)
#define color_lcd_send_data(data) soft_spi_send_byte (1, data)