This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI C/C++编译器
您好!
我尝试通过读取 MSP430的 ADC 值在 LCD 上显示电池电压和电流。
通过使用 Energia IDE 和 Launchpad、我能够在 LCD 上显示并正常工作。
但我需要使用 IAR 嵌入式工作平台来显示这些值、任何用于 LCD 的示例代码和库都将有所帮助。
我使用的是 JHD162A LCD,任何与其兼容的库和驱动程序也会有所帮助。
此致、
Phanendra
Phanendra、您好!
由于此 LCD 显示屏不是 TI 产品、因此我们没有任何直接示例可供您用于此特定应用。
但是、客户使用此或其他 LCD 模块的还有其他线程、这些线程可能是您参考的:
下面 是我通过网络找到的另一个资源、它可能也会有所帮助。
谢谢、
Chris
尊敬的 Chris:
好的、谢谢、但我需要示例代码、因为通过 Energia IDE、我能够获得所有值并集成系统。
但是、为了实现代码隐私、我需要在 IAR 嵌入式系统上完成该操作。
此致、
Phanendra
还有一件事、我需要将 MSP430 RX 引脚上接收的数据打印到 LCD 上。
尊敬的 Chris:
请提供最新信息。
我能够将 LCD 与 IAR 集成、但只能看到黑点。我正在打印字符串、但无法在 LCD 上看到任何内容。
电平转换器或任何特定的频率。
/* libLCD.h * *为 SparkFun 的 Basic 16x2字符 LCD 编写的头文件。 *(www.sparkfun.com/.../9053) *应适用于在 4位模式下使用公共* ST7066/HD44780并行接口的任何显示器。 *要使这在8位模式下工作、只需调整 下面的一些*引脚定义并调整一些初始化。 * *创建日期:2012年10月18日 * 作者:Stephen Bennett */ #ifndef LIBLCD_H_ #define LIBLCD_H_ /********* \|* 标准 MSP430包括*|\******** /#include /*微控制器时钟速度-用于定时计算*/ #define MCU_XTAL_CLK 1000000 #define MCU_XTAL_TIME ((MCU_XTAL_CLK)/ 1000) /*将毫秒转换为时钟周期。 */ #define _delay_milliseconds (ms)\ __DELAY_CYCLES ((((毫秒)*(MCU_XTAL_TIME))) /******* \|* 定义用于通信的端口*|目前,所有引脚都应位于同一端口 \******* //* 数据引脚必须位于同一端口*//#define LCD_DIR_DATA P2DIR //#define LCD_OUT_DATA P2OUT /*寄存器选择端口*/ //#define LCD_DIR_RS P2DIR //#define LCD_OUT_RS P2OUT /*读/写端口*/ //#define LCD_DIR_RW P2DIR //#define LCD_OUT_RW P2OUT /*启用端口*/ //#define LCD_DIR_EN P2DIR //#define LCD_OUT_EN P2OUT/********* \|* 定义用于通信的引脚*|\********* //* 数据引脚必须是连续且升序的*/ #define LCD_PIN_D4 Bit 2 #define LCD_PIN_D5 BIT3 #define LCD_PIN_D6 BIT4 #define LCD_PIN_D7 Bit 5 #define LCD_PIN_RS BIT6 //#define LCD_PIN_RW BIT6 #define LCD_PIN_EN BIT7 #define LCD_MASK_DATA (LCD_PIN_D7 | LCD_PIN_D6 | LCD_PIN_D5 | LCD_PIN_D4) /*********** \|* 定义有用的显示特性*|\********* /#define LCD_NUM_cols 16 #define LCD_NUM_ROWS 2 /********* \|* 定义显示命令*|\********* /* 函数集定义*/ #define FUNC功能性 集 0x20 //必须设置为执行 FUNC功能性 Set_CMD #define Intfc_data_LEN 0x10 //高:8位接口|低:4位接口 #define Two_line_DISP 0x08 //高:2行显示|低:1行显示 #define char_font_size 0x04 //高:5x10点|低:5x8点(仅可用于单线显示) //函数集命令-修改为喜欢*/ #define Function_Set_CMD (Function_Set | Two_LINE_DISP) /* Display Initialization define */ #define DISPLAY_ON 0x08 //必须设置为执行 DISPLAY_ON_CMD #define LOW_DISP_ON 0x04 #define LOCK_ON 0x02 //将光标显示在当前位置 #define curse_blink_on 0x01 //使光标闪烁 //显示初始化命令-修改为喜欢*/ #define Display_ON_CMD (DISPLAY_ON | ENLOW_DISP_ON | LOSOR_ON) /*进入模式初始化定义*/ #define entry_mode 0x04 //必须设置为执行 entry_mode_CMD #define Cursor INCR 0x02 //字符写入时光标增量,否则减量 #define Display_shift_on 0x01 //根据 Cursor _INCR /* 进入模式初始化命令移动显示-修改为喜欢*/ #define Entry_mode_CMD (entry_mode | Cursor _INCR) /*其他命令*/ #define CLEAR_DISP_CMD 0x01 //清除显示 #define RET_HOME_CMD 0x02 //返回光标到左上角(0,0)/******** \|* 有用数据类型定义*|\******** /#define 命令 0 #define 数据 1 typedef unsigned char uint8_t; /********* \|* 公共函数原型*|\******** / void LCD_init (void); void LCD_printStr (char *文本); void LCD_printChar (char 字符); void LCD_sendCommand (char 命令); void LCD_setCursorPosition (uint8_t row、 uint8_t col); void lcd_clearScreen (void); #endif // * liblcd.c * *创建日期:2012年10月18日 * 作者:Stephen Bennett */ #include "lcdLib.h" /******** \|* Helper 函数原型*|\******** / void lcd_sendCommand (char 命令); void lcd_sendByte (char byteToSend、uint8_t byteType); void lcd_sendNibble (char nibleToSend); void lcd_pulseEnablePin (void); /******** \|* 公共功能*|\****** //*------------------ *\ |*公共函数:lcd_setCursorPosition |* ||设置光标在屏幕上的位置。 |* |*参数 |* |***不检查行/列限制** |*行-基于零的行号<LCD_NUM_ROWS |*-基于零的列号<LCD_COL_cols |* |* return |* void |* \*--- // void lcd_setCursorPosition (uint8_t row、uint8_t col) { uint8_t address; //从(row、col)对构造地址*/ if (row =0) { 地址= 0; } 否则 { 地址= 0x40; } 地址|= col; LCD_sendCommand (0x80 |地址); } /*--------------- *\ |*公共功能::LCD_clearScreen |* |*清除屏幕数据并将光标返回到初始位置(0、0)。 ||自动将光标设置为递增。 |*显示切换不受影响。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- */ void LCD_clearScreen (void) { LCD_sendCommand (clear_DISP_CMD); LCD_sendCommand (RET_HOME_CMD); }/*--------------- *\ |*公共函数::lcd_init |* ||加电后初始化 LCD |* ||注:|* 此例程不得在 LCD 上调用两次。 ||当 MCU 和 LCD 的电源是独立的时,这种情况并不少见。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- ~void LCD_init (void){//*设置 MSP 引脚配置并将其设为低电平*/ P2DIR |= LCD_MASK_DATA;P2DIR |= LCD_PIN_RS;P2DIR |= LCD_PIN_EN;P2DIR &=~(LCD_MASK_DATA);P2DIR &=Δ Σ LCD_PIN_RS; P2DIR &=~LCD_PIN_EN; //等待 LCD 预热并到达活动区域。 *请记住、MSP 的加电速度比 LCD 快得多。 *(Vcc 升至2.7V 以上后至少40ms) */ _delay_milliseconds (80); /********* \|* 初始化 LCD 模块*|\********* /* 根据 Hitachi HD44780数据表(图24,第46页)*/* 1a。 设置为4位输入-尝试三(3)次*/ uint8_t i = 3; 同时(i!= 0) { LCD_sendNibble (0x03); _delay_milliseconds (5); --i; } /* 1b。 设置为4位接口*/ lcd_sendNibble (0x02); _delay_milliseconds (1); /* 1c。 设置行数、字体大小等 // lcd_sendCommand (function_set_cmd); _delay_milliseconds (1); // 2. 初始化显示 *打开/关闭显示屏、光标打开/关闭、光标闪烁打开/关闭 // lcd_sendCommand (display_ON_CMD); _delay_milliseconds (1); // 3. 初始化进入模式 *文字方向、光标移动、显示移动等 */ lcd_sendCommand (entry_mode_cmd); _delay_milliseconds (1); } /*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- *\ |*公共函数:LCD_printStr |* ||在屏幕上打印字符串。 |* |*参数 |* |*文本-字符的 NULL 终止字符串 |* |*返回 |* |* void |* \*--------- // void LCD_printStr (char *文本) { char * c; c = text; while (c!= 0)&&(* c!= 0) { lcd_sendByte (* c、data); C++; } }/*--><!--kadov_tag{{</spaces>}}--> *\ |*公共函数:LCD_printChar |* ||在屏幕上打印字符。 |* |*参数 |* |*字符-要打印的字符 |* |*返回 |* |* void |* \*-->------ */ void LCD_printChar (char 字符) { LCD_sendByte (字符、数据); }/*--------------- *\ |*公共函数::lcd_sendCommand |* ||以4位模式向数据总线上的 LCD 发送命令。 |* |*参数 |* |*命令-发送 |* |* return |* |* void |* \*------------------------------------------------------- // void lcd_sendCommand (char 命令){ lcd_sendByte (命令、命令); } /****** \|* Helper 功能*|\****** //*------------------ *\ |* helper 函数::lcd_sendByte |* ||在4位模式下在数据总线上发送一个字节。 |*这需要以两个块发送数据。 |*先是高半字节,然后是低半字节。 |* |*参数 |* byteToSend -要发送的单字节 |* byteType -数据或命令 |* |* return |* void |* \*------------------------------------------------------- // void lcd_sendByte (char byteToSend、uint8_t byteType) { //将 Reg Select 行设置为适当的模式(HIGH:data | low:command)*/ if (byteType == command) { P2DIR &=~LCD_PIN_RS; } else //(字节=数据) { P2DIR |= LCD_PIN_RS; }/* 在数据线路上设置高半字节(HN)*/ LCD_sendNibod((byteToSend & 0xF0)>>4); /*在数据线路上设置低半字节(LN)*/ LCD_sendNibod( byteToSend & 0x0F ); }/--------------- *\ |*帮助函数:lcd_sendNibble |* |*在4位模式下在数据总线上发送半字节。 |* |*参数 |* byteToSend -要发送的单字节 |* |* return |* void |* \*------------------------------------------------------- /void lcd_sendNibble (char nibbleToSend) {/* 清除所有数据引脚*/ P2DIR &=~(lcd_mask_data); /*设置半字节*/ P2DIR |= nibbleToSend; /*现在设置 LCD 的数据线-让它读取它们*/lcd_pulseEnablePin (---------------------;---------------------------------------------------- *\ |*帮助程序函数:lcd_pulseEnablePin |* |*每当需要 ||命令 LCD 扫描其数据总线时,必须调用此函数。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- ~void LCD_pulseEnablePin (void){//*将 EN 位拉低*/ P2DIR &=~LCD_PIN_EN;__DELAY_CYCLES (200);//*将 EN 位拉高*/ P2DIR |= LCD_PIN_EN;__DELAY_CYCLES (200);//*再次将 EN 位拉低*/ P2DIR &=* * 2 * LCD_IN_IN_EN 位;**创建时间********** 2 IN_IN_IN_IN_IN_INCEN 周期(200);****** 作者:Stephen Bennett */ #include "liblcd.h" #include "libmsp430.h" /*--------------- *\ |*公共函数:: main |* ||主入口点到 sketch。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- // void main (void) { WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器 P1DIR |= BIT6;//将 BIT6设置为输出(绿色 LED) P1OUT &=~BIT6; //打开绿色 LED //初始化2秒延迟的计时器->中断并返回活动模式中的代码*/ MSP430_timerA0Init(1000); LCD_init(); while (1){ lcd_clearScreen(); LCD_printStr ("您好..."); LCD_setCursorPosition (1、6); _bis_SR_register (LPM3_bits + GIE);//在启用通用中断的情况下进入 LPM3 LCD_printStr ("Hello World"); _bis_SR_register (LPM3_bits + GIE);//启用常规中断后进入 LPM3 } void timerA0InterruptHandler (void) { P1OUT ^= BIT6;//切换绿色 LED 以获得视觉提示 }
您好、phanendra、
在尝试移植到 IAR 之前、您的项目是否在 Energia 中正常运行?
Chris
/* liblcd.c * *创建时间:2012年10月18日 * 作者:Stephen Bennett */ #include "lcdLib.h" /******** \|* Helper 函数原型*|\******** / void lcd_sendCommand (char 命令); void lcd_sendByte (char byteToSend、uint8_t byteType); void lcd_sendNibble (char nibleToSend); void lcd_pulseEnablePin (void); /******** \|* 公共功能*|\****** //*------------------ *\ |*公共函数:lcd_setCursorPosition |* ||设置光标在屏幕上的位置。 |* |*参数 |* |***不检查行/列限制** |*行-基于零的行号<LCD_NUM_ROWS |*-基于零的列号<LCD_COL_cols |* |* return |* void |* \*--- // void lcd_setCursorPosition (uint8_t row、uint8_t col) { uint8_t address; //从(row、col)对构造地址*/ if (row =0) { 地址= 0; } 否则 { 地址= 0x40; } 地址|= col; LCD_sendCommand (0x80 |地址); } /*--------------- *\ |*公共功能::LCD_clearScreen |* |*清除屏幕数据并将光标返回到初始位置(0、0)。 ||自动将光标设置为递增。 |*显示切换不受影响。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- */ void LCD_clearScreen (void) { LCD_sendCommand (clear_DISP_CMD); LCD_sendCommand (RET_HOME_CMD); }/*--------------- *\ |*公共函数::lcd_init |* ||加电后初始化 LCD |* ||注:|* 此例程不得在 LCD 上调用两次。 ||当 MCU 和 LCD 的电源是独立的时,这种情况并不少见。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- ~ void LCD_init (void){//*设置 MSP 引脚配置并将其设为低电平*/ P2DIR |= LCD_MASK_DATA;P2DIR |= LCD_PIN_RS;P2DIR |= LCD_PIN_EN;P2OUT &=μ F (LCD_MASK_DATA); P2OUT &=μ~LCD_PIN_RS; P2OUT &=~LCD_PIN_EN; /*等待 LCD 预热并达到活动区域。 *请记住、MSP 的加电速度比 LCD 快得多。 *(Vcc 升至2.7V 以上后至少40ms) */ _delay_milliseconds (80); /********* \|* 初始化 LCD 模块*|\********* /* 根据 Hitachi HD44780数据表(图24,第46页)*/* 1a。 设置为4位输入-尝试三(3)次*/ uint8_t i = 3; 同时(i!= 0) { LCD_sendNibble (0x03); _delay_milliseconds (5); --i; } /* 1b。 设置为4位接口*/ lcd_sendNibble (0x02); _delay_milliseconds (1); /* 1c。 设置行数、字体大小等 // lcd_sendCommand (function_set_cmd); _delay_milliseconds (1); // 2. 初始化显示 *打开/关闭显示屏、光标打开/关闭、光标闪烁打开/关闭 // lcd_sendCommand (display_ON_CMD); _delay_milliseconds (1); // 3. 初始化进入模式 *文字方向、光标移动、显示移动等 */ lcd_sendCommand (entry_mode_cmd); _delay_milliseconds (1); } /*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- *\ |*公共函数:LCD_printStr |* ||在屏幕上打印字符串。 |* |*参数 |* |*文本-字符的 NULL 终止字符串 |* |*返回 |* |* void |* \*--------- // void LCD_printStr (char *文本) { char * c; c = text; while (c!= 0)&&(* c!= 0) { lcd_sendByte (* c、data); C++; } }/*--><!--kadov_tag{{</spaces>}}--> *\ |*公共函数:LCD_printChar |* ||在屏幕上打印字符。 |* |*参数 |* |*字符-要打印的字符 |* |*返回 |* |* void |* \*-->------ */ void LCD_printChar (char 字符) { LCD_sendByte (字符、数据); }/*--------------- *\ |*公共函数::lcd_sendCommand |* ||以4位模式向数据总线上的 LCD 发送命令。 |* |*参数 |* |*命令-发送 |* |* return |* |* void |* \*------------------------------------------------------- // void lcd_sendCommand (char 命令){ lcd_sendByte (命令、命令); } /****** \|* Helper 功能*|\****** //*------------------ *\ |* helper 函数::lcd_sendByte |* ||在4位模式下在数据总线上发送一个字节。 |*这需要以两个块发送数据。 |*先是高半字节,然后是低半字节。 |* |*参数 |* byteToSend -要发送的单字节 |* byteType -数据或命令 |* |* return |* void |* \*------------------------------------------------------- // void lcd_sendByte (char byteToSend、uint8_t byteType) { //将 Reg Select 行设置为适当的模式(HIGH:data | low:command)*/ if (byteType == command) { P2OUT &=~LCD_PIN_RS; } else //(字节=数据) { P2OUT |= LCD_PIN_RS; }/* 在数据线路上设置高半字节(HN)*/ LCD_sendNibod((byteToSend & 0xF0)>>4); /*在数据线路上设置低半字节(LN)*/ LCD_sendNibod( byteToSend & 0x0F ); }/--------------- *\ |*帮助函数:lcd_sendNibble |* |*在4位模式下在数据总线上发送半字节。 |* |*参数 |* byteToSend -要发送的单字节 |* |* return |* void |* \*------------------------------------------------------- /void lcd_sendNibble (char nibbleToSend) {/* 清除所有数据引脚*/ P2OUT &=~(lcd_mask_data); /*设置半字节*/P2OUT |= nibbleToSend; /*现在设置 LCD 的数据线-让它读取它们*/lcd_pulseEnablePin (---------------------;---------------------------------------------------- *\ |*帮助程序函数:lcd_pulseEnablePin |* |*每当需要 ||命令 LCD 扫描其数据总线时,必须调用此函数。 |* |*参数 |* |* void |* |* return |* void |* \*-->--------- // void LCD_pulseEnablePin (void) { //*将 EN 位拉为低电平*/ P2OUT &=~ ~LCD_PIN_EN;__DELAY_CYCLES (200);//*将 EN 位拉为高电平*/ P2OUT |= LCD_PIN_EN;__DELAY_CYCLES (200);//再次将 EN 位拉为低电平*/= P2OUT &= 3 = LCD_BISTOP_DELAM = 3;= 3 p_BISTOP_DELAY = 3;//扩展器= 3 = toffer宽度= 2
感谢 Stefan、
根据建议、我更改了代码、但仍然无法在屏幕上显示任何字符、只有我能够自己看到黑点。
Phanendra、您好!
请提供更多信息、
您是否在 IDE 中收到任何错误代码?
到目前为止、您尝试了哪些调试方法?
Chris
尊敬的 Chris:
代码中没有错误调试。
尊敬的 Chris:
由于一些接地问题、它现在可以工作、但它没有工作。
以下是代码片段。
unsigned char packetBuf[PACKETLEN]; unsigned int 电池电压; packetBuf[106]=电池 电压&0xFF; packetBuf[107]=(电池电压>> 8)& 0xFF;
、
我需要您的指导来显示8位值并将其通过数据库传递到 LCD。
Phanendra、
很高兴听到您的显示屏正在工作!
请查看以下应用报告:"使用 MSP430 MCU 和分段式 LCD 进行设计"。
本文档应包含使用 MSP430设计段 LCD 项目时需要考虑的所有信息。
最棒的
Chris
你(们)好
我需要在 LCD 上显示上述参数、因为它们是十六进制数。
在转换期间、我能够在 LCD 16x2屏幕上看到8个零。
请找到以下用于十六进制转换的代码片段。
unsigned int Hexadecime_to _decimal (unsigned int value) { unsigned char a、b、c、d; unsigned int e、f、g、十进制; A=(Value&0x0F);//提取第一位 b=((value>>4)&0x0F);//提取第二位 C=((value>>8)&0x0F);//提取第三位 D=((value>>12)&0x0F);//提取第四位 E= A*(8>3); f=(b*(8<1)+e); G=(c*(8<5))+f; 十进制=(d*(8<9)+g; 返回十进制; }