关于段码屏

204 阅读2分钟

点阵屏是固定几排几列像素点(可以理解为小LED)的显示屏,想显示什么图形直接让某几个像素点点亮即可

段码屏是可以定制的,一般要有驱动,比点阵屏复杂一些,但是显示的图形可以更加多样化

段码屏驱动芯片可以选HT1621,中文资料

大概原理是驱动有32*4=128位的内存,操作某一位就可以操作段码屏的某个图形亮灭,理论可以操作128个图形的亮灭,而且彼此互相不干扰,因为不是靠直流电流驱动,而是交流驱动,所以用到的引脚也不多,感觉和数码管的动态显示原理差不多

写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号

部分参考代码

HT1621硬件原理

注意:HT1621有背光

用到的一些函数:(完全照搬是完全不行的,只是提供思路)

u8 x1y1 = 0x41, x2y1 = 0x51,x3y1 = 0x31,x4y1 = 0x33,x5y1 = 0x37, x6y1 = 0x3f, x7y1 = 0x48;//格式是seg-20(高四位)com(低四位)1是com1 2是com2 4是com3 8是com4
void ht1621_send_high_order_data(u8 data, u8 len)
{
	u8 i;
 
	for (i=0; i<len; i++)
	{
		if((data&0x80) == 0)
		{
			HT_DATA = 0;	
		}
		else
		{
			HT_DATA = 1;
		}
		
		HT_WR = 0;
		delay_ms(1);
		HT_WR =1;	
		
		data <<= 1;
	}
}
void ht1621_send_low_order_data(u8 data, u8 len)
{
	u8 i;
	
	for (i=0; i<len; i++)
	{
		if((data&0x01) == 0)
		{
			HT_DATA = 0;	
		}
		else
		{
			HT_DATA =1;
		}
		
		HT_WR = 0;
		delay_ms(1);
		HT_WR = 1;	
		
		data >>= 1;
	}
}
 
void ht1621_send_cmd(u8 command)
{
	HT_CS = 0;	
	ht1621_send_high_order_data(0x80, 4);
	ht1621_send_high_order_data(command, 8);
	HT_CS = 1;
}
 
void ht1621_write(u8 addr, u8 data)
{
	HT_CS = 0;
	ht1621_send_high_order_data(0xA0, 3);
	ht1621_send_high_order_data(addr<<2, 6);
	ht1621_send_low_order_data(data, 8);
	HT_CS = 1;
}

void ht1621_write_half(u8 addr, u8 data)//写入字节的前半部分
{
	HT_CS = 0;
	ht1621_send_high_order_data(0xA0, 3);
	ht1621_send_high_order_data(addr<<2, 6);
	ht1621_send_low_order_data(data, 4);
	HT_CS = 1;
}
 
void ht1621_write_all(u8 addr, u8 *p, u8 len)
{
	u8 i;
	
	HT_CS = 0;
	ht1621_send_high_order_data(0xA0, 3);
	ht1621_send_high_order_data(addr<<2, 6);
	
	for (i=0; i<len; i++, p++)
	{
		ht1621_send_low_order_data(*p, 8);
	}
	
	HT_CS = 1;	
} 
 
void ht1621_clr_all_display(void)
{
	u8 i;
	u8 addr = 0;
	
	for (i=0; i<16; i++)
	{
		ht1621_write(addr, 0x00);
		addr += 2;
	}
}
 
void ht1621_all_display(void)
{
	u8 i;
	u8 addr = 0;
	
	for (i=0; i<16; i++)
	{
  	ht1621_write(addr, 0xff);
		addr += 2;
	}	
}
void display_xy(u8 xy)
{
	ht1621_write_half((xy >> 4) + 20, xy);
}
void set_lcd_on(void)
{
	ht1621_send_cmd(HT_LCD_ON);
}
 
void set_lcd_off(void)
{
	ht1621_send_cmd(HT_LCD_OFF);
}
void display_home(u8 num)
{
	if(num == 0)
		seg24 &= 0x07;
	else if(num == 1)  
		seg24 |= 0x08;
	
	display_xy(0x40 + seg24);//8 4 2 1  -> 1000 0100 0010 0001   1代表亮
}
void display_speed(u8 num)
{
	if(num == 0)
		seg25 &= 0x01, seg24 &= 0x09;//0001 1001
	
	else if(num == 1)
		seg25 &= 0x09, seg24 &= 0x09, seg25 |= 0x08;//1001 1001 //1000
	
	else if(num == 2)
		seg25 &= 0x09, seg24 &= 0x0d, seg25 |= 0x08, seg24 |= 0x04;//1001 1101 //1000 0100
	
	else if(num == 3)
		seg25 &= 0x0d, seg24 &= 0x0d, seg25 |= 0x0c, seg24 |= 0x04;//1101 1101 //1100 0100
	
	else if(num == 4)
		seg25 &= 0x0d, seg25 |= 0x0c, seg24 |= 0x06;//1100 0110 //1101 
	
	else if(num == 5)
		seg25 |= 0x0e, seg24 |= 0x06;//1110 0110	
	
	display_xy(0x50 + seg25), display_xy(0x40 + seg24); 
}