当前位置:首页 > 单片机 > 单片机
[导读]1602 自带的字库只是一些字符,而并没有汉字,其实1602是可以显示一些简单的汉子的比如年、月、日等,还有一些比较简单的特殊符号等,下面来说一下他的现实 原理,其实最基本的就是一个自建字库,在就是对DDRAM的操作

1602 自带的字库只是一些字符,而并没有汉字,其实1602是可以显示一些简单的汉子的比如年、月、日等,还有一些比较简单的特殊符号等,下面来说一下他的现实 原理,其实最基本的就是一个自建字库,在就是对DDRAM的操作,只要把要显示的汉子或符号写入DDRAM 就可以了,下面写说一下 汉字的编码 比如日字,对于5*8的液晶屏分为8行5列,每一列对应一个8位的二进制值,需要亮的地方置1其他的地方置0.所以得出的日子的编码就是 0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00.接下来就是将字库写入到CGRAM,1602片内提供00h到0fh 的存储位置,将编码写入对应的地址即可,接下来就是把你要显示的字符下乳DDRAM中就可以显示了。 下面附程序:

1602.h

#ifndef _LCD_1602

#define _LCD_1602

#define DPORT P0
#define uchar unsigned char
#define NoDisp 0
#define NoCur 1
#define CurNoFlash 2
#define CurFlash 3
#define DDRAM 0x00
sbit RS = P3^7;
sbit RW = P3^6;
sbit E = P3^5;

extern void LcdWcn(uchar c); /*检测忙信号的送控制字子程序*/
extern void LcdWc(uchar c); /*检测忙信号的送控制字子程序*/
extern void WriteChar(uchar); /*在指定的行与列显示*/
extern void LcdPos(); /*LCD 的复位程序*/
extern void LcdWd(uchar c); /*带忙检测的写字符子程序*/
extern void LcdWdn(uchar c); /*不检测忙的写字符子程序*/
extern void mDelay(unsigned int Delay);
extern void RstLcd();
extern void ClrLcd(); /*清屏命令*/
extern void WaitIdle(); /*正常读写操作之前检测LCD 控制器*/
extern void WriteString(char s[]);
extern void SetCur(uchar Cur); /*光标设置命令Cur 为设定光标参数*/
extern void Setlocal(uchar Xpos,Ypos); /*设置光标开始显示位置*/
extern void WriteDatan(uchar da); /*不检测忙信号写入数据*/
extern void WriteData(uchar data1); /*检测忙信号写入数据*/
extern void SetDDRAM(); /*置DDRAM初地址,可以通过更改DDRAM更改初地址*/
#endif

***************************************************************************************************************************

1602.c

#include "reg51.h"
#include
#include"1602.h"
/*uchar Xpos; //列方向地址指针
uchar Ypos; //行方向地址指针*/
uchar Xpos; //列方向地址指针
uchar Ypos; //行方向地址指针

void Setlocal(uchar Xposz,Yposz)
{
Xpos=Xposz;
Ypos=Yposz;
}


void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
/*光标设置命令
Cur 为设定光标参数
*/
void SetCur(uchar Cur)
{ switch(Cur)
{ case 0x0:
{ LcdWc(0x08); //关显示
break;
}
case 0x1:
{ LcdWc(0x0c); //开显示但无光标
break;
}
case 0x2:
{ LcdWc(0x0e); //开显示有光标但不闪烁
break;
}
case 0x3:
{ LcdWc(0x0f); //开显示有光标且闪烁
break;
}
case 0x4:
{ LcdWc(0x02); //返回
break;
}
default: break;
}
}
/*清屏命令
*/
void ClrLcd()
{ LcdWc(0x01);
}
/*在指定的行与列显示
*/
void WriteChar(uchar c)
{ LcdPos();
LcdWd(c);
}
/*正常读写操作之前检测LCD 控制器
*/
void WaitIdle()
{ uchar tmp;
DPORT=0xff;
RS=0;
RW=1;
E=1;
_nop_();
for(;;)
{ tmp=DPORT;
tmp&=0x80;
if(tmp==0)
break;
}
E=0;
}
/*不检测忙的写字符子程序
*/
void LcdWdn(uchar c)
{
RS=1;
RW=0;
DPORT=c; //写入待写字符
E=1;
_nop_();
E=0;
}
/*带忙检测的写字符子程序
*/
void LcdWd(uchar c)
{ WaitIdle();
LcdWdn(c);
}
/*不检测忙信号的送控制字子程序*/
void LcdWcn(uchar c)
{ RS=0;
RW=0;
DPORT=c;
E=1;
_nop_();
E=0;
}
/*检测忙信号的送控制字子程序*/
void LcdWc(uchar c)
{ WaitIdle();
LcdWcn(c);
}
void LcdPos()
{ uchar tmp;
Xpos&=0x0f; //16xx 型液晶的范围是0~15
Ypos&=0x01; //Y 的范围是0~1
tmp=Xpos;
if(Ypos==1)
{ tmp+=0x40;
}
tmp|=0x80;
LcdWc(tmp);
}
/*LCD 的复位程序
*/
void RstLcd()
{ mDelay(15); //延时15ms
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
LcdWc(0x38);
LcdWc(0x08);
LcdWc(0x01);
LcdWc(0x06);
LcdWc(0x0c);
}
void WriteString(char s[])
{ uchar pS=0;
for(;;)
{ WriteChar(s[pS]);
pS++;
if(s[pS]==0)
break;
if(++Xpos>=15) //每行最多显示16 个字符
break;
}
}

void WriteDatan(uchar da) //不检测忙信号写入数据
{
RS=1;
RW=0;
DPORT=da;
E=1;
_nop_();
E=0;
}

void WriteData(uchar data1)//检测忙信号写入数据
{
WaitIdle();
WriteDatan(data1);
}

void SetDDRAM()
{
uchar p;
p=0x80|DDRAM;
LcdWc(p);
}

************************************************************************************************************************************

main.c

#include"reg51.h"
#include
#include"1602.h"

#define uchar unsigned char
#define uint unsigned int

const uchar s1[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00}; //年,月,日
const uchar s2[]={'2','0','0','9',0x00,'8',0x01};

void main()
{
uint i=0;
uint j=0;
//uchar *p=s1;

P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;

RstLcd(); //复位LCD
ClrLcd();
SetCur(CurFlash); //光标显示且闪烁
LcdWc(0x40);
while(i!=16)
{
WriteData(s1[i]);
i++;
}
SetDDRAM();
while(j!=7)
{
WriteData(s2[j]);
j++;

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭