jhd-12232d使用总结(与大多数12232相同)

本文档总结了使用jhd-12232d模块的心得,该模块在许多方面与常见的12232兼容。通过CMD命令进行操作,掌握延迟设置与字节处理技巧是关键。内容涵盖模块的基础配置、C语言编程接口及实际工作中遇到的问题与解决方案。
概述:
JHD12232D与另外两款LCD,MG-12232与TG12232B,极为相似,他们使用的都是SED1520芯片,都是有18个接口,只是在个别的接口是高电平有效还是低电平有效上有一些区别。
 
参考文档(这些文档放在项目备份盘中)
JHD(晶汉达)公司网站上下载的三份相关PDF(接口以英文版为准)
MCU123.NET文件夹中的TG12232B.PDF与示例程序
SED1520.PDF中文版:这应该是某个公司为自己的产品写的文档,不是SED1520芯片的官方文档,但里面关于程序编写的流程很是实用
SED1520官方参考,官方参考一定是有用的
 
点阵的分布
JHD12232D的点阵布局
JHD12232D的两个SED芯片是左右分布的(好像有些别的型号的LCD是上下分布的),左右两个芯片各有一个指针指向当前要读写的显示RAM。所以要对某个显示RAM操作时,应设定其芯片的当前指针,具体要指定:设定在哪个芯片的哪页,设定在哪个芯片的哪列,在读写显示RAM时,要指定写到哪个芯片里去。如要将0XF3写到右边芯片的第二页的写40列,则应设置右边芯片的页为2,设置右边芯片的列为40,再把0XF3写到右边芯片中去。
 
引脚连线的问题
引脚的连线一定要参照LCD的官方文档,不同LCD的工作电压、接口都有可能是不同的。
RES : 当RES为高电平时,LCD正常工作,当其为低电平时,复位
Vo : 对比度调节,一般可以接低电平,如果需要调节对比度的话,可以将此接口接在滑动变阻器的滑动脚上,变阻器的另外两个脚分别接+5伏和-5伏,不过在调节时注意其电压,对于JHD12232D,其最小值为-5.5V。
LED+:应该连一个250欧电阻之后再接5V
 
程序的编写
SED1520.pdf中有程序流程图
当E1、E2为高电平时,数据被发送到总线上,当其在下降沿时,数据被锁存在SED1520中。
 
注意事项:
LCD要在程序初始化之后才能使用。
如果不改变页和列,不停地向一个芯片中写数据,当当前指针超出范围,之后的写操作不会引起LCD显示的改变。
 
 程序
// defs.h
#define  LCD_DATA    P1

#define  D0    P1_0
#define  D1    P1_1
#define  D2    P1_2
#define  D3    P1_3
#define  D4    P1_4
#define  D5    P1_5
#define  D6    P1_6
#define  D7    P1_7

#define  E1    P3_5
#define  E2    P3_4
#define  RW    P3_3
#define  A0    P3_7    

#define  LOW     0
#define  HIGH    1

#define  uchar     unsigned char
#define  uint    unsigned int
#define  byte    unsigned char

#define  LONGDELAY    for( i_loop = 0 ; i_loop < 300 ; ++i_loop )delay2(100);
#define  LONGLONGDELAY    for( i_loop = 0 ; i_loop < 10000 ; ++i_loop )delay2(100);

#define  CMD_DISPLAY_ON    0xAF
#define  CMD_DISPLAY_OFF    0xAE
#define  CMD_DISPLAY_START_LINE    0xC0     //  | ,when use it
#define  CMD_PAGE_ADDR_SET    0xB8         //  | ,when use it
#define  CMD_COLUMN_ADDR_SET    0x00         //  |, when use it
#define  CMD_RESET    0xE2    

#define  LCD_Reset(); LCD_Write_Cmd( CMD_RESET,1 );
#define  LCD_Display_ON();    LCD_Write_Cmd( CMD_DISPLAY_ON,1 );LCD_Write_Cmd( CMD_DISPLAY_ON,2 );    
#define  LCD_Display_OFF();    LCD_Write_Cmd( CMD_DISPLAY_OFF,1 );LCD_Write_Cmd( CMD_DISPLAY_OFF,2 );

 

// func.h
#include  " defs.h "
void  delay( uint  n);
void  delay2( uint  n);
void  LCD_Init( void );
void  LCD_Write_Cmd(  byte  cmd ,uchar E_Select);
void  LCD_Write_Data(  byte  cmd ,uchar E_Select);
void  LCD_Set_Page( uchar pnum, uchar E_Select );
void  LCD_Set_Col( uchar colnum, uchar E_Select );
void  LCD_Show_Char( uchar chNum, uchar row, uchar big_col );
void  LCD_Show_Str( uchar  *  pstr    );
void  LCD_Show_One_Char( uchar chnum , uchar SED );
void  LCD_Fill( uchar m_data);
void  LCD_Fill_Page( uchar  *  p_data , uchar page);
uchar LCD_Get_Char_Index( uchar szText );
void  LCD_Show_Str_2( uchar  *  pstr    );

 

 

// func.c
#include  " defs.h "
#include 
" func.h "
#include 
" at89x51.h "

/* ASCII字体,大小6X8,上到下D0~D7,左到右 */
unsigned 
char  code ASCII[][ 6 ] = { { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, /* SPACE */
                               
{
0x00 , 0x7e , 0x21 , 0x21 , 0x21 , 0x7e }, /* A */
                               
{
0x00 , 0x7f , 0x49 , 0x49 , 0x49 , 0x36 }, /* B */
                               
{
0x00 , 0x3e , 0x41 , 0x41 , 0x41 , 0x22 }, /* C */
                               
{
0x00 , 0x7f , 0x41 , 0x41 , 0x22 , 0x1c }, /* D */
                               
{
0x00 , 0x7f , 0x49 , 0x49 , 0x49 , 0x49 }, /* E */
                               
{
0x00 , 0x7f , 0x09 , 0x09 , 0x09 , 0x01 }, /* F */
                               
{
0x00 , 0x3e , 0x41 , 0x49 , 0x49 , 0x7a }, /* G */
                               
{
0x00 , 0x7f , 0x08 , 0x08 , 0x08 , 0x7f }, /* H */
                               
{
0x00 , 0x41 , 0x7f , 0x41 , 0x00 , 0x00 }, /* I */
                               
{
0x00 , 0x20 , 0x40 , 0x41 , 0x3f , 0x01 }, /* J */
                               
{
0x00 , 0x7f , 0x08 , 0x14 , 0x22 , 0x41 }, /* K */
                               
{
0x00 , 0x7f , 0x40 , 0x40 , 0x40 , 0x40 }, /* L */
                               
{
0x00 , 0x7f , 0x02 , 0x0c , 0x02 , 0x7f }, /* M */
                               
{
0x00 , 0x7f , 0x04 , 0x08
<think>好的,我现在需要帮助用户找到在Arduino Mega 2560上使用JHD-2X16-I2C型号OLED显示霍尔编码器电机转动圈数的代码示例。首先,我需要确认用户的具体需求和背景。 用户之前询问过关于Arduino Mega 2560读取霍尔编码器并通过I2C OLED显示圈数的代码,我给出了使用Adafruit_SSD1306库的示例。现在用户提到JHD-2X16-I2C型号的OLED,但根据我的知识,JHD-2X16通常指的是字符型LCD,而不是OLED。可能用户混淆了LCD和OLED,或者JHD-2X16-I2C确实存在I2C接口的版本。需要确认这一点,但可能用户实际使用的是I2C LCD,比如基于HD44780的LCD模块,带有I2C转接板。这种情况下,可能需要使用LiquidCrystal_I2C库。 接下来,用户引用了两个参考资料,但其中引用1是关于连接16x2 LCD的教程,引用2是关于TFT显示屏的代码。这可能意味着用户之前尝试过其他显示模块,但现在需要针对JHD-2X16-I2C的解决方案。需要结合用户之前的代码,将OLED显示部分替换为I2C LCD的代码。 用户的需求是显示霍尔编码器的转动圈数,所以代码结构大致相同,只需要调整显示部分的库和初始化。需要确保编码器读取部分正确,使用中断处理脉冲,然后计算圈数,并通过I2C发送到LCD显示。 另外,用户可能遇到的问题包括:I2C地址是否正确、库的安装是否正确、编码器信号处理是否准确。在代码中需要注释这些关键点,并提醒用户根据实际情况修改参数,如编码器的PPR(每转脉冲数)、I2C地址等。 需要检查JHD-2X16-I2C的规格,通常I2C地址可能是0x27或0x3F,用户可能需要使用I2C扫描工具确认地址。同时,LiquidCrystal_I2C库的安装也是必要的,用户可能需要从库管理器安装。 最后,确保代码示例清晰,结构正确,包含必要的注释,帮助用户理解每一步的作用。同时,生成相关问题,帮助用户解决可能遇到的后续问题,比如I2C地址不匹配、显示内容不正确等。</think>以下是针对JHD-2X16-I2C型号(I2C接口LCD显示屏)Arduino Mega 2560结合的霍尔编码器圈数显示代码示例。该方案基于您之前的编码器读取逻辑进行了显示适配: ```cpp #include <Wire.h> #include <LiquidCrystal_I2C.h> // 初始化I2C LCD(地址通常为0x27或0x3F) LiquidCrystal_I2C lcd(0x27, 16, 2); // 参数:地址, 列数, 行数 // 编码器引脚定义(A0-A1对应数字引脚54-55) #define ENCODER_A 54 #define ENCODER_B 55 // 正交编码器解码表 const int8_t lookup_table[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; volatile long encoderCount = 0; volatile uint8_t old_AB = 0; const int encoderPPR = 100; // 按实际编码器每转脉冲数修改 void updateEncoder() { uint8_t A = digitalRead(ENCODER_A); uint8_t B = digitalRead(ENCODER_B); uint8_t new_AB = (A << 1) | B; uint8_t idx = (old_AB << 2) | new_AB; encoderCount += lookup_table[idx & 0x0F]; old_AB = new_AB; } ISR(PCINT2_vect) { updateEncoder(); } void setup() { pinMode(ENCODER_A, INPUT_PULLUP); pinMode(ENCODER_B, INPUT_PULLUP); // 配置引脚变化中断(PORTF) PCICR |= (1 << PCIE2); PCMSK2 |= (1 << PCINT16) | (1 << PCINT17); // 初始化LCD lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Count: 0"); lcd.setCursor(0, 1); lcd.print("Revs: 0.00"); // 初始编码器状态读取 old_AB = (digitalRead(ENCODER_A) << 1) | digitalRead(ENCODER_B); sei(); } void loop() { static unsigned long lastUpdate = 0; if (millis() - lastUpdate >= 200) { // 每200ms更新显示 lastUpdate = millis(); long currentCount; noInterrupts(); currentCount = encoderCount; interrupts(); float revolutions = currentCount / (4.0 * encoderPPR); // 4倍频解码 lcd.setCursor(7, 0); lcd.print(" "); // 清除旧数据区域 lcd.setCursor(7, 0); lcd.print(currentCount); lcd.setCursor(6, 1); lcd.print(" "); lcd.setCursor(6, 1); lcd.print(revolutions, 2); } } ``` 关键实现要点: 1. **I2C LCD初始化**:需先通过`lcd.init()`初始化,再开启背光`lcd.backlight()` 2. **显示优化**:采用局部刷新策略,仅更新数值变化区域,避免全屏闪烁 3. **数据同步**:使用`noInterrupts()`/`interrupts()`保护共享变量`encoderCount` 4. **单位换算**:`4.0`系数对应正交编码器的4倍频解码原理[^1] 硬件连接建议: - LCD的I2C接口连接Mega2560的20(SDA)/21(SCL)引脚 - 编码器A/B相分别连接A0/A1(数字引脚54/55) - 共地连接编码器Arduino
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值