HC1621液晶屏为长条形液晶模块,内置KS0066及其兼容控制器,电压5/3V可选,接口为并口,显示效果为黄绿底黑字或蓝底白字
HC1621程序如下:
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P3^3;
sbit RW = P3^1;
sbit E = P3^0;
unsigned char X,Y;
/*-----------建立自定义演示用字符库-----------*/
code unsigned int CGTAB[9][8]={
/*
横向取模 ,先上后下
*/
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, /* "↓"代码=0 */
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, /* "月"代码=1 */
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, /* "日"代码=2 */
0x11,0x0a,0x04,0x1f,0x04,0x1f,0x04,0x00, /* "¥"代码=3 */
0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00, /* "元"代码=4 */
0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, /* "℃"代码=5 */
0x04,0x0a,0x15,0x04,0x04,0x04,0x04,0x00, /* "↑"代码=6 */
0x17,0x15,0x15,0x15,0x15,0x15,0x17,0x00, /* "10"代码=7 */
0x04,0x04,0x04,0x04,0x15,0x0a,0x04,0x00, /* "↓"代码=8 */
};
/*-----------自定义字符显示用字库-----------*/
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void busy(void)
{ P1=0xff;
RS=0;
RW=1;
E=1;
while((P1&0x80)==0x80);
E=0;
}
void writecom(unsigned char com)
{ RS=0;
RW=0;
P1=com;
E=1;
_nop_();
E=0;
}
void lcdwc(unsigned char com)
{
busy();
writecom(com);
}
void lcdwd(unsigned char dat)
{
busy();
RS=1;
RW=0;
P1=dat;
E=1;
_nop_();
E=0;
}
/*****************************************************
定义地址ddram显示范围
****************************************************/
void lcdpos(void)
{
X&=0x0f; ///16列
Y&=0x03; ///2行
if(Y==0x00)
lcdwc(X|0x80);//行ddram
else if(Y==0x01)
lcdwc((X+0x40)|0x80); //第二行ddram
}
/*****************************************************
初始化函数
****************************************************/
void lcdreset()
{ delay(150); writecom(0x38);
delay(50); writecom(0x38);
delay(50); writecom(0x38);
lcdwc(0x38); //8位数据 显示2行 5*7字符
lcdwc(0x08); //关显示 光标关 闪烁关
lcdwc(0x01); //清除
lcdwc(0x06); //光标右移 画面不动
lcdwc(0x0c); //开显示 光标关 闪烁关
}
/***************************************
全部写入
***************************************/
void lcdfill(unsigned char n)
{
for(Y=0;Y<2;Y++)
for(X=0;X<16;X++)
{ lcdpos(); ///定义起始地址
lcdwd(n); }
}
/***************************************
全部写入隔点
***************************************/
void lcdgraphic(unsigned char m)
{
for(Y=0;Y<2;Y++)
for(X=0;X<16;X++)
{ lcdpos();
lcdwd(m);
lcdwd(~m); }
}
/*****************************************
字符串写入
*******************************************/
void lcdwda(unsigned char x,unsigned char y,unsigned char *s)
{
Y=y;
for(X=x;X<16;X++)
{
lcdpos();
lcdwd(*s);
s++;
delay(400);
}
}
/**************************/
/* 建立自定义函数 */
/**************************/
CGRAM()
{
uchar dat;
unsigned char i,j;
lcdwc(0x40); /* 设置CGRAM地址 */
/* 调写指令函数 */
for(i=0;i<9;i++)
{
for(j=0;j<8;j++)
{
dat=CGTAB[i][j]; /* 取字模 */
lcdwd(dat); /* 调写数据函数 */
}
}
}
/*****************************************
主函数
*******************************************/
main()
{
unsigned char i,j;
E=0;
lcdreset();
while(1)
{
// lcdreset();
lcdfill(0xff);
delay(2000);
lcdfill(0x55);
delay(2000);
lcdfill(0xaa);
delay(2000);
lcdgraphic(0xff);
delay(2000);
lcdgraphic(0x00);
delay(2000);
lcdgraphic(0x55);
delay(2000);
lcdgraphic(0xaa);
delay(2000);
for(i=0x30;i<=0x3a;i++)
{ lcdfill(i);
delay(3500);//显示0-9数字
}
lcdfill(' ');
delay(2000);
lcdwda(0,0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
lcdwda(0,1,"ZYXWVUTSRQPONMLKJIHGFEDCBA");
delay(2000);
lcdfill(' ');
/*------------CGRAM显示段--------------*/
CGRAM(); /* 调自定义字符库函数 */
lcdwc(0x80); /* 设置DDRAM地址行显示 */
// lcdwc(0xc0); /* 设置DDRAM地址第二行显示 */
/* 调写指令函数 */
for(i=0;i<9;i++)
{
/* 取字符代码 */
lcdwd(i); /* 调写数据函数 */
}
delay(4000); lcdfill(' ');
}
}