点阵屏是固定几排几列像素点(可以理解为小LED)的显示屏,想显示什么图形直接让某几个像素点点亮即可
段码屏是可以定制的,一般要有驱动,比点阵屏复杂一些,但是显示的图形可以更加多样化
段码屏驱动芯片可以选HT1621,中文资料
大概原理是驱动有32*4=128位的内存,操作某一位就可以操作段码屏的某个图形亮灭,理论可以操作128个图形的亮灭,而且彼此互相不干扰,因为不是靠直流电流驱动,而是交流驱动,所以用到的引脚也不多,感觉和数码管的动态显示原理差不多
写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号
注意: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);
}