标准的LCD1602似乎是日本字库,里面的"\"被"¥"代替
<code class="lang-cpp">#include "main.h" void LCD_Init(void){ GPIO_PinInit(RS_PORT ,RS_PIN ,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_PinInit(E_PORT,E_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_PinInit(DB7_PORT,DB7_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_PinInit(DB6_PORT,DB6_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_PinInit(DB5_PORT,DB5_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_PinInit(DB4_PORT,DB4_PIN,GPIO_MODE_OUT_PP_HIGH_FAST); Util_DelayUs(1000); LCD_Write(0,0x33); LCD_Write(0,0x32); LCD_Write(0,0x28); LCD_Write(0,0x0c); LCD_Write(0,0x01); LCD_Write(0,0x80); } void LCD_Write(unsigned char isData,unsigned char cmd){ Util_DelayUs(2000); //Hardcoding delay, keep waiting while the LCD is busy GPIO_Pin(RS_PORT, RS_PIN, isData); GPIO_PinClr(E_PORT, E_PIN); GPIO_Pin(DB7_PORT, DB7_PIN, BitGet(cmd, 7)); GPIO_Pin(DB6_PORT, DB6_PIN, BitGet(cmd, 6)); GPIO_Pin(DB5_PORT, DB5_PIN, BitGet(cmd, 5)); GPIO_Pin(DB4_PORT, DB4_PIN, BitGet(cmd, 4)); nop(); nop(); GPIO_PinSet(E_PORT, E_PIN); //E = 1 nop(); nop(); GPIO_PinClr(E_PORT, E_PIN); //E = 0 GPIO_Pin(DB7_PORT, DB7_PIN, BitGet(cmd, 3)); GPIO_Pin(DB6_PORT, DB6_PIN, BitGet(cmd, 2)); GPIO_Pin(DB5_PORT, DB5_PIN, BitGet(cmd, 1)); GPIO_Pin(DB4_PORT, DB4_PIN, BitGet(cmd, 0)); nop(); nop(); GPIO_PinSet(E_PORT, E_PIN); //E = 1 nop(); nop(); GPIO_PinClr(E_PORT, E_PIN); //E = 0 } void LCD_Locate(unsigned char x,unsigned char y){ LCD_Write(0, x + (y?0xc0:0x80)); } void LCD_PrintString(char* c){ while(*c){ LCD_Write(1,*c); c++; } }</code>main.h中定义了一些宏:
<code class="lang-cpp">#ifndef __MAIN_H__ #define __MAIN_H__ #include "stm8s.h" #include "GPIODef.h" //Util Macros #define NULL 0 #define Pin(p) (1<<p) #define bitget(bit, i) ((bit>>i)&1) #define GPIO_PinSet(GPIOx, pin) SetBit(GPIOx->ODR, pin) #define GPIO_PinClr(GPIOx, pin) ClrBit(GPIOx->ODR, pin) #define GPIO_PinGet(GPIOx, pin) BitGet(GPIOx->IDR, pin) #define GPIO_Pin(GPIOx, pin, v) if(v){SetBit(GPIOx->ODR, pin);}else{ClrBit(GPIOx->ODR, pin);} #define GPIO_PinInit(GPIOx, pin, mode) GPIO_Init(GPIOx, 1<<pin, mode) lcd1602 #define lcd_clear() lcd_write(0,0x01) void lcd_init(void); lcd_write(unsigned char isdata,unsigned cmd); lcd_locate(unsigned x,unsigned y); lcd_printstring(char* c); util functions util_delay(unsigned int a); #endif< code></pin,></p)></code>
<code class="lang-cpp">void Util_Delay(unsigned int a){ while(a--); }</code>
<code class="lang-cpp">LCD_Write(1,0xC1); LCD_Write(1,0xD9); LCD_Write(1,0xC9);</code>就会打出琪露诺的日文名
引用 我说要有光:[s::D]试了两块1602, 一块是通常的牛屎,另一块是Hitachi的HD44780,\都显示为¥
标准的LCD1602似乎是日本字库,里面的"\"被"¥"代替
引用 drzzm32:ST的I2C威名远扬……慎重使用,除非对存在的问题很了解并且愿意花时间绕过
低IO数目的情况下可以试试IIC总线的屏,只占用两个IO。速度也不错,而且能比较容易地做多屏操作
引用 phpskycn:窝的I2C倒是能调的通、没有传说中辣么巨毒
ST的I2C威名远扬……慎重使用,除非对存在的问题很了解并且愿意花时间绕过
引用 金坷居士:试了下I2C和MPU6050通信,能工作但是有一定概率会卡住,重新上电又能解决
窝的I2C倒是能调的通、没有传说中辣么巨毒
引用 phpskycn:窝那个是驱动24C02,没问题的,可能是ST的I2C兼容性不好
试了下I2C和MPU6050通信,能工作但是有一定概率会卡住,重新上电又能解决
引用 金坷居士:我记得那个仅仅是stm32F1系列硬件iis不能开中断
窝那个是驱动24C02,没问题的,可能是ST的I2C兼容性不好
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。