引用 phpskycn:窝的I2C倒是能调的通、没有传说中辣么巨毒
ST的I2C威名远扬……慎重使用,除非对存在的问题很了解并且愿意花时间绕过
引用
评论
#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);就会打出琪露诺的日文名引用 phpskycn:窝的I2C倒是能调的通、没有传说中辣么巨毒
ST的I2C威名远扬……慎重使用,除非对存在的问题很了解并且愿意花时间绕过