Ht1621 驱动 段码LCD的问题
我用HT1621 驱动一个段码LCD (SEG0-SEG11, COM0-COM3). 驱动还在调试中, 现在屏能显示了, 但是不是我想要输出的数字, 很奇怪.我看了一下网上别的驱动, 好像要输出的数字要转换成一个编码才能输入到屏上的, 我不知道我这边屏的要怎么转, 这个有没什么标准的? 我用网上的试也不对...
还有一个问题是: 屏上的一个字是由二个地址控制的吗?
多谢! 1621没有8字码的概念,他只驱动液晶上的一个元素,至于那些元素组成一个8字,要看你自己的具体设计了。根据数据手册清理一张表出来,哪个寄存器对应你屏幕上的哪个显示元素,然后再写程序,你就清楚了。 附 驱动:
#define SPI_DELAY_TICKS (410*40) //I43_GSIU_CLOCK_CLOCK_DIVISOR_2048 //66Kb //For C10p
VOID
Delay(UINT uiMS)
{
UINT32 uiDelay = 0;
for(uiDelay=0; uiDelay<SPI_DELAY_TICKS; uiDelay++){}
}
VOID
LCDSetBit(BYTE byData, BYTE byCnt)
{
BYTE i;
for(i=0; i<byCnt; i++)
{
if((byData&0x80) == 0)
{
SetPin(LCD_PIN_DATA, 0);
}
else
{
SetPin(LCD_PIN_DATA, 1);
}
SetPin(LCD_PIN_WR, 0);
Delay(1);
SetPin(LCD_PIN_WR, 1);
Delay(1);
byData <<= 1;
}
}
VOID
SendDataBit(BYTE byData, BYTE byCnt)
{
BYTE i = 0;
for(i=0; i<byCnt; i++)
{
if((byData&0x01) == 0)
{
SetPin(LCD_PIN_DATA, 0);
}
else
{
SetPin(LCD_PIN_DATA, 1);
}
SetPin(LCD_PIN_WR, 0);
Delay(1);
SetPin(LCD_PIN_WR, 1);
Delay(1);
byData >>= 1;
}
}
VOID
SendCmd(BYTE byCmd)
{
SetPin(LCD_PIN_CS, 0);
//send flag "100"
LCDSetBit(0x80, 3);
LCDSetBit(byCmd, 9);
SetPin(LCD_PIN_CS, 1);
}
VOID
WriteByte(BYTE byAddress, BYTE byData)
{
BYTE i = 0;
SetPin(LCD_PIN_CS, 0);
//send flag "101"
LCDSetBit(0xA0, 3);
//Send 6 bits address
LCDSetBit(byAddress<<2, 6);
SendDataBit(byData, 4);
SetPin(LCD_PIN_CS, 1);
}
VOID
WriteBlockData(BYTE byAddress, PBYTE pbyData, BYTE byCnt)
{
BYTE i = 0;
SetPin(LCD_PIN_CS, 0);
//send flag "101"
LCDSetBit(0xA0, 3);
//Send 6 bits address
LCDSetBit(byAddress<<2, 6);
for(i=0; i<byCnt; i++, pbyData++)
{
SendDataBit(*pbyData, 8);
}
SetPin(LCD_PIN_CS, 1);
}
VOID
LCDTest()
{
BYTE byData = {0x21, 0x43, 0x65, 0x87, 0xa9};
BYTE byData2 = {0xbe,0x06,0x7c,0x5e,0xc6,
0xda,0xfa,0x0e,0xfe,0xde,
0xe6,0xb0,0x20,0x02,0x00,//H,L, 前后冒号
0xee,0xa8};// R, T
LCDPinsConfig();
SetPin(LCD_PIN_CS, 1);
SetPin(LCD_PIN_WR, 1);
SetPin(LCD_PIN_DATA, 1);
SendCmd(LCD_SYS_EN);
SendCmd(LCD_OSC_IN);
SendCmd(LCD_BIAS);
SendCmd(LCD_PWR_ON);
memset(byData2, 0, 17);
//WriteByte(0x09, 0x01);
WriteBlockData(0, byData2, 4);
OsThreadSleepMS(6000);
WriteByte(0x00, 1);
WriteByte(0x01, 2);
WriteByte(0x02, 3);
WriteByte(0x03, 4);
WriteByte(0x04, 5);
WriteByte(0x05, 6);
//SendCmd(LCD_PWR_OFF);
}
1621没有8字码的概念,他只驱动液晶上的一个元素,至于那些元素组成一个8字,要看你自己的具体设计了。根据数据手册清理一张表出来,哪个寄存器对应你屏幕上的哪个显示元素,然后再写程序,你就清楚了。 ...
NE5532 发表于 2010-6-6 15:52 https://bbs.21ic.com/images/common/back.gif
感谢NE5532!
我手头没有屏的资料, 我也觉得应该有个文档来描述1621上存储空间与屏上元素的对应关系. 不然不知道怎么设置. 但供应商又说是没有这样的文档的. 说屏是标准的, 不需要资料. 想问一下这种屏是不是一般相同的, 或者都是有这样的文档啊? TN屏一般都是定制的,是按你们公司的要求做的,他们不会知道什么1621不1621的,只知道com端和seg端与屏幕上元素的对应关系,就是引脚逻辑分布图,找他们要这个,或者资料就在你们开发部自己里面。就算是标准产品,也得提供逻辑图,不然怎么驱动?
1621的com和seg怎么接到屏上去就是你自己的事了。
上面两者共同构成寄存器到屏幕元素的映射关系。 如果上面的资料都掉了,你又实在找不到人问,就写测试程序一个元素一个元素的测。 本帖最后由 xwj 于 2010-6-6 16:15 编辑
缓存的一个位代表屏上的一段(一个笔画),要由很多段来组合成一个8字数字的(7段),
而这个对应关系则是各有各的设计,是完全不同的,所以必须看Datasheet或者自己测试。
而没有资料的话,自己测试也很简单,你逐位逐位的把每一位置位、延时1秒,置位下一位,再延时1秒...
很快就能画出对应关系了。
然后就按7段码编码即可。 明白啦! 非常感谢 2位 版主!NE5532 和 XWJ.
我先去测试一下, 试看找个对应关系来. 已经扫描出 对应表了, 发现我们的电路接错了. 现在问题可以解决啦.多谢二位版主啊! 呵呵,解决了就好。
小伙子做事挺快的嘛~:) 效率,赞一个! 不到不半小时就搞定,程序加测试!!确实该赞!!! 赞 我们具有最高fae级别的技术支持如果有大佬搞不定的联系我3361807052 13534142374微信同号
我们这边有合泰原厂工程师可以提供技术支持哦,V18576740188 走了不少弯路,名师一句话就点通了 本帖最后由 cpu51 于 2021-5-2 09:25 编辑
我也没搞懂1621显示,0-31段,128个地址,我全部接了,那么我要显示一个8,每次指令数据传送一个地址,一个段点亮,显示8是不是要连续传送7次的位段码(即每次只是点亮一个位),下次再显示6,是不是要清掉原来的数据,再传送新的段码?谢谢大神解答。
页:
[1]