Paso 5: AVR - salida SPI de 9 bits con el montaje en línea
Para implementar el protocolo de 9 bits utilizando un AVR, he encontrado una agradable función ASM en el código de ejemplo de SparkFun. He modificado el código de algunos para limpiarlo y adaptarlo para el controlador de Phillips. Este código ASM es más eficiente que el uso regular C y permite que más rápido escribe LCD.Utiliza ATMega168 pins 11, 12, 13 y 14.
11 - datos
12 - reloj
13 - chip Select
14 - reset (no cubierto por esta función)
void soft_spi_send_byte (char cmd, datos char)
{
activar chip_sel
ASM ("cbi 0 %, 7":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar el bit de bandera de comando
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (cmd));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar 7 bits de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 7":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar 6 bits de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc 0 %, 6":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 5 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 5":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 4 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc 0 %, 4":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 3 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 3":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 2 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc 0 %, 2":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 1 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 1":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
Enviar bit 0 de datos
ASM ("cbi 0 %, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("cbi 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("sbrc %0, 0":: "a" (datos));
ASM ("OSE %0, 5":: "Yo" (_SFR_IO_ADDR(PORTD)));
ASM ("OSE 0 %, 6":: "Yo" (_SFR_IO_ADDR(PORTD)));
desactivar chip_sel
ASM ("OSE %0, 7":: "Yo" (_SFR_IO_ADDR(PORTD)));
}
Define los siguientes se utilizan para facilitar el envío datos y comandos:
#define color_lcd_send_cmd(cmd) soft_spi_send_byte (0, cmd)
#define color_lcd_send_data(data) soft_spi_send_byte (1, datos)