单片机:STM8L151C6T6
下面是将12864液晶屏的驱动改为汇编以提高运行效率。
//原来C代码
void LCD_SdCmd(uint8_t Command)
{
uint8_t i;
LCD_A0_RESET();
LCD_CS_RESET();
for(i=0;i<8;i++)
{
LCD_SCLK_RESET();
if(Command & 0x80)
LCD_DATA_SET();
else
LCD_DATA_RESET();
LCD_SCLK_SET();
Command <<= 1;
}
LCD_CS_SET();
}
//内嵌汇编后的代码
#define PD_ODR 0x500F
#define PD_IDR 0x5010
#define PD_DDR 0x5011
#define PD_CR1 0x5012
#define PD_CR2 0x5013
#define PB_ODR 0x5005
#define PB_IDR 0x5006
#define PB_DDR 0x5007
#define PB_CR1 0x5008
#define PB_CR2 0x5009
uint8_t asm_data; //此变量用于存储汇编LCD_SdCmd函数的参数
void LCD_SdCmd(uint8_t Command)
{
asm("LD asm_data, A\n"
"BRES $500F, #2\n" //GPIOD ODR 位2置0 A0=0;
"BRES $5005, #0\n" //GPIOB ODR 位0置0 CS=0;
"LD A, #8\n"
"loop:\n"
"BRES $500F, #1\n" //GPIOD ODR 位1置0 SCLK=0;
"BRES $500F, #0\n" //GPIOD ODR 位0置0 DATA=0;
"BTJF asm_data, #7, loop2\n" //最高位为0跳转
"BSET $500F, #0\n" //GPIOD ODR 位0置1 DATA=1;
"loop2:\n"
"BSET $500F, #1\n" //GPIOD ODR 位1置1 SCLK=1;锁定数据
"SLL (asm_data)\n" //逻辑左移
"DEC A\n"
"JRNE loop\n"
"BSET $5005, #0"); //GPIOB ODR 位0置1 CS=1;
}