精华内容
下载资源
问答
  • 关闭lcd程序
    千次阅读
    2021-05-21 03:35:00

    《单片机控制LCD液晶显示器(含程序)》由会员分享,可在线阅读,更多相关《单片机控制LCD液晶显示器(含程序)(16页珍藏版)》请在人人文库网上搜索。

    1、液晶显示器一 实验目的: 1. 了解全点阵图形LCD的结构和原理掌握在MSP430上如何使用外设。2. 了解LCD显示器的工作原理、种类(笔段型、点阵字符型、点阵图形)及主要性能指标。3. 掌握图形点阵LCD的编程使用方法;理解LCD显示模块命令的种类、功能及使用方法。4. 了解LCD字符生成软件的使用方法(见附录)。二 实验内容:1. 在LCD上显示Hello和中文字“南京工业大学”。2. 通过键盘控制Hello或者中文字符在LCD上左右、上下移动。3. 学会使用字符生成软件来实现任意字符代码的生成和显示。4. 其他另外可以实现的目标:使字符在按键没有松动的情况下连续移动;实现字符的循环移动。

    2、,即当字符串移动到边界时仍可以移动,显示不完的部分从另一边显示出来。三 实验原理:1. 图形点阵式液晶原理液晶是一种具有规则性分子排列的有机化合物,它既不是液体也不是固体,而是介于固态和液态之间的物质。液晶具有电光效应和偏光特性,这是它能用于显示的主要原因。常用的液晶显示器可分成3类,分别是扭曲向列型(Twisted Nematic)、超扭曲向列型(Super TN)和彩色薄膜型。字符点阵式属于扭曲向列型LCD。典型的字符点阵式液晶显示器是由控制器、驱动器、字符发生器ROM、字符发生器RAM和液晶屏组成,字符由5*7 点阵或5*10点阵组成。一般结果如图一所示:图一 128x64 点阵图形液晶。

    3、模块方框示意图此次实验所用的LCD型号是RT12864CT。12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成。可完成图形显示,也可以显示8*4个(16*16)汉字。 管脚号管脚名称LEVER管脚功能描述1VSS0电源地2VDD+5.0V电源电压3V0-液晶显示器驱动电压4D/I(RS)H/LD/I=“H”,表示DB7DB0为显示数据D/I=“L”,表示DB7DB0为显示指令数据5R/WH/LR/W=“H”,E=“H”数据被读到DB7DB0R/W=“L”,E=“HL”数据被写到IR或DR6EH/R/W=“L”,E信号下降沿锁存DB7DB0R/W=“。

    4、H”,E=“H”DDRAM数据读DB7DB07DB0H/L数据线8DB1H/L数据线9DB2H/L数据线10DB3H/L数据线11DB4H/L数据线12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15CS1H/LH:选择芯片(右半屏)信号16CS2H/LH:选择芯片(左半屏)信号17RETH/L复位信号,低电平复位18VOUT-10VLCD驱动负电压19LED+-LED背光板电源20LED-LED背光板电源表1:12864LCD的引脚说明128x64 点阵图形液晶模块的内部结构可分为三个部分:LCD 控制器,LCD 驱动器,LCD 显示装置。应注意的是,无背光液晶模块同EL、。

    5、LED 背光的液晶模块内部结构有较大的区别,特别注意第19、20 脚的供电来源及相关参数,如图二所示:图 2 128x64 点阵图形液晶模块的内部结构12864LCD的指令系统及时序:该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:指令名称控制信号控制代码R/WRSDB7DB6DB5DB4DB3DB2DB1DB0显示开关0000111111/0显示起始行设置0011XXXXXX页设置0010111XXX列地址设置0001XXXXXX读状态10BUSY0ON/OFFRST0000写数据01写数据读数据11读数据表2:12864LCD指令。

    6、表2. MCU与LCD、键盘连接电路图:LCD的714引脚分别连接到149的4451引脚(P5口),其他引脚2号引脚连接到J28排线上(与5V电源接通给LCD供电)、1-GND、436、537、638、1539、1642、1743;18接滑动变阻器R10(调节LCD的亮度)。键盘连接省略。3. LCD显示流程图:图 3 LCD显示主程序流程图 图4初始化子程序流程图图5 写指令子程序流程图 图 6 送数据子程序流程图四实验步骤和结果:通过调试可以正确的显示“Hello”或者“南京工业大学”,中英文字符的切换需要通过程序修改才能实现(可以试着用中断来实现),比较繁琐。同时通过键盘来实现字符在LC。

    7、D屏幕上的上下左右的移动。五附录:1字模软件使用方法:首先打开“PCtoLCD2002.exe”,显示界面如下图7所示:图 7 字符生成软件界面然后点击选项菜单,通过上面程序所述,选项中要选择:阴码、逐列式、逆向、16进制、C51格式,点击确定。如图8所示设置:图8 字符软件设置界面接着在左下方空白 格子里输入要显示字符,点击“生成字模”,变会出现对应的字符编码,复制到程序中编译即可。2.程序(键盘扫描函数省略):/* 文件名称: main.c* 文件说明 根据键盘的控制,移动字符串Hello或者南京工业大学,行列键盘的7用于字符串左移,8用于字符串下移,9用于字符串右移,5用于字符串上移。按。

    8、键每按一下向各自的方向移动一个点阵的位置。*/#define MSP430F149_H 0#include #ifndef LCD_IN_USE#include lcd.c#endif#ifndef KEY_BOARD#include keyboard12.c#endif#define TOP 0 / 竖直方向零点#define BOTTOM 64 / 竖直方向坐标最大值#define LEFT 0 / 水平方向坐标最小值#define RIGHT 128 / 水平方向坐标最大值#define EN_WIDTH 40 / Hello 字符串的长度#define CH_WIDTH 96 / 中文。

    9、字符串的长度#define OP_CHINESE 1 / 选择显示中文字符#define OP_ENGLISH 2 / 选择显示英文字符void drawStr(unsigned char x,unsigned char y); void op_Select(char OP);unsigned char showData=/16*8点阵的“Hello”0x08,0x20,0xF8,0x3F,0x08,0x21,0x00,0x01,0x00,0x01,0x08,0x21,0xF8,0x3F,0x08,0x20,/*H,0*/0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0。

    10、x22,0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,/*e,1*/0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*l,2*/0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*l,3*/0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x00,0x1F,0x00,。

    11、0x00,/*o,4*/;unsigned char showData_1= /16*16点点阵的南京工业大学“0x04,0x00,0xE4,0xFF,0x24,0x00,0x24,0x08,0x64,0x09,0xA4,0x09,0x24,0x09,0x3F,0x7F, 0x24,0x09,0xA4,0x09,0x64,0x09,0x24,0x48,0x24,0x80,0xE4,0x7F,0x04,0x00,0x00,0x00,/*南,0*/0x04,0x00,0x04,0x40,0x04,0x20,0xE4,0x1B,0x24,0x02,0x24,0x42,0x25,0x82,0x26,0。

    12、x7E, 0x24,0x02,0x24,0x02,0x24,0x02,0xE4,0x0B,0x04,0x10,0x04,0x60,0x04,0x00,0x00,0x00,/*京,1*/0x00,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0xFC,0x3F, 0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x00,0x20,0x00,0x00,/*工,2*/0x00,0x40,0x10,0x40,0x60,0x40,0x80,0x43,。

    13、0x00,0x40,0xFF,0x7F,0x00,0x40,0x00,0x40, 0x00,0x40,0xFF,0x7F,0x00,0x42,0x00,0x41,0xC0,0x40,0x30,0x40,0x00,0x40,0x00,0x00,/*业,3*/0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00, 0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*大,4*/0x40。

    14、,0x04,0x30,0x04,0x11,0x04,0x96,0x04,0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7E,0x90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,0x13,0x04,0x50,0x04,0x30,0x04,0x00,0x00,/*学,5*/;const unsigned char mapTbl=0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff;unsigned char px, / 显示字符串的X位置py, / 显示字符串的Y位置width; / 字符串的宽度unsigned c。

    15、har * showBuf; / 显示数据缓冲区void main()WDTCTL = WDTHOLD + WDTPW; / 关闭看门狗init_LCD(); / 初始化点阵LCDinit_Keyboard(); / 初始化键盘op_Select(OP_CHINESE); / 选择显示字符类型drawStr(px,py); /显示字符串 while(1)key_Event(); /检测按键事件if(key_Flag= 0x01) /有按键 key_Flag=0x00; /清除按键标识if(key_val=0x05) /上移 if(pxTOP) /如果可以上移 clear_Rect(px/8,0。

    16、,3,64); /清除chip1可能有数据的三个区域clear_Rect(px/8,64,3,64); /清除chip2可能有数据的三个区域drawStr(px-1,py); /显示字符px = px-1;else if (key_val=0x07) /左移 if(pyLEFT) /如果可以左移 clear_Rect(px/8,0,3,64);clear_Rect(px/8,64,3,64);drawStr(px,py-1);py=py-1;else if (key_val=0x08) /下移 if(px(8-t1); /右移(8-t1)t3 = showBuf2*(tmpv-y)+1;t3 。

    17、= t3 & mapTbl8-t1; /取得低(8-t1)位t3=t3(8-t1); /右移(8-t1)位write_Data(t2); /填写数据 void op_Select(char OP)if(OP=OP_CHINESE)width = CH_WIDTH; / 设定字符串长度px=0; / 初始化显示位置,X坐标py=0; / Y坐标showBuf = showData_1;else if (OP=OP_ENGLISH)width = EN_WIDTH; / 设定字符串长度px=24; / 初始化显示位置,X坐标py=40; / Y坐标showBuf = showData; LCD显示。

    18、函数:#include void write_Command(char cmd)P4OUT &= 0xfb; /禁止 ENP5DIR = 0xff; P4OUT &= 0xfc; /rs=0 ,r/w=0P5OUT = cmd;P4OUT |= 0x04; /使能P4OUT &= 0xfb; /禁止void move_To(char x,char y)unsigned char tmp;tmp=(y&0x7f);if(tmp63) /在 chip2 P4OUT &= 0xF7; /cs1=0 P4OUT |= 0x40; /cs2=1write_Command(0xb8 + x); /设置 x。

    19、write_Command(0x40 + tmp-64); /设置 yvoid write_Data(char content)P5DIR = 0x00; / 置位输入模式P4OUT |= 0x02; / r/w=1 读状态P4OUT |= 0x04; / chip 使能while(P3IN & 0x80)=0x80);/检测LCD是否忙P4OUT &= 0xfb;/disable ENP5DIR = 0xff;P4OUT &= 0xfc; /rs=0 ,r/w=0P4OUT |= 0x01; /rs=1P5OUT = content;P4OUT |= 0x04; /p2.2=1 使能P4OU。

    20、T &= 0xfb; /p2.2=0 禁止void clear_Rect(unsigned char x,unsigned char y,unsigned char h,unsigned char w)unsigned char tmpv,tmp;for(tmpv=x;tmpv(x+h);tmpv+)for(tmp=y;tmp(y+w);tmp+)move_To(tmpv,tmp);/移动write_Data(0x00); /在当前位置写0,即清除当前位置的显示内容void init_LCD()P5DIR = 0xff; / 设置P3输出模式 P5OUT = 0x00; / 初始值为0P4DI。

    21、R |= 0xcf; / P2.0P3,P2.6,p2.7 置为输出模式P4OUT |= 0x48 ; / cs1,cs2 为1,reset=0_NOP();_NOP();_NOP();P4OUT |= 0x04; / en=1P4OUT |= 0x80;write_Command(0xc0); /write_Command(0x3f); /显示开clear_Rect(0,0,8,64); /清除第一块clear_Rect(0,64,8,64); /清除第二块3.系统原理图:欢迎您的光临,Word文档下载后可修改编辑.双击可删除页眉页脚.谢谢!你的意见是我进步的动力,希望您提出您宝贵的意见!让我们共同学习共同进步!学无止境.更上一层楼。

    更多相关内容
  • 微型实用程序,用于关闭Windows计算机上的屏幕。 演示了一个非常简单的Win32 API调用和编译,没有Rust std库。 有关更多信息,请参阅。 二进制文件 由于使用link_args !,目前仅每晚编译一次。
  • closeLCD快速关闭电脑屏幕工具,可以让电脑立即关闭屏幕,但程序依然运行的效果。供大家下载
  • Delphi 程序控制关闭显示器,不过我很好奇Delphi真能关闭显示器么?如果是用Delphi截断视频信号的输出,让显示器黑屏,这倒是有可能哦,但是让Delphi直接关闭显示器,有点不太可能吧?看了看代码,原来是这样:  ...
  • LCD显示控制程序设计

    2013-09-28 11:01:07
    LCD1602液晶屏显示日期测试程序 1、程序说明: 该例程演示了LCD1602液晶屏显示日期测试程序, 2、实验操作 将拨码开关S7和S10全部置于关闭状态。即不拨到ON端。 否则将影响到实验效果。 将LCD1602液晶屏...
  • lcd源代码程序,,用于单片机的LCD。。。/*************************************************************/ /* SPI写LCD函数 */ /***********************************************************... SCE=1 // 关闭LCD }
  • LCD关闭

    2008-06-15 00:46:57
    众所周知,液晶显示屏的显示方式与CRT不一样,采用屏保程序不仅不会保护液晶屏,反而会降低液晶屏使用寿命,即使使用“空白”屏保也是一样,液晶屏的灯管仍然没有关闭。使用下面这个小工具就可以真正做到关闭液晶屏...
  • lcd_armDemo.rar,lcd_armDemo,buid,lcd_Demo,cmake_install.cmake,Task,TaskMag,cmake_install.cmake,libTaskMag.a,Makefile,CMakeFiles,progress.marks,TaskMag.dir,cmake_clean_target.cmake,flags.make,taskmag.c...
  • LCD12864驱动显示程序

    万次阅读 2019-04-22 10:49:30
    这里是用的并行写法,后续会更新串行 。并行缺点就是太占用io口了,我...lcd12864.c #include"lcd12864.h" uchar code num[]={"0123456789 e:.-"}; sbit RS = P3^5; //命令/数据选择 sbit RW = P3^6; //读写...

    这里是用的并行写法,后续会更新串行 。并行缺点就是太占用io口了,我其实更喜欢用串行。不过不是比赛要求都不怎么用了。

    lcd12864.c

    #include"lcd12864.h"
    uchar code num[]={"0123456789 e:.-"};
    
    sbit RS  =  P3^5;     //命令/数据选择       
    sbit RW  =  P3^6;     //读写口 
    sbit E  =  P3^4;      //使能端       
    sbit PSB =  P3^7;     //串并选择     
    
    void delay(uint t)
    {
    	uint i;
    	while(t--)
    		for(i=0;i<110;i++);
    }
    
    bit busy()  //查忙
    {
    	bit result;
    	P0=0X00; 
    	RS=0;			//命令/数据选择,为0时选择命令    
    	RW=1;			//读/写选择,为1时选择读
    	E=1;			//使能
    	delay(1);
    	result = (bit)(P0&0x80); //查忙标志位,等待标志位为0,即表示写入完毕
    	E=0;			//关闭读写 
    	return (result);
    }
    
    void wcode(uchar cmd)   //向lcd写一命令
    {
    	while(busy());  					 //查忙
    	RS=0;							 //命令/数据选择,为0时选择命令 
    	RW=0;							 //读/写选择,为0时选择写
    	E=0;
    	_nop_();
      _nop_(); 
    	P0=cmd;				 //送入命令
    	delay(1);				//等待
    	E=1;							
    	delay(1);
    	E=0;
    }
    
    void wdata(uchar dat) 	//向LCD写一数据
    {
    	while(busy());
    	RS=1;            //H为数据
    	RW=0;
    	E=0;
    	P0=dat;
    	delay(1);
    	E=1;
    	delay(1);
    	E=0;
    }
    
    void initlcd()    //LCD初始化
    {
    	PSB=1;     //设置为8BIT并口工作模式  H并行 L串行
    	delay(10);
    	wcode(0x34);
    	delay(5);
    	wcode(0x30);  //选择基本指令集
    	delay(5);
    	wcode(0x0c);  //开显示,无游标
    	delay(5);
    	wcode(0x01);	//清除显示,并且设定地址指针为00H
    	delay(5);
    	wcode(0x06);	//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
    }
    
    void dis(uchar x,uchar y,uchar code *s)  //任意位置显示字符串
    {                         //x为横坐标,y位纵坐标,*s表示指针,为数据的首地址
    	switch(y)    						//选择纵坐标
    	{
    		case 0:wcode(0x80+x);break;  //第一行
    		case 1:wcode(0x90+x);break;	 //第二行
    		case 2:wcode(0x88+x);break;  //第三行
    		case 3:wcode(0x98+x);break;  //第四行
    		default:break;
    	}
    	while(*s>0)										 //写入数据,直到数据为空
    	{
    		wdata(*s);									 //写数据
    		delay(10);									//下一字符
    		s++;
    	}
    }  
    void showGB(uchar *HZ)  //显示单个汉子
    {
       wdata(HZ[0]);                //写入汉字高八位数据
       wdata(HZ[1]);                //写入低八位
    }
    
    void wrnum(uchar s)
    {
    	wdata(num[s]);
    	delay(1);
    }

    数据口D0-D7统一接的P0-P7端。

     比赛设备提供的连线破图……烂画质(自己不重画了,将就看吧hh)

    lcd12864.h

    #ifndef __LCD12864_H_
    #define __LCD12864_H_
    
    #include<reg51.h>
    #include<intrins.H>
    
    
    #define uchar unsigned char
    #define uint unsigned int
    
    extern void delay(uint t);
    extern bit busy();
    extern void wcode(uchar cmd);
    extern void wdata(uchar d);	
    extern void initlcd();
    extern void dis(uchar x,uchar y,uchar code *s);	
    extern void showGB(uchar *HZ);
    
    #endif

     如果换成其他单片机芯片话,速度可能不同,导致时序就不一样,需要自行更改延时。

    https://blog.csdn.net/zy19981110/article/details/89447521

    展开全文
  • C51单片机LCD1602驱动程序

    千次阅读 多人点赞 2020-09-01 10:43:24
    C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作一、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图 LCD1602简介 LCD1602...


    本篇为学习普中科技单片机开发板HC68000-EM3 V2.2后的笔记汇总;

    LCD1602简介

    LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个5x7或者5x10的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。

    1602的引脚

    引脚图
    我们只需要关注以下几个管脚:
    3 脚:VL,液晶显示偏压信号,用于调整LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。
    4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602 进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602 的一些工作方式作设置的字节;数据字节,即使用以在1602 上显示的字节。值得一提的是,LCD1602的数据是8 位的。
    5 脚:R/W,读写选择端。当此脚为高电平可对LCD1602 进行读数据操作,反之进行写数据操作
    6 脚:E,使能信号,其实是LCD1602 的数据控制时钟信号,利用该信号的上升沿实现对LCD1602 的数据传输。
    7~14 脚:8 位并行数据口,使得对LCD1602 的数据读写大为方便。
    1602技术参数图

    操作时序

    操作时序
    由于我们不需要读1602,因此下面只看写操作:
    ① 当我们要写指令字时,设置LCD1602 的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入
    ② 当我们要写入数据字,在1602 上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E 引脚一个高脉冲将数据写入
    发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。以下是LCD1602的时序图:

    写操作时序

    写操作时序

    时序参数

    时序参数
    当要写命令字节的时候,时间由左往右,RS 变为低电平,R/W 变为低电平,注意看是RS的状态先变化完成。然后这时,DB0~DB7 上数据进入有效阶段,接着E引脚有一个整脉冲的跳变,接着要维持时间最小值为tpw=400ns的E脉冲宽度。然后E引脚负跳变,RS电平变化,R/W 电平变化。这样便是一个完整的LCD1602写命令的时序。

    LCD1602关键性指令操作

    一、清屏指令

    清屏指令

    1. 清除液晶显示器,即将DDRAM的内容全部填入“空白”的ASCII码20H;
    2. 光标归位,将光标撤回液晶显示屏的左上方;
    3. 将地址计数器(AC)的值设置为0;

    二、进入模式设置指令

    模式设置
    功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:
    位名 ———— 设置;
    I/D —— 0=写入新数据后光标左移 ; 1=写入新数据后光标右移;
    S —— 0=写入新数据后显示屏不移动 ;1=写入新数据后显示屏整体右移1个字符;

    三、显示开关控制指令

    开关控制
    功能 : 控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
    位名 ———— 设置
    D —— 0=显示功能关 ; 1=显示功能开;
    C —— 0=无光标 ; 1=有光标;
    B —— 0=光标闪烁 ; 1=光标不闪烁;

    四、功能设定指令

    功能设定
    功能 : 设定数据总线位数、显示的行数及字型。参数设定的情况如下:
    位名 ———— 设置
    DL —— 0=数据总线为4位 ; 1=数据总线为8位;
    N —— 0=显示1行 ; 1=显示2行;
    F —— 0=5×7点阵/每字符 ; 1=5×10点阵/每字符;

    五、RAM地址映射图

    在设置完成之后我们就要明白具体是在哪显示,在哪个位置显示?在对液晶模块的初始化中要先设置其显示模式在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否还处于忙的状态。DDRAM就是显示数据RAM,用来寄存待显的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
    显示位置
    要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符;例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以确定光标定位;在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是:
    0100000OB (40H)+10000000B(80H)=11000000B(C0H)。
    在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:
    RAM地址映射图

    LCD1602驱动代码

    写命令

    // 向LCD1602液晶写入一字节命令,cmd-待写入命令值 
    // 写命令时序:RS=0,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。
    void lcd1602WriteCmd(unsigned char cmd)
    {
    	delayNms(5);//延时5ms
    	RS=0;				// 命令
    	RW=0;				// 写
    	E=1;				// 使能LCD1602
    	DPORT=cmd;			// 将命令码输出在数据端口上
    	delay10us();            // 短暂延时10us
    	E=0; 				// 关闭LCD1602使能,释放总线
    }
    

    写数据

    // 向LCD1602液晶写入一字节数据,dat-待写入数据值 
    // 写数据时序:RS=1,RW=0,D7——D0 = 数据,E=正脉冲,液晶在脉冲下降沿采样数据。
    void lcd1602WriteByte(unsigned char dat)
    {
    	delayNms(5);//延时5ms
    	RS=1;				// 数据
    	RW=0;				// 写
    	E=1;				// 使能LCD1602
    	DPORT=dat;			// 将待写数据送到数据端口
    	delay10us();            // 短暂延时10us
    	E=0;			    // 关闭LCD1602使能,释放总线	   
    }
    

    清屏指令

    // 清屏命令:清除显示内容,将1602内部RAM全部填入空白的ASCII码20H
    //			 光标归位,将光标撤回到屏幕左上角的坐标原点
    //           将1602内部显示地址设为0  
    void lcd1602Clear()	      
    {	
    	lcd1602WriteCmd(0x01);
    	delayNms(50);//50ms
    } 
    

    设置光标

    void lcd1602SetCursor(unsigned char Para)	    // 设置光标
    {
    	switch(Para)
    	{	
    		case 0:
    		{	
    			lcd1602WriteCmd(0x08);	break;     	 // 关显示
    		}
    		case 1:
    		{	
    			lcd1602WriteCmd(0x0c);	break;	     // 开显示但无光标
    		}
    		case 2:
    		{
    			lcd1602WriteCmd(0x0e);	break;	     // 开显示有光标但不闪烁
    		}
    		case 3:
    		{
    			lcd1602WriteCmd(0x0f);	break;	     // 开显示有光标且闪烁
    		}
    		default:
    			break;
    	}
    }
    

    初始化

    // LCD 1602初始化
    void lcd1602Init()	    
    {
    	lcd1602WriteCmd(0x38);    /*显示模式设置*/ 
    	delayNms(5); //5ms
    	lcd1602WriteCmd(0x38); 
    //	delayNms(5); 
    //	lcd1602WriteCmd(0x38); 
    //	delayNms(5); 
    //	lcd1602WriteCmd(0x38); 	
    	lcd1602WriteCmd(0x08);	     // 显示关闭,不显示光标、光标不闪烁
    	lcd1602WriteCmd(0x01);	     // 显示清屏
    	lcd1602WriteCmd(0x06);	     // 显示光标移动位置
    	delayNms(5);//5ms
    	lcd1602WriteCmd(0x0c);	     // 显示开及光标设置
    	lcd1602Clear();
    }
    

    函数封装

    操作步骤:
    1. 初始化
    2. 写命令(RS=L) 设置显示坐标
    3. 写数据(RS=H)

    lcd1602.h文件

    声明:请根据晶振自行编写延时函数

    #include "delay.h"  //请根据晶振自行编写延时函数
    
    sbit	RS	=	P1^0;		 // 根据实际硬件连接修改
    sbit	RW	=	P1^1;		 // 根据实际硬件连接修改
    sbit	E		=	P1^2;		 // 根据实际硬件连接修改
    #define DPORT	P0			 // 根据实际硬件连接修改
    
    void lcd1602Init();		 // 初始化
    void lcd1602Clear();           	 // 清屏命令
    void lcd1602SetCursor(unsigned char Para);	//设置光标
    void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat);  // 写1个字符
    void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s); // 写字符串
    

    lcd1602.c文件

    #include "lcd1602.h"
    
    void lcd1602WriteByte(unsigned char dat){}		//写数据
    void lcd1602WriteCmd(unsigned char cmd){}		//写命令
    void lcd1602Clear(){}		//清屏
    void lcd1602SetCursor(unsigned char Para){}	    // 设置光标
    void lcd1602Init(){}		//初始化
    
    // 内部函数用于设置显示字符起始坐标
    void lcd1602WritePos(unsigned char xPos,unsigned char yPos)	 
    {
    	unsigned char tmp;
    	xPos&=0x0f;		      // x位置范围是0~15
    	yPos&=0x01;		      // y位置范围是0~1
    	if(yPos==0)	   	      // 显示第一行
    		tmp=xPos;		  // 第一行字符地址从 0x00 开始
    	else
    		tmp=xPos+0x40;	  // 第二行字符地址从 0x40 开始
    	tmp|=0x80;			  // 设置 RAM 地址
    	lcd1602WriteCmd(tmp);
    }
    
    //在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符
    void lcd1602WriteChar(unsigned char xPos,unsigned char yPos,unsigned char Dat)
    {
    	lcd1602WritePos(xPos,yPos);
    	lcd1602WriteByte(Dat);
    }
    
    // 在液晶上显示字符串,xpos:行坐标,ypos:列坐标,str-字符串指针
    void lcd1602WriteString(unsigned char xPos,unsigned char yPos,unsigned char *s)
    {	
    	unsigned char i=0;
    	lcd1602WritePos(xPos,yPos);		  // 起始坐标
    	while(s[i])
    	{
    		lcd1602WriteByte(s[i]);
    		i++;
    		if (i>=16)  break;	  // 超出16个字符外的数据丢弃
    	}
    }
    
    展开全文
  • 段码液晶参考程序;程序清单;***************************...项目: IC卡水表LCD显示模块演示程序(1.1版);描述: 启动程序即进入正常显示状态(循环显示一系列数字0~F),并通过KEY按键进入全显示状态; (测功耗)、掉电状...

    1ff68fda24f8eaa8874a268da847bcbb.png

    段码液晶参考程序

    ;程序清单

    ;*********************************************************************************

    ;文件名:CAT888.asm

    ;项目: IC卡水表LCD显示模块演示程序(1.1版)

    ;描述: 启动程序即进入正常显示状态(循环显示一系列数字0~F),并通过KEY按键进入全显示状态

    ;     (测功耗)、掉电状态(测功耗)及关断LCM电源(GND端),依此循环。

    ;最后更新日期:2017/12/04

    ;*********************************************************************************

    ;特殊功能寄存器SFR和位地址定义

    AUXR1  DATA  0A2H ;辅助功能寄存器,不可位寻址

    DIVM  DATA  95H ;MCU时钟除数控制寄存器,

    P0M1  DATA  84H ;0口工作模式选择寄存器1

    P0M2  DATA  85H ;0口工作模式选择寄存器1

    P1M1  DATA  91H

    P1M2  DATA  92H

    PT0AD  DATA   0F6H ;0口数字输入功能禁止寄存器

    LED1  BIT  P0.0 ;状态灯定义

    LED2  BIT  P1.7 ;正常显示状态时LED1点亮,全显示状态时

    LED3  BIT  P1.6 ;LED2点亮,掉电状态时LED3点亮,关断LCM电

    LED4   BIT  P1.4 ;源状态时LED4点亮。

    LCMC  BIT  P0.7 ;LCM的GND控制输出端,实现LCM的电源控制

    KEY  BIT  P1.1 ;KEY的IO定义

    keyin  BIT  10H ;定义有键盘输出标志位

    ;定义显示数据计数变量

    DCONT  DATA  50H ;用于显示位的计数

    ;状态标志位定义

    FLAGS1  DATA  2EH ;状态标志寄存器1

    EMI           BIT    FLAGS1.0;电磁干扰标志

    PASS         BIT   FLAGS1.2;水阀打开/关闭标志位

    OUT         BIT   FLAGS1.3;IC卡退出标志位(退卡后M3才显示)

    SALEWATR     BIT   FLAGS1.4;剩余金额不足标志位(显示'请购水')

    POWERDOWN   BIT    FLAGS1.5;电池电压不足标志位

    CUR        BIT   FLAGS1.6;本次购水金额/剩余金额标志位

    XPLAN         BIT    FLAGS1.7;超计划标志位

    ;***********************************************************************

    ;                     程序开始

    ;***********************************************************************

    ORG  0000H

    AJMP RESET

    ORG  0080H

    RESET:

    ;安全设置

    MOV DIVM,#1   ;CPU工作频率降至正常时的1/4

    MOV SP,#59H   ;设堆栈指针

    MOV TMOD,#01H  ;使能定时器0

    ;显示数据初化

    MOV DCONT,#0

    MOV FLAGS1,#00H

    MAIN:

    ;LCD工作方式设定

    CLR LCMC   ;打开LCM电源

    MOV P1M1,#00H  ;将P1.7,P1.6,P1.4置为上拉输出

    MOV P1M2,#0D0H

    MOV P0M1,#00H  ;将P0.7置为上拉输出

    MOV P0M2,#01H

    ACALL INTI1621

    MOV LCDCOMMAND,#Tone4k ;设置音频输出频率为4KHZ

    ACALL Send1621Com

    ;进入正常显示状态

    ;正常显示情况下,不发送数据时,把SPI口均置为高

    SETB LED1   ;点亮LED1

    CLR LED2

    CLR LED3

    CLR LED4

    ACALL RUNOK

    ;进入全显示状态

    ;LCD各段均显示,然后SPI口设为高阻态,

    CLR LED1

    SETB LED2

    ACALL RUNALL

    ;进入掉电状态

    ;掉电状态是把HT1621设置为掉电方式,以降低功耗

    CLR LED2

    SETB LED3

    ACALL RUNDOWN

    ;进入关断电源状态

    ;关断HT1621电源,以降低功耗

    CLR LED3

    SETB LED4

    ACALL RUNNOP

    SJMP MAIN

    ;RUNOK

    ;从0到f循环显示LCD数位(数字右移)

    ;显示1秒后,所有数字均加1(即缓冲区加11H)

    RUNOK:      ;打开各标志符号

    SETB EMI     ;电磁干扰标志,显示

    SETB PASS   ;水阀打开/关闭标志位,显示开

    SETB OUT     ;IC卡退出标志位(退卡后M3才显示),显示退卡

    SETB SALEWATR      ;显示'请购水'

    SETB POWERDOWN    ;电池电压不足标志位,显示

    SETB CUR     ;本次购水金额/剩余金额标志位,显示本次金额

    SETB XPLAN       ;超计划标志位,显示

    CLR keyin   ;清除keyin标志位

    ACALL LOADDAT   ;装载数据

    CLR C

    MOV A,#9

    SUBB A,DCONT   ;判断DCONT是否大于9,大于9则打开蜂鸣器

    JNC RUNOK_L1

    MOV LCDCOMMAND,#ToneOn

    ACALL Send1621Com

    RUNOK_L1:

    ACALL BrushLcd

    ACALL DELAY_1S

    MOV LCDCOMMAND,#ToneOff ;关闭蜂鸣器

    ACALL Send1621Com

    ACALL DELAY_1S  ;延时并接收按键

    ACALL DELAY_1S

    ACALL DELAY_1S

    INC DCONT   ;计数器加1

    CLR C

    MOV A,#0FH   ;若DCONT的值大于0FH,则复位为0

    SUBB A,DCONT

    JNC RUNOK_L2

    MOV DCONT,#0

    ACALL   INTI1621  ;重新设置1621

    MOV LCDCOMMAND,#Tone4k ;设置音频输出频率为4KHZ

    ACALL Send1621Com

    RUNOK_L2:

    JNB keyin,RUNOK  ;判断是否有按键,有则退出正常显示方式

    RET

    ;数据装载程序

    ;将计数数据进行字模转换后放入显示缓冲区,包括状态字段。

    LOADDAT:

    MOV R0,#DISBUFFER  ;指定显示地址为SEG0开始

    MOV R1,DCONT

    MOV R7,#10   ;写入12个数据

    LOAD_L1:    ;将数据填充显示缓冲区

    MOV A,R1

    MOV DPTR,#LCDData

    MOVC A,@A+DPTR  ;字模转换

    MOV @R0,A

    INC R0   ;缓冲区的下一个地址

    DJNZ R7,LOAD_L1

    JNB    EMI,HOLD0  ;EMI=1时,

    ORL    DISBUFFER,#10H        ;显示电磁干扰信号

    HOLD0:

    JNB     PASS,HOLD1

    ORL    DISBUFFER+1,#10H ;PASS=1时,显示'开'

    SJMP    HOLD2

    HOLD1:

    ORL     DISBUFFER+2,#10H  ;否则显示'关'

    HOLD2:

    JNB     OUT,HOLD3  ;OUT=1时

    ORL     DISBUFFER+3,#10H ;显示'退卡'

    SJMP    HOLD4

    HOLD3:

    ORL    DISBUFFER+6,#10H       ;否则显示'M3'

    HOLD4:

    JNB     SALEWATR,HOLD5

    ORL    DISBUFFER+4,#10H       ;显示'请购水'

    HOLD5:

    JNB     XPLAN,HOLD6

    ORL    DISBUFFER+5,#10H       ;'超计划'

    HOLD6:

    JNB     POWERDOWN,HOLD7

    ORL    DISBUFFER+8,#10H       ;电池缺电符号

    HOLD7:

    ORL    DISBUFFER+9,#10H       ;单位'元'

    JNB     CUR,HOLD8

    MOV    DISBUFFER+10,#05H      ;'本次金额'

    RET

    HOLD8:

    MOV DISBUFFER+10,#03H      ;'剩余金额'

    RET

    ;RUNALL

    ;全显示输出,把SPI接口置为高阻态,以便测量LCM功耗

    RUNALL:

    MOV R7,#12

    MOV R0,#DISBUFFER

    RUNALL_L1:

    MOV @R0,#0FFH  ;装入数据0FFH

    INC R0

    DJNZ R7,RUNALL_L1

    ACALL BrushLcd  ;刷新LCD显示

    ORL P0M1,#2AH  ;设置IO口为高阻态

    ANL P0M2,#0D5H

    MOV PT0AD,#2AH

    RUNALL_L2:    ;等待按键

    JB KEY,$

    MOV R7,#0FFH

    DJNZ R7,$

    JB KEY,RUNALL_L2

    JNB KEY,$

    ANL P0M1,#0D5H  ;恢复IO口

    MOV PT0AD,#00H

    RET

    ;RUNDOWN

    ;掉电方式,把SPI接口置为高阻态,以便测量LCM功耗

    RUNDOWN:

    ACALL HT1621DOWN  ;进入掉电状态

    ORL P0M1,#2AH  ;IO口置为高阻态

    ANL P0M2,#0D5H

    MOV PT0AD,#2AH

    RUNDOWN_L1:

    JB KEY,$   ;等待按键

    MOV R7,#0FFH  ;去抖动

    DJNZ R7,$

    JB  KEY,RUNDOWN_L1

    JNB KEY,$   ;等待按键放放开

    RET

    ;RUNNOP

    ;关断LCD电源,把SPI接口置为高阻态。

    RUNNOP:

    SETB LCMC   ;关断LCM电源

    RUNNOP_L1:       ;等待按键操作

    JB KEY,$

    MOV R7,#0FFH

    DJNZ R7,$

    JB KEY,RUNNOP_L1

    JNB KEY,$

    ANL P0M1,#0D5H  ;恢复IO口设置

    MOV PT0AD,#00H

    CLR LCMC   ;打开LCM电源

    RET

    ;延时1S子程序

    ;    在延时过程序可以判断有无按键,有按键时置位keyin位,无按

    ;键时不对keyin操作。

    DELAY_1S:

    SETB TR0   ;启动定时器

    MOV R0,#2

    BACK:

    MOV TL0,#0B0H  ;置初值

    MOV TH0,#3CH

    DL:

    JB KEY,DL_1

    MOV R7,#0FFH  ;有按键,进行去抖动处理

    DJNZ R7,$

    JB KEY,DL_1

    SETB keyin   ;是按键,置位keyin

    DL_1:

    JNB TF0,DL

    CLR TF0

    DJNZ R0,BACK   ;等待定时时间到

    JNB KEY,$   ;等待按键放开

    RET

    ;包含1621操作软件包

    $INCLUDE(LCD1621.INC)   ;包含头文件,头文件内已定义SPI,显示缓冲区,

    ;及各操作变量,ZY886A型LCD数字显示表等

    展开全文
  • 说明K1 K2 K3 是LCD模块的设置开关K1 是WDT 选择开关闭合时打开WDT 否则关闭WDT K2 是TONE 选择开关闭合时打开音频输出否则关闭K3 是LCD 模块振荡器选择开关K3 闭合时是选择外部32.768K 晶振否则选择内部RC 振荡器...
  • 【STM32】STM32驱动 LCD12864程序代码(串行方式)

    万次阅读 多人点赞 2019-07-30 19:37:34
    《STM32 LCD12864 串行通信模式 (从原理让你理解)》 下方代码的实现也是基于上一篇的讲解顺序来的 设备: STM32F407ZGT6 引脚接线: VSS——GND VDD——VCC(5V or 3.3V) V0 亮度调节...
  • LCD12864串行驱动程序

    千次阅读 2020-03-12 09:45:21
    //关闭图形显示 for(line = 0; line ; line++) { Lcd_WriteCmd(0x80+line); Lcd_WriteCmd(0x80); for (row = 0; row ; row++) { Lcd_WriteData(*img ++); } } for(line = 0; line ; line++) {...
  • STM32串行驱动LCD12864显示屏程序代码

    千次阅读 多人点赞 2021-06-26 18:07:00
    1. LCD12864显示原理简单介绍 1.1 液晶原理简单介绍 LCD屏幕上其实都是一个个的像素点组成的,每行每列都有若干个像素点。每个像素点所占据的数据位宽(或者说像素深度)对于不同类型的屏幕,是不一样的。比如真彩色...
  • 第017课 LCD原理详解及裸机程序分析

    千次阅读 2018-02-28 11:10:34
    第001节_LCD硬件原理 先简单介绍下LCD的操作原理。 如下图的LCD示意图,里面的每个点就是一个像素点。 想象有一个电子枪,一边移动,一边发出各种颜色的光。这里有很多细节问题,我们一个一个的梳理。 电子枪...
  • 这节主要讲下spi-lcd-st7789单片机程序如何移植到linux。不会详细描述linux spi驱动框架的细节,想要详细了解Linux spi驱动的内容,可以参考韦东山老师的视频。 单片机程序参考正点原子的代码,如有侵权请告知。 ...
  • 字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示:字符型LCD的引脚定义HD44780内置了DDRAM、CGROM和CGRAM。...
  • 三、LCD1602各子程序模块及主程序编写: 现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。 1.头文件,宏定义,定义管脚等: #include《reg52.h》 #include 《string.h》 #define uchar unsigned ...
  • vc写的关闭显示器的小程序关闭显示器有利于节约用电,保护显示器
  • 带I2C的LCD1602液晶显示51单片机程序 实现功能:液晶屏上显示日期及动态时间,由中断函数来实现时间的动态变换 #include <reg52.h>//头文件 #include <intrins.h> #define uint unsigned int #define ...
  • 89C51单片机设计数控稳压电源(LCD显示+16控制按键)PROTEL 设计原理图PCB工程,Protel 99se设计硬件原理图PCB文件,可用Protel或 Altium Designer(AD)软件打开或修改,可作为你产品设计的参考。
  • LCD1602单片机(STC51/STM32)驱动程序详解

    千次阅读 2020-10-17 11:22:43
    LCD1602单片机(STC51/STM32)驱动程序详解 作者:hackett 微信公众号:加班猿 一、LCD1602简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其...
  • 1602液晶简单显示程序

    千次阅读 2021-05-19 17:33:15
    1602 液晶手册提供了一个初始化过程,由于不检测“忙”位,所以程序比较复杂,而我们总结了一个更加简易方便的过程提供给大家,手册上描述的那个,大家仅仅作为了解就可以了,下面我把程序写出来大家看下,我们的...
  • main.c #include "reg52.h" #include <intrins.h> #include <string.h> #include <stdio.h> #include <...#include "LCD12864.h" ... Ini_Lcd();... Lcd_WriteStr(0,0,"QQ137712826");...lcd128.
  • stm32驱动LCD12864液晶屏驱动程序,亲测可行,复制直接能用! biao2488890051 2018-11-14 20:31:17 21564 已收藏 64 分类专栏: stm32 版权 废话不多说,直接贴程序,你自己复制过去即可,免得我通过把工程上传的...
  • 51单片机Protues,仿真PT100温度传感器,在LCD12864显示温度,可以控制风机的打开与关闭,蜂鸣器报警,485发送温度到串口助手。程序+仿真
  • LCD驱动程序设计

    2015-08-27 18:54:50
    先讲LCD工作原理,分为LCD硬件体系架构,LCD显示流程和显示信号。
  • LCD驱动程序编写

    千次阅读 2019-01-10 16:12:00
    学习目标:编写LCD驱动程序,熟悉根据芯片手册分析时序图,配置寄存器,并测试LCD程序。 一、LCD驱动程序编写 步骤: 1)分配fb_info结构体 2)设置fb_info结构体  a. 固定参数  b. 可变参数  c. 操作函数...
  • v4l2_camera_lcd_imx6ull.zip

    2021-06-16 08:22:38
    Linux下I.MX6U开发板的摄像头应用程序。...通过该程序,能够实现摄像头数据显示在LCD上,通过该程序,可以掌握Linux应用开发中v4l2框架的摄像头驱动函数,以及对/dev/video0,/dev/fb0的打开、读取和关闭等操作。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,073
精华内容 7,229
热门标签
关键字:

关闭lcd程序