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.
工具/软件:Code Composer Studio
大家好 、我是新手。 我尝试通过 PCF8574将1602A LCD 显示屏与 MSP430G2553相连。 当我运行代码时、不会发生任何情况:
#include unsigned int *ptxData; unsigned int count = 0; //[0..3]->加电,[4..5]->功能集,[6..7]->显示关闭,光标关闭,闪烁// [8..9]->清除屏幕,[10..11]->右,请勿移动,[12..13]->显示打开,光标打开 //[0x02] ,0x02[0x02],0x02[0x14],0x02],0x02[0x20] 0x00、0x00、0x08、0x00、0x01、 0x00、0x06、0x00、0x0F、0x24、 0x22}; void main (){ WDTCTL = WDTPW | WDTHOLD; //表示 i2c 引脚 P1SEL = 0xC0; P1SEL2 = 0xC0; // i2c 配置 UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC; UCB0CTL1 = UCSSEL_3; UCB0BR0 = 12; UCB0BR1 = 0; UCB0I2CSA = 0x27;//从器件地址 UCB0CTL1 &=~UCSWRST; //启用 TX 中断 IE2 |= UCB0TXIE; enable_interrupts (); //开始发送数据 ptxData = txData; UCB0CTL1 |= UCTR + UCTXSTT; while (1); } #pragma vector = USCIAB0TX_vector _中断 void USCIAB0TX_ISR (void){ //逐一发送 txData 元素 UCB0TXBUF =*ptxData; count++; *ptxData++; //如果 txData 结束,从开始 如果(count = 16){ 计数= 0; ptxData-= 16; } }
我遗漏了什么、您能为我提供帮助吗?
TxData[]数组的来源是什么? 我希望这是一个引脚设置序列、具体取决于 LCD 与 PCF8574的连接方式。 由于我不知道这些设置、因此我不知道如何准确地解释它们。
需要记住的一点是、控制器(假设是 HD44780)在序列中的某些点需要延迟、而该代码似乎没有这样做。
此外、请查看您的电路板上的芯片、看看它是 PCF8574还是 PCF8574A。 前者的地址在0x20-0x27范围内、后者在0x38-0x3F。
我更新了代码并添加了注释。 TxData 数组包含 LCD 指令、例如功能集、显示开/关等 从机地址正确。 但我无法添加延迟。 我尝试 以下操作:
#pragma vector = USCIAB0TX_Vector _中断 void USCIAB0TX_ISR (void){ //逐一发送 txData 元素 UCB0TXBUF =*ptxData; count++; *ptxData++; for (int i=0;i<10000;i++){} //如果 txData 结束,从开始 如果(count = 16){ 计数= 0; ptxData-= 16; } }
当我调试这个代码时、我看到针对循环被跳过。
我不建议针对循环执行延迟。 请改用__delay_cycles (UINT32_T)。 由于您尚未更改时钟、因此一个周期大约为1 μ s。
如果您确定地址和数据流正确、我推迟。 但是(a)我看不到任何会摆动 EN 引脚的东西(b) GitHub 上的一些/大多数示例似乎认为数据字节位于端口的高位、 不是低位(c) PCF8574数据表(SCPS068J)第8.3.1节似乎表明只有事务的第一个字节可用、其余字节将被忽略。
如何切换 E?
您能否在此处为 GitHub 上的某些示例添加链接? 我找不到任何内容。
对 PCF 的每次写入相当于对端口寄存器(字节)的写入。 我希望每个字节能看到4个事务:(a)(高位+ en=1)(b)(高位+ en=0)(c)(低位+ en=1)(d)(低位+ en=0)。 [编辑:D/C 位也适合此处的某个位置。]
您的第一站可能是制造商的网站。 其中一些比其他器件更好、但至少您应该能够找到显示引脚布线方式的原理图/图。 (我不知道市场上有多少变体。)
我在 GitHub 中搜索"LCD1602 I2C"、并获得了一系列点击结果。 下面是一个:
https://github.com/Szpillmann/LCD1602A/blob/master/LCD1602a.CPP
我所看到的任何一个都没有较低(I2C)层、只是对其进行调用(在"i2c_write"级别)。
我没有找到专门用于 MSP430的任何器件。 这里的这个人在使用 F5529、但 I2C 单元有点相似。 我想我记得他成功了,但重新阅读最后一句显然他没有成功。 现在我想知道他是否遇到了每事务1字节的限制。 不管怎样、它具有我所期望的部分(LCD 和 I2C 层)、它们可能只需要稍微重新封装。
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/907530
示例就在这里。 "I2C_02"似乎与您的 PCF 芯片的表弟一起工作。
http://dev.ti.com/tirex/explore/node?node=ALFfIDtjUH-HwRytz.WJPQ__IOGqZri__LATEST
我用几种方法编写了字符 LCD 的代码、但始终通过直接 GPIO 连接而不是使用 I2C I/O 扩展器。 这会使它变得更加困难。
此外、我无法这么说、因为当您说您使用 I/O 扩展器连接 LCD 时、您不提供有关连接的详细信息。 控制信号是否已连接?
我建议采用分治法:首先让 I/O 扩展器工作。 您需要一个将字节写入输出的函数。 在您开始工作后、您可能会担心与 LCD 的对话。
5V 至 VCC、GND 至 GND、P1.7至 SDA、P1.6至 SCL。 这些是唯一的连接。
感谢您的建议、我将更仔细地阅读文档并分析您提供的代码。 我希望我最终可以在屏幕上打印"Hello World"。
SDA 和 SCL 上没有上拉电阻器达到3.3V? (MSP430 Vcc)没有到 LCD 的连接?
我不知道。 您购买了具有 I2C 接口的显示屏、因此您知道自己拥有的器件。 我不是。 您必须阅读随附的文档、因为我没有它。
Sun创始人(以及其他人)销售 LCD1602、QAPASS 位于 LCD 背面、MH 位于背包上。 其 Wiki 页面指向 Arduino 库、其中包括:
#define LCD_背 光0x08 #define EN B00000100 //使能位 #define RW B00000010 //读取/写入位 #define Rs B00000001 //寄存器选择位
http://wiki.sunfounder.cc/index.php?title=I%C2%B2C_LCD1602
这是一个实际的原理图、它与我可以检查的内容相匹配。 它包括 I2C 上的上拉电阻器。 这些上拉电阻将达到5V、这可能适合 MSP430、也可能不适合 MSP430、但我想如果您尚未油炸过任何东西、您可以带走它。
它还在端口的高位显示了 D7-D4。