(1) 段码屏幕的驱动程序与数字管的静态驱动程序相同。只要我们知道如何显示基本单位,我们就可以根据基本单位编写字库表,然后编写字库表 用与(&)和或(|)这两个位运算符可以随意编写我们想要显示的数字或形状。有两种常见的驱动方案:
第一:如果单片机内部集成seg和com引脚液晶驱动模块直接由单片机驱动。
二是单片机用三种IO口跟HT1621用于通信 HT1621驱动段码屏。
这节我重点介绍第二种。HT1621有4个COM,分别是com3,com2,com1,com0。有32个SEG,分别是SEG0,SEG1….SEG31。
什么是COM,什么是SEG?用鸿哥的想法来解释,COM是横向X坐标,SEG是垂直Y坐标。X坐标和Y坐标组合成一个表格,每个网格代表一个显示点。比如HT1621,有4个COM,32个SEG,形成一个32行,每行4个点的表格,共128个点,即最多可以显示128个点,最多可以显示128个数字管。LED灯。Y轴的地址范围为0到31,因为垂直有32行。我们用一个字节来表示每行X轴上的四个点。字节有8位,高4位分别代表4点,低4位为空。比如第一行(SEG0行)的第1个(COM3)显示,第二个(COM2)显示,第三个(COM1)不要显示第四个(COM0)不要显示,然后用字节表示16进制0xc0.只要X轴的数据设置为0,就要点亮这两个点亮xc0,Y轴的数据设置为0x00,然后放入鸿哥精心研制的鸿哥。seg_display(unsigned
char col, unsigned char pag)在驱动程序中就可以了.
(2)功能要求:
在COM和SEG组成的4X第二行第三和第四两点显示在32表中。
(3) 硬件原理:
三个单片机IO口分别跟HT1621的CS,WR,DATA连接。
(4)适合源码的单片机:STC11F04E,晶振为11.0592MHz。
(5)源代码讲解如下:
#include "REG52.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define BIAS 0X52 //这里一定要小心,上个月的一个项目在这里被卡了7天。
///必须跟随硬件电路COM匹配。一个或两个COM:0x42。3个COM:0x4A。4个COM:0x52
#define RC256 0X30
#define SYSTEN 0X02
#define SYSDIS 0X00
#define LCDON 0X06
void SendBitToHT1621(unsigned char nbit,unsigned char n);///在字节中发送N位HT在1621里,驱动程序的底部
void write_com(unsigned char cmdcode); //写命令到LCD
void init_lcd(); //--初始化LCD屏
void seg_display(unsigned char col, unsigned char pag); //显示基本单位点
void screen_clear (); ///清空屏幕内容
//补充说明:程序风格是这样的,所有输出IO后缀都是_dr,凡是输入////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////IO后缀//是_sr
sbit ht162x_data_dr=P3^1;
sbit ht162x_cs_dr=P3^6;
sbit ht162x_wr_dr=P3^0;
main()
{
init_lcd(); ///初始化液晶屏
screen_clear ()
seg_display(0x30,1); //在COM和SEG组成的4X第二行第三和第四两点显示在32表中。
while(1)
{
;
}
}
///在字节中发送N位HT在1621里,驱动程序的底部
void SendBitToHT1621(unsigned char nbit,unsigned char n)
{
unsigned char i;
for(i=0;i
{
ht162x_wr_dr=0;
if(nbit>=0x80) //判断最高位
ht162x_data_dr=1;
else
ht162x_data_dr=0;
_nop_();
_nop_();
_nop_();
ht162x_wr_dr=1;
_nop_();
_nop_();
_nop_();
nbit<<=1;
}
}
//-写命令LCD,,驱动液晶程序的一部分------------------------------
void write_com(unsigned char cmdcode)
{
ht162x_cs_dr=0; //选通HT1621
_nop_();
_nop_();
SendBitToHT1621(0x80,4);
SendBitToHT1621(cmdcode,8);
_nop_();
_nop_();
ht162x_cs_dr=1;
_nop_();
_nop_();
_nop_();
}
//*------------------初始化LCD屏--------------------------*/
void init_lcd()
{
write_com(SYSTEN); //Turn on system oscillator
write_com(RC256); //启动内部256KRC 振荡器
write_com(BIAS); // 1/3 bais . 4 duty
write_com(LCDON); //开启LCD
}
//显示本节基本单位点的核心内容。col代表X轴,X轴的数据用位表示,字节中的高4位表示。pag代表Y轴
void seg_display(unsigned char col, unsigned char pag)
{
pag<<=2;
ht162x_cs_dr=0; //选通HT1621
_nop_();
_nop_();
SendBitToHT1621(0xA0,3); ////发送写作数据模式101
SendBitToHT1621(pag,6); //发送Y轴数据
SendBitToHT1621(col,4); //发送X轴数据
ht162x_cs_dr=1;
_nop_();
_nop_();
}
//*------------------清空屏幕内容---------------*/
void screen_clear ()
{
unsigned char i;
unsigned char y=0;
for(i=0;i<32;i )
{
seg_display(0x00,y);
y=y 1;
}
}
(6)小结:
因为段码屏幕需要定制,每个屏幕的逻辑表都不一样,所以我只在这里列出核心驱动程序。以后大家都会根据项目自己编写上层应用程序,只要多用查表。(&)和或(|)这两种位运算符来处理,不难。初始化软件设置HT在配置1621参数时,应特别注意实际电路上使用了多少个参数COM,然后设置相等COM否则,应用于大段码示屏的项目时,有可能因为驱动力不够,会显示乱码。