Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LCD
STM32F103
20
晶联讯19264液晶屏字库,可以读取字母、字符和数字,但是汉字读取显示错误
发布于 2020-09-14 16:55:02 浏览:1460
订阅该版
使用stm32f103-atk-nano BSP做的工程,修改为STM32F103RC。 使用裸机程序测试,功能正常,可以读写LCD液晶屏字库的字母、字符、数字和汉字。代码如下: ```c //---------------------------LCD端口定义-------------------------- #define LCD_SCK PBout(15) //对应液晶屏的接口“SCLK”(即:串行时钟输入) #define LCD_SDA PCout(6) //对应液晶屏的接口“SDA”(即:串行数据输入) #define LCD_CS PBout(12) //对应液晶屏的接口“CS”(即:片选) #define LCD_RST PBout(13) //对应液晶屏的接口“RESET”(即:复位) #define LCD_RS PBout(14) //对应液晶屏的接口“RS”(即:指令/数据寄存器选择) #define Rom_CS PCout(7) // 对应字库IC接口“Rom_CS”(也即:字库IC的CS#,片选) #define Rom_SCK PCout(8) // 对应字库IC接口“Rom_SCK”(也即:字库IC的SCK,串行时钟) #define Rom_OUT PCin(9) // 对应字库IC接口“Rom_OUT”(也即:字库IC的SO ,串行数据输出) #define Rom_IN PAout(8) // 对应字库IC接口“Rom_IN”(也即:字库IC的SI,串行数据输入) void initial_lcd(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); //使能PA,B,C端口时钟 (ENABLE开启) GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8; //PA GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PB GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_12; //PC GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9; //PC GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOC, &GPIO_InitStructure); LCD_LEDA=0; LCD_RST=0; delay_ms(50); LCD_RST=1; delay_ms(100); transfer_command(0xe2); /*软复位*/ delay_ms(5); transfer_command(0x2c); /*升压步聚1*/ delay_ms(5); transfer_command(0x2e); /*升压步聚2*/ delay_ms(5); transfer_command(0x2f); /*升压步聚3*/ delay_ms(5); transfer_command(0x24); /*粗调对比度,可设置范围0x20~0x27*/ transfer_command(0x81); /*微调对比度*/ transfer_command(0x45); /*0x1a,微调对比度的值,可设置范围0x00~0x3f*/ transfer_command(0xeb); /*1/9偏压比(bias)*/ transfer_command(0xc2); /*行扫描顺序:从上到下*/ transfer_command(0xa0); /*76帧/秒*/ transfer_command(0xaf); /*开显示*/ } //***送指令到晶联讯字库IC** void send_command_to_ROM( u8 datu ) { u8 i; for(i=0;i<8;i++ ) { Rom_SCK=0; delay_us(1); if(datu&0x80)Rom_IN = 1; else Rom_IN = 0; datu = datu<<1; Rom_SCK=1; delay_us(1); } } //***从晶联讯字库IC中取汉字或字符数据(1个字节)** static u8 get_data_from_ROM(void) { u8 i; u8 ret_data=0; for(i=0;i<8;i++) { Rom_OUT=1; Rom_SCK=0; delay_us(1); ret_data=ret_data<<1; if( Rom_OUT ) ret_data=ret_data+1; else ret_data=ret_data+0; Rom_SCK=1; delay_us(1); } return(ret_data); } ``` 移植到rtthread 中,代码如下: ```c /* defined the DIS_CS pin: PB12 */ #define DIS_CS_PIN GET_PIN(B, 12) /* defined the DIS_RST pin: PB13 */ #define DIS_RST_PIN GET_PIN(B, 13) /* defined the DIS_RS pin: PB14 */ #define DIS_RS_PIN GET_PIN(B, 14) /* defined the DIS_SCK pin: PB15 */ #define DIS_SCK_PIN GET_PIN(B, 15) /* defined the DIS_SDA pin: PC6 */ #define DIS_SDA_PIN GET_PIN(C, 6) /* defined the DIS_LEDA pin: PC12 */ #define DIS_LEDA_PIN GET_PIN(C, 12) #define dis_cs(x) ((x) ? (rt_pin_write(DIS_CS_PIN, PIN_HIGH)) : (rt_pin_write(DIS_CS_PIN, PIN_LOW))) #define dis_rst(x) ((x) ? (rt_pin_write(DIS_RST_PIN, PIN_HIGH)) : (rt_pin_write(DIS_RST_PIN, PIN_LOW))) #define dis_rs(x) ((x) ? (rt_pin_write(DIS_RS_PIN, PIN_HIGH)) : (rt_pin_write(DIS_RS_PIN, PIN_LOW))) #define dis_sck(x) ((x) ? (rt_pin_write(DIS_SCK_PIN, PIN_HIGH)) : (rt_pin_write(DIS_SCK_PIN, PIN_LOW))) #define dis_sda(x) ((x) ? (rt_pin_write(DIS_SDA_PIN, PIN_HIGH)) : (rt_pin_write(DIS_SDA_PIN, PIN_LOW))) #define dis_leda(x) ((x) ? (rt_pin_write(DIS_LEDA_PIN, PIN_HIGH)) : (rt_pin_write(DIS_LEDA_PIN, PIN_LOW))) /*字库 IC 接口定义 Rom_CS 就是字库 IC 的 CS#*/ /* defined the ROM_CS pin: PC7 */ #define ROM_CS_PIN GET_PIN(C, 7) /* defined the ROM_SCK pin: PC8 */ #define ROM_SCK_PIN GET_PIN(C, 8) /* defined the ROM_OUT pin: PC9 */ #define ROM_OUT_PIN GET_PIN(C, 9) /* defined the ROM_IN pin: PA8 */ #define ROM_IN_PIN GET_PIN(A, 8) #define rom_cs(x) ((x) ? (rt_pin_write(ROM_CS_PIN, PIN_HIGH)) : (rt_pin_write(ROM_CS_PIN, PIN_LOW))) #define rom_sck(x) ((x) ? (rt_pin_write(ROM_SCK_PIN, PIN_HIGH)) : (rt_pin_write(ROM_SCK_PIN, PIN_LOW))) #define rom_in(x) ((x) ? (rt_pin_write(ROM_IN_PIN, PIN_HIGH)) : (rt_pin_write(ROM_IN_PIN, PIN_LOW))) #define rom_out (rt_pin_read(ROM_OUT_PIN)) #define Rom_OUT(x) ((x) ? (rt_pin_write(ROM_OUT_PIN, PIN_HIGH)) : (rt_pin_write(ROM_OUT_PIN, PIN_LOW))) //LCD 模块初始化 void initial_lcd() { rt_pin_mode(DIS_CS_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIS_RST_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIS_RS_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIS_SCK_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIS_SDA_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIS_LEDA_PIN, PIN_MODE_OUTPUT); rt_pin_mode(ROM_CS_PIN, PIN_MODE_OUTPUT); rt_pin_mode(ROM_SCK_PIN, PIN_MODE_OUTPUT); rt_pin_mode(ROM_OUT_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(ROM_IN_PIN, PIN_MODE_OUTPUT); /* set DIS_LEDA pin mode to output */ rt_pin_mode(DIS_LEDA_PIN, PIN_MODE_OUTPUT); /*DIS_LEDA test*/ rt_pin_write(DIS_LEDA_PIN, PIN_LOW); dis_rst(0); //低电平复位 rt_thread_mdelay(100); dis_rst(1); //复位完毕 rt_thread_mdelay(100); transfer_command(0xe2); //软复位 rt_thread_mdelay(500); transfer_command(0x2c); /*升压步聚1*/ rt_thread_mdelay(5); transfer_command(0x2e); /*升压步聚2*/ rt_thread_mdelay(5); transfer_command(0x2f); /*升压步聚3*/ // transfer_command(0x2f); //打开内部升压 rt_thread_mdelay(500); transfer_command(0x81); //微调对比度 transfer_command(0x45); //微调对比度的值,可设置范围 0x00~0xFF transfer_command(0xeb); //1/9 偏压比(bias) transfer_command(0xc2); //行扫描顺序:从上到下 列扫描顺序:从右到左 transfer_command(0xa0); //76帧/秒 transfer_command(0xaf); //开显示 } void dis_delay(uint time) { uint t; for(t=0;t
查看更多
还没想好
2020-09-15
这家伙很懒,什么也没写!
1. 确保 `rt_pin_write` 能够正确拉高拉低电平 2. 确保 `rt_pin_write` 函数执行时间满足需求,裸机中是直接操作寄存器,速度非常快,这里换成函数调用,速度要慢一些。 3. 延时函数 `dis_delay` 延时的时间,是否正确 4. 逻辑分析仪,抓一下时许。 5. 不能被打断的程序,锁住调度器,防止线程切换。 ```c static uchar get_data_from_ROM(void) { for(i=0;i<8;i++) { Rom_OUT(1); rom_sck(0); dis_delay(1); ret_data=ret_data<<1; if( rom_out ) ret_data=ret_data+1; else ret_data=ret_data+0; rom_sck(1); dis_delay(1); } } ``` 上面 5 点排查完。一定能成功。
2
个回答
默认排序
按发布时间排序
sANT
2020-09-16
这家伙很懒,什么也没写!
查找测试了两天,各种修改测试。最终发现是汉字被KEIL编译时编码出问题导致的。KEIL默认编码是UTF-8。我的设置是GB2312。 ![捕获.PNG](/uploads/20200916/ebb6c9b77769fdc92d2e9c5688ba4385.png) 然后我修改为ANSI后编译,就正常了。 ![捕获.PNG](/uploads/20200916/95bf9e7d3ff58ee557a4a2b33df8376e.png) 然后再修改为GB2312依然正常了。感觉这个是KEIL的BUG造成的。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
sANT
这家伙很懒,什么也没写!
提问
5
回答
16
被采纳
0
关注TA
发私信
相关问题
1
STM32F103RCT6 串口接收数据不正确
2
microPython的工程同步总是不行
3
RT-THREAD 串口接收数据问题
4
fal软件包如何在f103rct6上使用
5
新手“RT-Thread Settings”创建看门狗的时候后编译不通过的问题
6
大神们,rt-thread启用WDT了,但是还是没启动,怎么办?
7
为什么IWDG设置分频为4并且reload设置为0xFFF的时候串口没有打印了?
8
CMSIS-DAP烧录STM32F103C8T6出错
9
RTT的启动时长大概是多少毫秒?
10
RTT进入main函数之后不能再设置系统的时钟了吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread 全球电子设计大赛】基于vision board 的巡检除冰机器人
2
新手教程-Pin设备使用
3
基于嵌入式的智能关怀系统#24嵌入式设计大赛
4
基于机器视觉识别自动跟踪器
5
[24嵌入式设计大赛]基于Vision-Board的智能应急环境监测控制小车
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
at_device
MicroPython
rt_mq_消息队列_msg_queue
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
5
个答案
2
次被采纳
rv666
6
个答案
1
次被采纳
用户名由3_15位
5
个答案
1
次被采纳
xiaorui
2
个答案
1
次被采纳
张世争
2
个答案
1
次被采纳
本月文章贡献
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
4
次点赞
flytianya2010
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
2
次点赞
不灬忘初心
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部