51单片机lcd1602编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号

&nbsp&>51单片机c语言编写的1602液晶显示闹钟程序
51单片机c语言编写的1602液晶显示闹钟程序
编号:1-247369 | doc 格式 | 86.00K |
Ta 们刚刚下载了...基于51单片机的1602显示程序。_百度知道
基于51单片机的1602显示程序。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
朝夕指倾知道合伙人
获赞数:33
擅长:暂未定制
#include&reg52.h&#define uchar unsigned char#define uint unsigned intuchar code table[]=&Eaz0&;uchar code table1[]=&abc asdfg qwe&;sbit lcden=P3^4;sbit lcdrs=P3^5;void delay(uint z);void write_com(uchar com);void write_data(uchar date);void init();int main(){ init(); while(1) {
write_com(0x80);
for(num=0;num&4;num++)
write_data(table[num]);
write_com(0x80+0x40);
for(num=0;num&13;num++)
write_data(table1[num]);
} } }void init(){ lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);}void write_com(uchar com){ lcdrs=0; P2= delay(5); lcden=1; delay(5); lcden=0;}void write_data(uchar date){
lcdrs=1; P2= delay(5); lcden=1; delay(5); lcden=0;}void delay(uint z){ uint x,y; for(x=z;x&0;x--)
for(y=110;y&0;y--);}
做而论道知道合伙人
采纳数:13302
获赞数:34729
QQ_知道合伙人
采纳数:341
获赞数:492
基于51单片机的1602显示程序
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。DHT11温湿度传感器51单片机在LCD1602显示程序-学路网-学习路上 有我相伴
DHT11温湿度传感器51单片机在LCD1602显示程序
来源:互联网
贡献&责任编辑:鲁倩 &
//51单片机控制温湿度传感器DHT11 然后在LCD1602上显示当前的温湿度及单位 其中湿度在第一行显示 温度在第二行显示。单片机为YL-9最小系统。# include # include typedef unsigned char BYTE;typedef unsigned int WORD;#define uint unsigned int #define uchar unsigned char sbit io=P1^0;//dht11data端接单片机的P1^0口// sbit rw=P0^6;//一下三行是设置lcd1602的使能端// sbit rs=P0^7; sbit ep=P0^5; typedef bit BOOL;//此声明一个布尔型变量即真或假// uchar data_ uchar RH,RL,TH,TL;
//***************延时函数*************************************
void delay(uchar ms) //延时模块// {
while(ms--)
for(i=0;i<100;i++); } void delay1()//一个for循环大概需要8个多机器周期 一个机器周期为1us 晶振为12MHz
也就是说本函数延时8us多 此延时函数必须德稍微精确一点
for(i=0;i<1;i++); }
//***************************************************************
//lcd模块// BOOL lcd_bz()//测试lcd忙碌状态 返回值为布尔型数值 真或假 '1'.'0'
// 读忙信号
result = (BOOL)(P2&0x80);
void write_cmd(uchar cmd)//写指令// {
while (lcd_bz());
void write_addr(uchar addr)//写地址// {
write_cmd(addr|0x80);//LCD第一行的首地址为0x80 第二行的首地址为0x80+0x40=0xc0 }
void write_byte(uchar dat) //写字节// {
while (lcd_bz());
void lcd_init() //lcd初始化// {
write_cmd(0x38);//设置LCD两行显示 一个数据由5*7点阵表示,数据由8跟线传输
write_cmd(0x0c);//清除屏幕显示
write_cmd(0x06);//设定输入方式 增量不移位
write_cmd(0x01);//开整体显示 关光标 不闪烁
delay(1); }
void display(uchar addr,uchar q)//在某一地址上显示内容 adder表示的是地址偏移量 q表示显示的字符或数字// {
delay(10);
write_addr(addr);
write_byte(q);
delay(1);//修改此时间 可以改变LCD上数值跳变的数度 }
//**************************dht11测试某块*************************************// void start()//开始信号 {
delay(25);// 主机把总线拉低必须大于18ms 保证DHT11能检测到起始信号
//发送开始信号结束后 拉高电平延时20-40us
delay1();//以下三个延时函数差不多为24us 符合要求
delay1(); }
uchar receive_byte()//接收一个字节// {
for(i=0;i<8;i++)//接收8bit的数据
while(!io);//等待50us的低电平开始信号结束
delay1();//开始信号结束之后 延时26us-28us 以下三个延时函数
temp=0;//时间为26us-28us 表示接收的为数据'0'
temp=1; //如果26us-28us之后 还为高电平 则表示接收的数据为'1'
while(io);//等待数据信号高电平 '0'为26us-28us '1'为70us
data_byte<<=1;//接收的数据为高位在前 右移
data_byte|=
return data_ }
void receive()//接收数据// {
uchar T_H,T_L,R_H,R_L,check,num_check,i;
start();//开始信号//
//主机设为输入 判断从机 DHT11 响应信号
if(!io)//判断从机是否有低电平响应信号//
while(!io);//判断从机发出 80us 的低电平响应信号是否结束//
while(io);//判断从机发出 80us 的高电平是否结束 如结束则主机进入数据接收状态
R_H=receive_byte();//湿度高位
R_L=receive_byte();//湿度低位
T_H=receive_byte();//温度高位
T_L=receive_byte();//温度低位
check=receive_byte();//校验位
io=0; //当最后一bit数据接完毕后 从机拉低电平50us//
for(i=0;i<7;i++)//差不多50us的延时
io=1;//总线由上拉电阻拉高 进入空闲状态
num_check=R_H+R_L+T_H+T_L;
if(num_check==check)//判断读到的四个数据之和是否与校验位相同
check=num_
} } //***************************************************************************** void main()//主函数模块// {
lcd_init();//初始化LCD
receive();//接收数据
display(0x00,'R');//LCD的第一行显示
display(0x01,':');
display(0x02,RH/10+0x30); //0x30表示 带字库的LCD的位置放有数字0 RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着
display(0x03,RH%10+0x30);
display(0X04,'%');
display(0x40,'T');//LCD的第二行显示
display(0x41,':');
display(0x42,TH/10+0x30);
display(0x43,TH%10+0x30);
display(0x44,0xdf);//以下两个是温度单位的处理
display(0x45,0x43);
} } 另附效果图:以下内容为系统自动转化的文字版,可能排版等有问题,仅供您参考://51 单片机控制温湿度传感器 DHT11 ?然后在 LCD1602 上显示当前的温湿度及单位?其中 湿度在第一行显示?温度在第二行显示。单片机为 YL-9 最小系统。 # include &reg51.h& # include &intrins.h& typedef unsigned char BYTE; typedef unsigned int WORD; #define uint unsigned int #define uchar unsigned char sbit io=P1^0;//dht11data 端接单片机的 P1^0 口// sbit rw=P0^6;//一下三行是设置 lcd1602 的使能端// sbit rs=P0^7; sbit ep=P0^5; typedef bit BOOL;//此声明一个布尔型变量即真或假// uchar data_ uchar RH,RL,TH,TL;//***************延时函数************************************* void delay(uchar ms) //延时模块// { while(ms--)for(i=0;i&100;i++); }void delay1()//一个 for 循环大概需要 8 个多机器周期?一个机器周期为 1us ?晶振为 12MHz ??也就是说本函数延时 8us 多?此延时函数必须德稍微精确一点? { for(i=0;i&1;i++); }//*************************************************************** //lcd 模块// BOOL lcd_bz()//测试 lcd 忙碌状态?返回值为布尔型数值?真或假?&#39;1&#39;.&#39;0&#39;? { BOOL rs=0; // 读忙信号 rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P2&0x80); ep=0; } void write_cmd(uchar cmd)//写指令// { while (lcd_bz()); rs=0; rw=0; ep=0; _nop_(); _nop_(); P2= _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; }void write_addr(uchar addr)//写地址// { write_cmd(addr|0x80);//LCD 第一行的首地址为 0x80 ?第二行的首地址为 0x80+0x40=0xc0 }void write_byte(uchar dat) //写字节// { while (lcd_bz()); rs=1; rw=0; ep=0; _nop_(); _nop_(); P2= _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; }void lcd_init() //lcd 初始化// { write_cmd(0x38);//设置 LCD 两行显示?一个数据由 5*7 点阵表示,数据由 8 跟线传输 delay(1); write_cmd(0x0c);//清除屏幕显示 delay(1); write_cmd(0x06);//设定输入方式?增量不移位 delay(1); write_cmd(0x01);//开整体显示?关光标?不闪烁 delay(1); }void display(uchar addr,uchar q)//在某一地址上显示内容? adder 表示的是地址偏移量? q 表 示显示的字符或数字// { delay(10); write_addr(addr);write_byte(q); delay(1);//修改此时间?可以改变 LCD 上数值跳变的数度 } //**************************dht11 测试某块*************************************// void start()//开始信号 { io=1; delay1(); io=0; delay(25);// 主机把总线拉低必须大于 18ms ?保证 DHT11 能检测到起始信号 io=1; //发送开始信号结束后?拉高电平延时 20-40usdelay1();//以下三个延时函数差不多为 24us ?符合要求 delay1(); delay1(); }uchar receive_byte()//接收一个字节// { uchar i, for(i=0;i&8;i++)//接收 8bit 的数据 { while(!io);//等待 50us 的低电平开始信号结束 delay1();//开始信号结束之后?延时 26us-28us ?以下三个延时函数? delay1(); delay1(); temp=0;//时间为 26us-28us ?表示接收的为数据&#39;0&#39; if(io==1) temp=1; //如果 26us-28us 之后?还为高电平?则表示接收的数据为&#39;1&#39; while(io);//等待数据信号高电平?&#39;0&#39;为 26us-28us ?&#39;1&#39;为 70us ? data_byte&&=1;//接收的数据为高位在前?右移? data_byte|= } return data_ }void receive()//接收数据// { uchar T_H,T_L,R_H,R_L,check,num_check,i; start();//开始信号// io=1; //主机设为输入?判断从机? DHT11 ?响应信号if(!io)//判断从机是否有低电平响应信号// { while(!io);//判断从机发出 80us 的低电平响应信号是否结束// while(io);//判断从机发出 80us 的高电平是否结束?如结束则主机进入数据接收状态 R_H=receive_byte();//湿度高位 R_L=receive_byte();//湿度低位 T_H=receive_byte();//温度高位 T_L=receive_byte();//温度低位 check=receive_byte();//校验位 io=0; //当最后一 bit 数据接完毕后?从机拉低电平 50us// for(i=0;i&7;i++)//差不多 50us 的延时 delay1(); io=1;//总线由上拉电阻拉高?进入空闲状态 num_check=R_H+R_L+T_H+T_L; if(num_check==check)//判断读到的四个数据之和是否与校验位相同 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; check=num_ } } } //*****************************************************************************void main()//主函数模块// { lcd_init();//初始化 LCD while(1) { receive();//接收数据 display(0x00,&#39;R&#39;);//LCD 的第一行显示 display(0x01,&#39;:&#39;); display(0x02,RH/10+0x30); //0x30 表示?带字库的 LCD1602 中 0x30 的位置放有数字 0 ? RH/10+0x30 即表示湿度的十位数字在字库 RH/10+0x30 的位置处放着? display(0x03,RH%10+0x30); display(0X04,&#39;%&#39;); display(0x40,&#39;T&#39;);//LCD 的第二行显示 display(0x41,&#39;:&#39;); display(0x42,TH/10+0x30); display(0x43,TH%10+0x30); display(0x44,0xdf);//以下两个是温度单位的处理 display(0x45,0x43); } } 另附效果图:
与《》相关:
- Copyright & 2017 www.xue63.com All Rights Reserved&&|&& &&|&& &&|&&
51单片机1602液晶驱动程序(一)总线方式
09:14:39 && 阅读:2187&&
51单片机1602液晶驱动程序(一)总线方式
LCD1602是51单片机的基本应用,其实驱动程序做成模板的话,以后就直接调用就行啦,会省掉很多时间。
LCD1602各个厂家的基本都是兼容的,LCD1601和LCD1604等等驱动程序都是一样的,只是显示的字符数不一样而已。
英文名称叫&LCD Module&,简称&LCM&,中文一般称为&液晶显示模块&。
LCM1601/LCD1601液晶可以显示16x1个字符每行显示16字符;
LCM1602/LCD1602液晶可以显示16x2个字符每行显示16字符;
LCM1604/LCD1604液晶可以显示16x4个字符每行显示16字符。
LCM1602管脚说明
长沙太阳人电子有限公司 SMC1602A LCM 使用说明书
北京青云创新科技发展有限公司 LCM1602B 说明书
从上面的两个说明书可以看到15、16管脚是反着的,15、16管脚对应LCM的背光电源地,如果LCM本身是不带背光的话,这两个管脚是没用的。如果LCM是带背光的话,要注意这两个管脚的连接,具体先测试一下,确定哪个是电源哪个是地。
基本操作时序:
1) 读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
2) 写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:无
3) 读数据:输入:RS=H,RW=H,E=H 输出:D0~D7=数据
4) 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无
初始化过程(复位过程):
1)延时15ms
2)写指令38H(不检测忙信号)
3)延时5ms
4)写指令38H(不检测忙信号)
5)延时5ms
6)写指令38H(不检测忙信号)
7)(以后每次写指令、读/写数据操作之前均需检测忙信号)
8)写指令38H:显示模式设置
9)写指令08H:显示关闭
10)写指令01H:显示清屏
11)写指令06H:显示光标移动设置
12)写指令0CH:显示开及光标设置
LCM1602参考连接
LCM1602有两种方式驱动,8051系列总线方式和8051系列模拟口线方式。
1.8051系列总线方式:
LCM1602总线方式C51程序
//********************Lcd1602B.c***********************************
#include &delay.h&
#include &lcd1602b.h&
#include &absacc.h&
/*=======================================================
&显示字符串
=======================================================*/
void LcdDisplayString(unsigned char x,unsigned char y, unsigned char *ptr) {
unsigned char i,l=0;&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&& while (ptr[l] &31){l++;};&&&&&&&&&&&&&&&&&&&&& //
&&&&&& for (i=0;i&l;i++) {
&&&&&&&&&&&&& LcdDisplayChar(x++,y,ptr[i]);
&&&&&&&&&&&&& if ( x == 16 ){
&&&&&&&&&&&&&&&&&&&& x = 0; y ^= 1; //异或,第一行的话变第二行,第二行的话变第一行
&&&&&&&&&&&&& }
/*=======================================================
&显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {
&&&&&& temp = posx & 0x0f;&&&&&&&&&& & //确保只选0~16个格子
&&&&&& posy &= 0x01;&&&&&&&&&&&&&& & //确保不是在第一行就在第二行
&&&&&& if ( posy )temp |= 0x40;& //在第二行的时候加40H
&&&&&& temp |= 0x80;&& //数据指针设置 指令码 80H+ 地址码( 0-27H ,40H-67H)
&&&&&& LcdWriteCommand(temp,1);
/*=======================================================
&按指定位置显示数出一个字符
=======================================================*/
void LcdDisplayChar(unsigned char x,unsigned char y,unsigned char Wdata) {
&&&&&& LocateXY( x, y );&&&&&&&&&&&&&&&&&&&&&&&& // 定位显示地址
&&&&&& LcdWriteData( Wdata );&&&&&&&&&&&&&&&&&& // 写字符
/*=======================================================
&初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {
&&&&&& Delayms(400);&&&&&&&&&&&&&&&&&&&&& // 启动时必须的延时,等待lcm进入工作状态
&& LcdWriteCommand( 0x38, 0);&&&&&&&&&&&&&& // 显示模式设置(不检测忙信号)
&&&&&& Delayms(15);
&&&&&& LcdWriteCommand( 0x38, 0);&&&&&&&&&&&&&& // 共三次
&&&&&& Delayms(15);
&&&&&& LcdWriteCommand( 0x38, 0);
&&&&&& Delayms(15);
&&&&&& LcdWriteCommand( 0x38, 1);&&&&&&&&&&&&&& // 显示模式设置(以后均检测忙信号)
&&& LcdWriteCommand( 0x08, 1);&&&&&&&&&&&&&&&&&&&& // 显示关闭
&&&&&& LcdWriteCommand( 0x06, 1);&&&&&&&&&&&&&& // 显示光标移动设置
&&&&&& LcdWriteCommand( 0x0c, 1);&&&&&&&&&&&&&& // 显示开及光标设置
&&&&&& LcdClear();
/*=======================================================
=======================================================*/
void LcdClear(void){
&& LcdWriteCommand( 0x01, 1);&&&&&&&&&&&&&& // 显示清屏
/*=======================================================
&写控制字符子程序: E=&1& RS=&0& RW=&0&
=======================================================*/
void LcdWriteCommand( unsigned char CMD,unsigned char AttribC ) {&&&&&& //AttribC=1检查忙状态,AttribC=0不检查忙状态
&&&&&& if (AttribC) while( Lcd1602StatusPort & Busy );&&&&&&&&&& // 检测忙信号?
&&&&&& //busy=0x80&& 每次读写操作都要进行读写检测,确保SAT7=0
&&&&&& Lcd1602CmdPort = CMD;
/*=======================================================
&当前位置写字符子程序: E =1 RS=&1& RW=&0&
=======================================================*/
void LcdWriteData( char dataW ) {
&&&&&& while( Lcd1602StatusPort & Busy );&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //检测忙信号
&& //busy=0x80&& 每次读写操作都要进行读写检测,确保SAT7=0
&&&&&& Lcd1602WdataPort = dataW;
精确微秒级延时(详细可以参考我另一篇博文51单片机C51微秒级(ms)精确延时 )
//********************delay.h***********************************
#include &delay.h&
//for crystal 11.0592M
void Delayms(unsigned int n)
&&&&&& unsigned int i,j;
&&&&&& for(j=n;j&0;j--)
&&&&&& for(i=112;i&0;i--);
//********************lcd1602b.h***********************************
#ifndef __LCD1602B_H__
#define __LCD1602B_H__
#define Lcd1602CmdPort XBYTE[0x8000]&&&& //E=1 RS=&0& RW=&0&& //写指令
#define Lcd1602WdataPort XBYTE[0x8100]& //E =1 RS=&1& RW=&0& //写数据
#define Lcd1602StatusPort XBYTE[0x8200]& //E=1 RS=&0& RW=&1&& //读状态
#define Busy 0x80 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&//busy
extern void LcdClear(void);
extern void LcdWriteData( char dataW );
extern void LcdWriteCommand( unsigned char CMD,unsigned char AttribC );
extern void LcdReset( void );
extern void Display( unsigned char dd );
extern void LcdDisplayChar(unsigned char x,unsigned char y,unsigned char Wdata);
extern void LcdDisplayString(unsigned char x,unsigned char y, unsigned char *ptr);
&& 其中要注意
写指令的地址 0x8000
写数据的地址 0x8100
读状态的地址 0x8200
这三个地址值是根据硬件电路连接确定的。
//******************** absacc.h***********************************
#ifndef __ABSACC_H__
#define __ABSACC_H__
#define CBYTE ((unsigned char volatile code& *) 0)
#define DBYTE ((unsigned char volatile data& *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
#define CWORD ((unsigned int volatile code& *) 0)
#define DWORD ((unsigned int volatile data& *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
#ifdef __CX51__
#define FVAR(object, addr)&& (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr)&& (*((object const far *) (addr)))
#define FCARRAY(object, base) ((object const far *) (base))
#define FVAR(object, addr)&&& (*((object volatile far *) ((addr)+0x10000L)))
#define FCVAR(object, addr)&& (*((object const far *) ((addr)+0x810000L)))
#define FARRAY(object, base)& ((object volatile far *) ((base)+0x10000L))
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
在程序中,用&#include&absacc.h&&即可使用其中定义的宏来访问绝对地址,包括:
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
&absacc.h&这个文件在用到总线方式时必须用到。
共包含4个文件。在主程序中调用相应显示函数。
//******************** main.c***********************************
#include &lcd1602b.h&
#include &reg52.h&
code char capital[]=&DFB Laser&;
LcdReset();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && //LCD初始化
&&&&&& LcdDisplayString(3,0,capital);&&&&&& &&&&&&&&&&& &&&//LCD上显示&DFB Laser&
后参与讨论
阅读:6679
阅读:6961
阅读:7058
阅读:6556

我要回帖

更多关于 lcd1602使用手册 的文章

 

随机推荐