这个板子的NBK-RD8x3x 已经提供了ARDUINO的接口,可以很方便的操作一些arduino的模块。
之前购买过一块跟arduino 对应的LCD
[size=0.83em]1.jpg (118.58 KB ) 下载附件 [color=rgb(153, 153, 153) !important]2022-6-1 22:31 上传
NBK-RD8x3x 核心开发板上面也是集成了这个接口的,不过,对于操作这个端口,还是有点费事的,因为IO都不是连贯的。
需要单独对IO口进行操作的 。查看原理找打对应的引脚。
在这里是看到不到D5和D6的
需要在看这里,用短路帽进行短接才能使用。
为了方便移植,这里使用的是宏定义实现每一个引脚的操作代码。
#define LCD_RD_GPIO_Port GPIO1
#define LCD_RD_Pin GPIO_PIN_4
#define LCD_WR_GPIO_Port GPIO1
#define LCD_WR_Pin GPIO_PIN_5
#define LCD_RS_GPIO_Port GPIO1
#define LCD_RS_Pin GPIO_PIN_6
#define LCD_CS_GPIO_Port GPIO1
#define LCD_CS_Pin GPIO_PIN_7
#define LCD_RST_GPIO_Port GPIO3
#define LCD_RST_Pin GPIO_PIN_4
#define LCD_D0_GPIO_Port GPIO0
#define LCD_D0_Pin GPIO_PIN_6
#define LCD_D1_GPIO_Port GPIO5
#define LCD_D1_Pin GPIO_PIN_3
#define LCD_D2_GPIO_Port GPIO3
#define LCD_D2_Pin GPIO_PIN_7
#define LCD_D3_GPIO_Port GPIO4
#define LCD_D3_Pin GPIO_PIN_0
#define LCD_D4_GPIO_Port GPIO0
#define LCD_D4_Pin GPIO_PIN_2
#define LCD_D5_GPIO_Port GPIO5
#define LCD_D5_Pin GPIO_PIN_4
#define LCD_D6_GPIO_Port GPIO5
#define LCD_D6_Pin GPIO_PIN_5
#define LCD_D7_GPIO_Port GPIO2
#define LCD_D7_Pin GPIO_PIN_2
然后对每一个IO口 初始化,使用宏定义的好处就是需要再去关心那个IO了,只需要对应的修改端口就行了。
void lcd_gpio_init()
{
GPIO_Init(LCD_RD_GPIO_Port, LCD_RD_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_WR_GPIO_Port, LCD_WR_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D0_GPIO_Port, LCD_D0_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D1_GPIO_Port, LCD_D1_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D2_GPIO_Port, LCD_D2_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D3_GPIO_Port, LCD_D3_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D4_GPIO_Port, LCD_D4_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D5_GPIO_Port, LCD_D5_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D6_GPIO_Port, LCD_D6_Pin, GPIO_MODE_OUT_PP); //
GPIO_Init(LCD_D7_GPIO_Port, LCD_D7_Pin, GPIO_MODE_OUT_PP); //
}
对端口的操作也是使用的是宏定义的方式。
#define LCD_CS_LOW() GPIO_WriteLow(LCD_CS_GPIO_Port,LCD_CS_Pin) //
#define LCD_CS_HIGH() GPIO_WriteHigh(LCD_CS_GPIO_Port,LCD_CS_Pin) //
#define LCD_RST_LOW() GPIO_WriteLow(LCD_RST_GPIO_Port,LCD_RST_Pin) //
#define LCD_RST_HIGH() GPIO_WriteHigh(LCD_RST_GPIO_Port,LCD_RST_Pin) //
#define LCD_WR_LOW() GPIO_WriteLow(LCD_WR_GPIO_Port,LCD_WR_Pin) //
#define LCD_WR_HIGH() GPIO_WriteHigh(LCD_WR_GPIO_Port,LCD_WR_Pin) //
#define LCD_RS_LOW() GPIO_WriteLow(LCD_RS_GPIO_Port,LCD_RS_Pin) //
#define LCD_RS_HIGH() GPIO_WriteHigh(LCD_RS_GPIO_Port,LCD_RS_Pin) //
#define LCD_RD_LOW() GPIO_WriteLow(LCD_RD_GPIO_Port,LCD_CS_Pin) //
#define LCD_RD_HIGH() GPIO_WriteHigh(LCD_RD_GPIO_Port,LCD_RD_Pin) //
这里最复杂的就是对数据口写入的操作,因为8个口不能直接写入,所以得分别操作才行。
根据每一个bit,分别操作一个口,所以不要指望有太高的刷屏速度了。
后期可以放置在P1-P4上,进行连续操作,这个速度就快多了。
void Lcd_Writ_Bus(uint8_t dat)
{
GPIO_WriteLow(LCD_WR_GPIO_Port,LCD_WR_Pin) ;
if(dat&0x01) GPIO_WriteHigh(LCD_D0_GPIO_Port,LCD_D0_Pin);
else GPIO_WriteLow(LCD_D0_GPIO_Port,LCD_D0_Pin) ;
if(dat&0x02) GPIO_WriteHigh(LCD_D1_GPIO_Port,LCD_D1_Pin);
else GPIO_WriteLow(LCD_D1_GPIO_Port,LCD_D1_Pin) ;
if(dat&0x04) GPIO_WriteHigh(LCD_D2_GPIO_Port,LCD_D2_Pin);
else GPIO_WriteLow(LCD_D2_GPIO_Port,LCD_D2_Pin);
if(dat&0x08) GPIO_WriteHigh(LCD_D3_GPIO_Port,LCD_D3_Pin);
else GPIO_WriteLow(LCD_D3_GPIO_Port,LCD_D3_Pin);
if(dat&0x10) GPIO_WriteHigh(LCD_D4_GPIO_Port,LCD_D4_Pin);
else GPIO_WriteLow(LCD_D4_GPIO_Port,LCD_D4_Pin) ;
if(dat&0x20) GPIO_WriteHigh(LCD_D5_GPIO_Port,LCD_D5_Pin);
else GPIO_WriteLow(LCD_D5_GPIO_Port,LCD_D5_Pin );
if(dat&0x40) GPIO_WriteHigh(LCD_D6_GPIO_Port,LCD_D6_Pin);
else GPIO_WriteLow(LCD_D6_GPIO_Port,LCD_D6_Pin) ;
if(dat&0x80) GPIO_WriteHigh(LCD_D7_GPIO_Port,LCD_D7_Pin);
else GPIO_WriteLow(LCD_D7_GPIO_Port,LCD_D7_Pin) ;
GPIO_WriteHigh(LCD_WR_GPIO_Port,LCD_WR_Pin);
}
在main函数中对LCD初始化,然后显示字符就行了。
lcd_init();
lcd_clear(BLACK);
OLED_ShowStringCN(0,20,"bbs.21ic.com",16,GREEN,BLACK);
OLED_ShowStringCN(0,40,"新定义 RDSMCU",16,RED,BLACK);
OLED_ShowString(0,60,"RDS MCU",16,BLUE,BLACK);
OLED_ShowString(0,80,"RDS MCU",24,YELLOW,BLACK);
OLED_ShowString(0,110,"RDS MCU",8,WHITE,BLACK);
lcd_fill_rect(10, 170, 50, 50, YELLOW);
lcd_draw_circle(180, 150, 40, 0xF000);
lcd_draw_rect(120, 240, 50, 50, BLUE);
先看看效果吧。
最后附上源代码
lcd.rar
(4.4 KB)
|
此文章已获得独家原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
共1人点赞
|