段码液晶屏往往应用在出货量比较大的家用消费类电子, 比如空调遥控器, 小时候带的电子手表等, 都是段码屏。 段码屏是非标屏, 都是客户定做的, 第一次开模费大概一两千元, 厂家一般都会有起订量的要求, 除此之外, 它的单位成本相对要比点阵屏要便宜, 而且我个人认为显示的效果要比点阵屏漂亮...
段码屏的驱动程序跟数码管的静态驱动程序一样, 只要我们弄懂了怎样显示一个基本单位,根据此基本单位编写一个字库表, 然后用与(&)和或(|)这两种位运算符就可以随心所欲编写我们要显示的数字或者形状。 有两种常用的驱动方案:
第一种: 如果单片机内部集成了 seg 和 com 引脚的液晶驱动模块, 直接用单片机驱动。
第二种: 单片机用 3 个 IO 口跟 HT1 621 进行通讯, 用 HT1 621 驱动段码屏。
这节我重点介绍第二种。 HT1 621 有 4 个 COM, 分别是 com3,com2,com1 ,com0。 有 32 个SEG, 分别是 SEG0,SEG1 ….SEG31 。什么是 COM,
什么是 SEG? 用鸿哥的思路来解释, COM 就是横向上的 X 坐标, SEG 就是纵向上的 Y 坐标。坐标与 Y 坐标组合成一张表格, 每格代表一个显示点。 比如 HT1 621 , 有4 个 COM, 32 个 SEG, 组成一个 32 行, 每行装 4 个点的表格, 一共有 1 28 个点, 也就是最多可以显示 1 28 个点, 用数码管的思路, 最多可以显示 1 28 个 LED 灯。 因为纵向上有 32行, 因此 Y 轴的地址范围是
0 到 31 。 每一行 X 轴上的 4 个点, 我们用一个字节来表示。 一个字节有 8 位, 高 4 位分别代表这个 4 个点, 低 4 位为空。 比如第一行(SEG0 行)的第 1 个(COM3)要显示, 第 2 个(COM2)要显示, 第 3 个(COM1 )不要显示, 第 4 个(COM0)不要显示,那么用一个字节来表示就是十六进制的 0xc0.要把这两个点点亮, 只要把 X 轴的数据设置成0xc0, Y 轴的数据设置成 0x00, 然后放到鸿哥精心研制的
seg_display(unsigned char col,unsigned char pag)驱动程序里就可以了.
(2) 功能需求:
在 COM 和 SEG 组成的 4X32 表格中, 显示第二行的第 3 和第 4 两个点。
(3) 硬件原理:
用单片机的 3 个 IO 口分别跟 HT1 621 的 CS,WR,DATA 连接。
(4) 源码适合的单片机:STC1 1 F04E,晶振为 1 1 .0592MHz。
(5)
源代码讲解如下:
#include "REG52.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define BIAS 0X52 //此处千万小心, 鸿哥在上个月 的一个项目中就是在这里被
卡了 7 天。
//必须跟硬件电路的 COM 匹配。 1 个或者 2 个 COM:0x42。 3 个
COM:0x4A。 4 个 COM:0x52
#define RC256 0X30
#define SYSTEN 0X02
#define SYSDIS 0X00
#define LCDON 0X06
void SendBitToHT1 621 (unsigned char nbit,unsigned char n);//发送一个字节中的 N 位到
HT1 621 里,驱动程序的最底层部分
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 ht1 62x_data_dr=P3^1 ;
sbit ht1 62x_cs_dr=P3^6;
sbit ht1 62x_wr_dr=P3^0;
main()
{
init_lcd(); //初始化液晶屏
screen_clear ();//清空整屏显示内容
seg_display(0x30,1 ); //在 COM 和 SEG 组成的 4X32 表格中, 显示第二行的第 3 和第 4
两个点。
while(1 )
{
;
}
}
//发送一个字节中的 N 位到 HT1 621 里,驱动程序的最底层部分
void SendBitToHT1 621 (unsigned char nbit,unsigned char n)
{
unsigned char i;
for(i=0;i
ht1 62x_wr_dr=0;
if(nbit>=0x80) //判断最高位
ht1 62x_data_dr=1 ;
else
ht1 62x_data_dr=0;
_nop_();
_nop_();
_nop_();
ht1 62x_wr_dr=1 ;
_nop_();
_nop_();
_nop_();
nbit<<=1 ;
}
}
//------------------写命令到 LCD, ,驱动液晶程序的一部分------------------------------
void write_com(unsigned char cmdcode)
{
ht1 62x_cs_dr=0; //选通 HT1 621
_nop_();
_nop_();
SendBitToHT1 621 (0x80,4);
SendBitToHT1 621 (cmdcode,8);
_nop_();
_nop_();
ht1 62x_cs_dr=1 ;
_nop_();
_nop_();
_nop_();
}