本帖最后由 tuoxieshu 于 2018-11-5 19:07 编辑
一直都对驱动段码液晶很头痛,原理这里就不赘述了。简单来说需要偏压交流信号来驱动。比点亮数码管麻烦多了。
以前试过用IO口模拟交流信号驱动过,效果不是很理想。后来又用HT1621芯片驱动,可以是可以,不过还是嫌麻烦。买了不少段码液晶屏全部在那吃灰。
最近玩新唐,发现新唐N76E616自带段码驱动功能,于是翻出吃灰的液晶屏小试牛刀,效果很好。电路简单,控制逻辑也很清晰。
板子是自己画的,很小的板子。画板子倒不难,难的从大覆铜板上切一小块下来。。。需要买个割板刀了。
我不太爱用热转印,都用纯化学转印,成功率比热转印高多了。可以看到转印效果不错,文字细节都保留下来了。
可以直接插在最小系统板上。
PCB
使用的段码液晶图纸。
关键代码/**
* Wire connection
* MCU Pin: COM3 COM2 COM1 COM0 SEG0 SEG5 SEG4 SEG3 SEG2 SEG1
* MCU Pin: P10 P11 P12 P13 P40 P45 P44 P43 P42 P41
* LCD Pin: 1 2 3 4 5 6 7 8 9 10
* --------------------------------------------------------------
* COM1 COM1 4G 1A 4D 2A 4A 3A
* COM2 COM2 1F 1B 2F 2B 3F 3B
* COM3 COM3 1G 1C 2G 2C 3G 3C
* COM4 COM4 1E 1D 2E 2D 3E 3D
*/
void ShowDigitFor888E(UINT8 digitPlace, UINT8 num, UINT8 tempUnit) {
UINT8 segABCD = 0;
UINT8 segEFG = 0;
// 参数检查
if ((digitPlace < 1 || digitPlace > 3) ||
(num > 9)) {
return;
}
// MCU's SEG0-5 Enable
// SEG0-SEG7 由 LCDSEG0 寄存器管理
LCDSEG0 = SET_BIT0 | SET_BIT1 | SET_BIT2 | SET_BIT3 | SET_BIT4 | SET_BIT5;
// 根据实际的引脚连接,以及LCD模块的段码表,确定改变哪些SEG的数据
// 每个SEG是一个8位数据,1/4Duty时,高4位不使用,低4位的数据就是段码表的COM1-4的数据
switch (digitPlace)
{
case 1:
segABCD = 5;
segEFG = 0;
break;
case 2:
segABCD = 3;
segEFG = 4;
break;
case 3:
segABCD = 1;
segEFG = 2;
break;
default:
break;
}
// 确定了SEG以后,开始设置数字各段数据(其实可以全部计算出来结果放在一个code数组里即可)
// 设置ABCD段数据(COM0-A,COM1-B,COM2-C,COM3-D)
LCDPTR = segABCD;
switch (num)
{
case 0:
LCDDAT = COM0 | COM1 | COM2 | COM3;
break;
case 1:
LCDDAT = COM1 | COM2;
break;
case 2:
LCDDAT = COM0 | COM1 | COM3;
break;
case 3:
LCDDAT = COM0 | COM1 | COM2 | COM3;
break;
case 4:
LCDDAT = COM1 | COM2;
break;
case 5:
LCDDAT = COM0 | COM2 | COM3;
break;
case 6:
LCDDAT = COM0 | COM2 | COM3;
break;
case 7:
LCDDAT = COM0 | COM1 | COM2;
break;
case 8:
LCDDAT = COM0 | COM1 | COM2 | COM3;
break;
case 9:
LCDDAT = COM0 | COM1 | COM2 | COM3;
break;
default:
break;
}
// 设置EFG段数据(COM1-F,COM2-G,COM3-E)
LCDPTR = segEFG;
switch (num)
{
case 0:
LCDDAT = COM1 | COM3;
break;
case 1:
LCDDAT = 0x00;
break;
case 2:
LCDDAT = COM2 | COM3;
break;
case 3:
LCDDAT = COM2;
break;
case 4:
LCDDAT = COM1 | COM2;
break;
case 5:
LCDDAT = COM1 | COM2;
break;
case 6:
LCDDAT = COM1 | COM2 | COM3;
break;
case 7:
LCDDAT = 0x00;
break;
case 8:
LCDDAT = COM1 | COM2 | COM3;
break;
case 9:
LCDDAT = COM1 | COM2;
break;
default:
break;
}
// 设置摄氏度符号段数据(COM0-SEG0,2,4)
// 注意这里要用或计算,不然会覆盖之前设置好的数字部分的段码数据
switch (tempUnit)
{
case 0xC:
LCDPTR = 2; // 4A段 set
LCDDAT |= COM0;
LCDPTR = 4; // 4D段 set
LCDDAT |= COM0;
LCDPTR = 0; // 4G段 clear
LCDDAT &= ~COM0;
break;
case 0xF:
LCDPTR = 2; // 4A段 set
LCDDAT |= COM0;
LCDPTR = 4; // 4D段 clear
LCDDAT &= ~COM0;
LCDPTR = 0; // 4G段 set
LCDDAT |= COM0;
break;
default:
LCDPTR = 2; // 4A段 clear
LCDDAT &= ~COM0;
LCDPTR = 4; // 4D段 clear
LCDDAT &= ~COM0;
LCDPTR = 0; // 4G段 clear
LCDDAT &= ~COM0;
break;
}
}
|
实属干货,干了
楼主你好,可以发一下完整版的吗哈哈2463574307@qq.com,谢谢楼主