单片机 LCD1602显示实验
电路图如下:
1、请描述液晶显示器的显示原理,及其与数码管相比的技术特点。
显示原理:
液晶显示器是利用偏光板这个特性来完成的,利用上下两片栏栅之间相互垂直的偏光板之间充满了液晶,
再利用电场控制液晶分支的旋转,来改变光的行进方向。
与数码管相比:数码管是元件,显示器是器件。
数码管在单片机中,一般仅做数字显示,而LCD可以显示数字、字符、汉字和图形。
还有LCD显示器体积小,厚度薄,重量轻、耗能少、工作电压低(1.5到6V)且无辐射,无闪烁并能直接与CMOS集成电路匹配。
2、
定义uchar变量data,要求在LCD1602上实现数字0~99的循环显示。
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********主程序*********************************/
void main(void)
{LCD_initial(); //LCD1602 初始化while(1){ unsigned int i;unsigned char m,n;delay(10);for(i=0;i<=99;i++){if(i<10){n=i+'0';dis_char(0x08,n);//显示字符string(0x48,"wxh");//显示我的名字}else if(i<100){m=i/10+'0';n=i%10+'0';dis_char(0x08,m);//显示字符dis_char(0x09,n);string(0x48,"wxh");//显示我的名字}delay(100); write_command(0x01); //清屏delay(100); }}
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input){write_command(ad+0x80);write_data(input);delay(10);}
//1ms延时程序
void delay(uint j)
{uchar i=250;for(;j>0;j--){while(--i);i=249;while(--i);i=250;}
}
//查忙程序
void check_busy(void)
{uchar dt;do{dt=0xff;e=0;rs=0; rw=1;e=1;dt=out;}while(dt&0x80);e=0;
}
//写控制指令
void write_command(uchar com)
{check_busy();e=0;rs=0;rw=0;out=com;e=1;_nop_();e=0;delay(1);
}
//写数据指令
void write_data(uchar dat)
{check_busy();e=0;rs=1;rw=0;out=dat;e=1;_nop_();e=0;delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{write_command(0x38);//8位总线,双行显示,5X7的点阵字符write_command(0x0C);//开整体显示,光标关,无黑块write_command(0x06);//光标右移write_command(0x01);//清屏delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{write_command(ad+0x80); //ad是显示位置信息while(*s>0){write_data(*s++);delay(100);}
}
3、在int0引脚上,利用按键实现中断触发,并在LCD1602上显示的触发次数。
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义************************/unsigned int i=0;
/***********主程序*********************************/
void main(void)
{LCD_initial(); //LCD1602 初始化IT0=1;//设置P3.2引脚负跳变触发中断EA=1;//打开中断总开关EX0=1;//允许外部中断0引脚的中断PX0=1;//将外部中断0的优先权设置为高级中断 while(1){ unsigned char m,n;delay(10);if(i==0){string(0x00,"Hi! Teacher Chen");}else if(i<10){n=i+'0';dis_char(0x08,n);//显示字符string(0x48,"wxh");//显示我的名字}else if(i<100){m=i/10+'0';n=i%10+'0';dis_char(0x08,m);//显示字符dis_char(0x09,n);string(0x48,"wxh");//显示我的名字}delay(100);write_command(0x01); //清屏delay(100);}
}
//INT0中断程序
void inter_0(void) interrupt 0{i++;if(i==99) i=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input){write_command(ad+0x80);write_data(input);delay(10);}
//1ms延时程序
void delay(uint j)
{uchar i=250;for(;j>0;j--){while(--i);i=249;while(--i);i=250;}
}
//查忙程序
void check_busy(void)
{uchar dt;do{dt=0xff;e=0;rs=0; rw=1;e=1;dt=out;}while(dt&0x80);e=0;
}
//写控制指令
void write_command(uchar com)
{check_busy();e=0;rs=0;rw=0;out=com;e=1;_nop_();e=0;delay(1);
}
//写数据指令
void write_data(uchar dat)
{check_busy();e=0;rs=1;rw=0;out=dat;e=1;_nop_();e=0;delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{write_command(0x38);//8位总线,双行显示,5X7的点阵字符write_command(0x0C);//开整体显示,光标关,无黑块write_command(0x06);//光标右移write_command(0x01);//清屏delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{write_command(ad+0x80); //ad是显示位置信息while(*s>0){write_data(*s++);delay(100);}
}
4、利用LCD1602显示出时分秒(时钟)
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义******************************************/unsigned int hour=0;//时unsigned int min=0;//分unsigned int sec=0;//秒unsigned int counter=0;//软件计数
/***********主程序*********************************/
void main(void)
{
unsigned char period_number;LCD_initial();//LCD1602 初始化string(0x43,"Good night!");//晚安period_number=200;TMOD=0x02;//方式2TL0=0-period_number;//装初值TH0=0-period_number; TR0=1;//启动EA=1;//打开中断总开关ET0=1;//允许T0引脚的中断while(1){ unsigned char h1,h2,m1,m2,s1,s2;h1=hour/10+'0';h2=hour%10+'0';m1=min/10+'0';m2=min%10+'0';s1=sec/10+'0';s2=sec%10+'0';dis_char(0x04,h1);//显示时dis_char(0x05,h2);dis_char(0x06,':');dis_char(0x07,m1);//显示分dis_char(0x08,m2);dis_char(0x09,':');dis_char(0x0a,s1);//显示秒dis_char(0x0b,s2);}
}
//T0中断程序
void inter_1(void) interrupt 1{counter++;if(counter>=5000){counter=0;sec++;}if(sec>=60) {min++;sec=0;}if(min>=60){ hour++;min=0;}if(hour==24) hour=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input){write_command(ad+0x80);write_data(input);delay(10);}
//1ms延时程序
void delay(uint j)
{uchar i=250;for(;j>0;j--){while(--i);i=249;while(--i);i=250;}
}
//查忙程序
void check_busy(void)
{uchar dt;do{dt=0xff;e=0;rs=0; rw=1;e=1;dt=out;}while(dt&0x80);e=0;
}
//写控制指令
void write_command(uchar com)
{check_busy();e=0;rs=0;rw=0;out=com;e=1;_nop_();e=0;delay(1);
}
//写数据指令
void write_data(uchar dat)
{check_busy();e=0;rs=1;rw=0;out=dat;e=1;_nop_();e=0;delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{write_command(0x38);//8位总线,双行显示,5X7的点阵字符write_command(0x0C);//开整体显示,光标关,无黑块write_command(0x06);//光标右移write_command(0x01);//清屏delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{write_command(ad+0x80); //ad是显示位置信息while(*s>0){write_data(*s++);delay(100);}
}
单片机 LCD1602显示实验相关推荐
- Proteus8仿真:51单片机LCD1602显示
51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...
- 实验(四):LCD1602显示实验
一.实验目的与任务 实验目的: 1. 掌握LCD1602显示控制方法: 2. 掌握利用Proteus进行单片机控制系统的仿真及调试方法. 3. 掌握单片机开发板的使用. 任务: 1.根据要求编写程序, ...
- MSP430+LCD1602显示实验
MSP430+LCD1602显示实验 LCD12864同样适用 1.本实验用开发板 2.程序代码 3.实验效果 1.本实验用开发板 使用的模块是TI官方的MSP430F5529开发板,只需更改引脚即可 ...
- 基于51单片机LCD1602显示
基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...
- STM32单片机TFTLCD显示实验:TFTLCD简介
STM32单片机TFTLCD显示实验学习笔记 1.TFTLCD模块接口图 以2.8寸的TFTLCD为例,采用16位的并方式与外界进行连接,模块接口图如下所示: 具有如下一些信号线: CS:TFTLCD ...
- 【优秀课设】51单片机LCD1602显示的温度控制系统设计 包括时间显示 校时、设置最值温度报警功能
1.将DS18B20温度传感器的温度读出来,并在LCD1602上显示出来. 2.在LCD上分别切换显示,软件设计时钟(时.分.秒),和当前温度值,和温度上下控制值.并可以通过按键进行修改设置,温度高于 ...
- 51单片机LCD1602显示电子时钟 带按键设置和星期显示
当时看书看到lcd那章,就想利用定时器做一个电子时钟,当时也不知道有时钟模块的,以为都是定时器定时产生的时间,也是一个main文件从头到尾的版本,注释倒不少,不要说什么模块化编程和代码优化,想到什么就 ...
- 简单易懂的51单片机LCD1602显示protues仿真程序
时序图 仿真效果 #include"AT89X51.h" typedef unsigned char u8; typedef unsigned int u16;#define ...
- 仿真软件proteus构建LCD1602显示字符串实验
LCD1602模块的显示需要注意几点: 1.显示两行,第一行的起始地址是0x80,第二行的地址是0x80+0x40 = 0xC0. 2.RS,RW,EN接线没有说一定要接到P1,P2,P3上,只要给对 ...
最新文章
- 网络协议关系拓扑图 很全面 很好
- 本地navicat连接阿里云数据库
- ae中合成设置的快捷键_AE项目工作流程讲解及项目与合成设置
- oracle简易版创建数据库,浅析新建Oracle数据库的三种方法
- Nginx配置服务器静态文件支持跨域访问
- 淘宝支付页面代码php,支付页面html模板
- 嵌入式C开发中用到的位域结构体
- Android AlarmManager广播接收器和服务
- Java读取、创建Excel;验签,加密
- 参数估计:文本分析的参数估计方法
- android加载框效果《IT蓝豹》
- 全民主公2怎么在电脑上玩 全民主公2安卓模拟器玩法教程
- 小学教育专业语文方向毕业论文怎么选题?
- element提交图片限制一张_ElementUI 上传文件以及限制
- u8 客户端修改服务器地址,u8服务器地址怎么修改
- 30 个 Python 的最佳实践、小贴士和技巧
- TCP/IP 之 大明王朝邮差
- 郎平的与时俱进-《夺冠》观后感
- ICPC Central Russia Regional Contest (CRRC 19)
- 标题爱奇艺的数据库选型大法,实用不纠结!