标准的LCD1602似乎是日本字库,里面的"\"被"¥"代替
#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++;
}
}
main.h中定义了一些宏:#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)>
void Util_Delay(unsigned int a){
while(a--);
}
LCD_Write(1,0xC1);
LCD_Write(1,0xD9);
LCD_Write(1,0xC9);
就会打出琪露诺的日文名引用 我说要有光:[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兼容性不好
200字以内,仅用于支线交流,主线讨论请采用回复功能。