51单片机的1602驱动程序

发布者:幸福时刻最新更新时间:2015-05-27 来源: 51hei关键字:51单片机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
//////////////////////////////////////////////////////头文件/////////////////////////////////////////////////////

/*******************************************************************************
*  标题:  1602显示驱动程序                                                                       *
*  文件:  1602lcd.h 1602lcd.c                                                                     *
*  日期:  2010-3-11                                                                                      *
*  版本:  1.12(试验通过版)可用51hei单片机开发板           *
*  邮箱:  acsdf139@163.com       qq:526083029                                 *
*  网站: 无                                                                                                 *
********************************************************************************
*  描述:                                                                                                          *
*         用法:首先在主程序内添加头文件#include"1602lcd.c"             *
*    再在mian()中初始化液晶即可                                                              *
*                                                                                                                     *
********************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权       *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评     *
*【技术支持】qq:526083029  小张                                                      *
********************************************************************************/

#ifndef _LCD1602_H_
#define _LCD1602_H_

#define delaynop(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define uchar unsigned char
#define SETXY 1
#define XYPRS   1
#define XYPRC   1
#define LEFTRIGHT 0

/************************************/
//函数声明
extern bit lcdbusy(void);
extern void lcdwcmd(uchar cmd);  //写命令函数1
extern void lcdwdat(uchar dat);  //写数据1
extern void lcdpos(uchar x,bit y);  //行设置1
extern void lcdinit(void);     //初始化1
extern void lcdprc(uchar ch);  //写字符1
extern void lcdprs(uchar *string); //写字符串1
extern void lcdsetxy(uchar X,uchar Y);//显示坐标设置
extern void lcdxyprs(uchar X,uchar Y,char *String);//指定坐标显示字符串
extern void lcdxyprc(uchar X,uchar Y,char ch);
extern void lcdsetxs(bit D,bit C,bit B);
extern void lcdsetim(bit I_D,bit S);
extern void lcdclear(); //清屏函数
extern void lcdenter(); //显示回车
extern void lcdcri(unsigned char n);
extern void lcdcle(unsigned char n);
extern void lcdright(unsigned char n);
extern void lcdright(unsigned char n);
#endif
//////////////////////////////////////////////////////c程序/////////////////////////////////////////////////////

#include
#include "1602lcd.h"
#include

//管角定义

sbit RSlcd=P2^0;  //数据命令选择   
sbit RWlcd=P2^1;  //数据读写
sbit EPlcd=P2^2;  //使能

/************************************
 函数名:lcdbusy
 函数功能:1602忙闲信号
 参数:无
 返回:bit类型值 1为忙,0为闲
 备注:
************************************/
bit lcdbusy(void)
{    bit result;
   RSlcd = 0;
   RWlcd = 1;
   EPlcd = 1;
   delaynop();
   result = (bit)(P0 & 0x80);
   EPlcd = 0;
   return result; 
}[page]
/*************************************
函数名:lcdwcmd
函数功能:向1602中写指令
参数:cmd(命令)
返回:无
备注:无
*************************************/
void lcdwcmd(uchar cmd)
{
   while(lcdbusy());
   RSlcd=0;
   RWlcd=0;
   EPlcd=0;
   _nop_();
   _nop_();
   P0=cmd;
   delaynop();
   EPlcd = 1;
   delaynop();
   EPlcd = 0;
}
/*************************************
函数名:lcdwdat
函数功能:向1602中写数据
参数:dat(数据)
返回:无
备注:无
*************************************/
void lcdwdat(uchar dat)
{
   while(lcdbusy());
   RSlcd=1;
   RWlcd=0; 
   EPlcd=0;
   P0=dat;
   delaynop();
   EPlcd=1;
   delaynop();
   EPlcd=0;  
}
/*************************************
函数名:lcdprc
函数功能:写一个字符
参数:zifu(字符)
返回:无
备注:无
*************************************/
void lcdprc(uchar zifu)
{
   lcdwdat(zifu);
}
/*************************************
函数名:lcdprs
函数功能:写字符串
参数:zifu(字符)
返回:无
备注:无
*************************************/
void lcdprs(uchar *string)
{
   while(*string)
    {lcdwdat(*string);string++;}
}
/*************************************
函数名:lcdclear
函数功能:清屏
参数:无
返回:无
备注:无
*************************************/
void lcdclear(void)
{
   lcdwcmd(0x01);
}
/*************************************
函数名:lcdenter
函数功能:软复位
参数:无
返回:无
备注:无
*************************************/
void lcdenter(void)
{
    lcdwcmd(0x2);
}
/*************************************
函数名:lcdsetxs
函数功能:显示设置
参数:d(显示)c(光标)b(闪烁)
返回:无
备注:d=1(开显示),d=0(关显示)
   c=1(显示光标),c=0(不显示光标)
   b=1(光标闪烁),b=0(不闪烁)
*************************************/
void lcdsetxs(bit D,bit C,bit B)
{
   unsigned char order;
   order=0x8;
   if(D)
      order=order+0x4;
   if(C)
      order=order+0x2;
   if(B)
      order=order+0x1;
   lcdwcmd(order); 
}
/*************************************
函数名:lcdsetim
函数功能:左右移动
参数:I_D(地址指针), S(整行移动)
返回:无
备注:I_D=1(光标右移),I_D=0(光标左移)
   S=1(整行左右移),S=0(整行不动)
*************************************/
void lcdsetim(bit I_D,bit S)
{
   unsigned char order;
   order=0x4;
   if(I_D)
       order=order+0x2;
   if(S)
       order=order+0x1;
   lcdwcmd(order);
}

/*************************************
函数名:lcdinit
函数功能:初始化
参数:无
返回:无
备注:无
*************************************/
void lcdinit()
{
 
   lcdwcmd(0x38);
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   lcdwcmd(0x38);
   _nop_();
   _nop_();
   _nop_();
   _nop_(); 
   lcdwcmd(0x38);
   _nop_();
   _nop_();
   _nop_();
   _nop_(); 
   lcdsetxs(1,0,0); //设置输入模式,默认增量方式,画面不动,光标向右边移动
   lcdsetim(1,0);
   lcdwcmd(0x01);  //清屏 
}

/*************************************
函数名:lcdsetxy
函数功能:坐标设置
参数:x(列数),y(行数)
返回:无
备注:配合lcdxyprc,lcdxyprs函数使用
   列数小于39,行数小于2 
*************************************/
void lcdsetxy(uchar X,uchar Y)
{
    uchar Address;
    if(X>39)
        X=39;
    if (Y == 0)
  {
       Address = 0x80 + X;
     }
    else
  { 
         Address = 0xc0 + X;
  } 
    lcdwcmd(Address);
}

[page]

#if XYPRC
/*************************************
函数名:lcdxyprc
函数功能:在特定行列内显示字符
参数:X(列),Y(行),ch(字符)
返回:无
备注:列数小于16,行数小于2
*************************************/
void lcdxyprc(uchar X,uchar Y,char ch)
{
   lcdsetxy(X,Y);
   lcdwdat((uchar)ch);
}
#endif

#if XYPRS
/*************************************
函数名:lcdxyprs
函数功能:在特定行列内显示字符串
参数:X(列),Y(行),String(字符)
返回:无
备注:列数小于16,行数小于2
*************************************/
void lcdxyprs(uchar X,uchar Y,char *String)
{
   if(Y==0)
    {
        if(X<16)
         {
             lcdsetxy(X,Y);
             for(;X<16 && *String!='';X++)
              {
                  lcdwdat((uchar)*String);
                  String++;
              }
             if(*String!='')
              {
                  X=0;
                  Y=1;
              }
         }
    }
   if(Y==1)
    {
       lcdsetxy(X,Y);
       for(;X<16 && *String!='';X++)
        {
           lcdwdat((uchar)*String);
           String++;
        }    
    } 
}

#endif

 

#if LEFTRIGHT
/*************************************
函数名:lcdright
函数功能:画面和光标一起右边移动n个字符位置
参数:n(字符数)
返回:无
备注:无
*************************************/
void lcdright(unsigned char n) //shift by n characters Right
{
   unsigned char i;
   for(i=0;i        lcdwcmd(0x1e);   
}
/*************************************
函数名:lcdleft
函数功能:画面和光标一起左边移动n个字符位置
参数:n(字符数)
返回:无
备注:无
*************************************/
void lcdleft(unsigned char n) //shift by n characters Left
{
   unsigned char i;
   for(i=0;i        lcdwcmd(0x18); 
}
/*************************************
函数名:lcdcle
函数功能:光标往左边移动n个字符位置
参数:n(字符数)
返回:无
备注:无
*************************************/
void lcdcle(unsigned char n) //shif cursor right by n
{
   unsigned char i;
   for(i=0;i        lcdwcmd(0x14); 
}

/*************************************
函数名:lcdcri
函数功能:光标往右边移动n个字符位置
参数:n(字符数)
返回:无
备注:无
*************************************/
void lcdcri(unsigned char n) //Shift cursor left by n
{
   unsigned char i;
   for(i=0;i        lcdwcmd(0x10); 
}

#endif

关键字:51单片机  驱动程序 引用地址:51单片机的1602驱动程序

上一篇:51单片机的at24c02驱动程序
下一篇:51单片机的ds18b20驱动程序

推荐阅读最新更新时间:2024-03-16 14:03

51单片机】 蜂鸣器发声程序
蜂鸣器分为有源和无源,这个源是震荡源。 有源的直接给高电平就可以响(也有低电平驱动)。 无源的还需要通过给一个持续到震荡源才能作用。 51单片机开发板上的蜂鸣器通常是无源的。以下是蜂鸣器发声程序。 #include reg51.h sbit beep = P1^5; //定义P1_5为蜂鸣器端口 void delay(unsigned int i) //延时程序 { while(i--); } void main() //主程序 { while(1) //while无限循环 { beep = ~beep; //蜂鸣器程序取反 delay(100); } } 注意:如果程
[单片机]
【<font color='red'>51单片机</font>】 蜂鸣器发声程序
51单片机精确延迟程序
51单片机精确延时程序(晶振12MHz,一个机器周期1us.) 几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序:(晶振12MHz,一个机器周期1us.)   void delay500ms(void)   {   unsigned char i,j,k;   for(i=15;i 0;i--)   for(j=202;j 0;j--)   for(k=81;k 0;k--);   }   计算分析:   程序共有三层循环   一层循环n:R5*2 = 81*2 = 162us DJNZ 2us   二层循环m:R6
[单片机]
51单片机做32路流水灯程序
用51单片机做的超级32路流水灯程序 下面是实物图片: 源代码下载地址: http://www.51hei.com/f/ts24.rar #include reg51.h #include intrins.h #define ushort unsigned short //P0,P1,P2,P3数据类型是 unsigned short ;数值范围 :0~~~~65 635 #define uint unsigned int ushort code display_P0 ={ //P0 口显示内容 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
[单片机]
<font color='red'>51单片机</font>做32路流水灯程序
8051单片机的机器周期解析
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。参见后面的时序图。
[单片机]
80<font color='red'>51单片机</font>的机器周期解析
80C51单片机程序(1)
//80C51程序 单片机的点亮 #include reg52.h //包含reg52.h头文件 #define uint unsigned int //宏定义uint的数据类型为unsigned int型 sbit D1=P1^2; //定义P1^2位 void main() { uint num=50000; //定义num数据类型,并附初值 D1=0; //点亮发光二极管 while(num--); //延时 } ------------------------------------------------------------------- #inc
[单片机]
谈谈51单片机的RETI指令
  最近在基于51 单片机 编程的过程中出现了个很奇怪的问题 程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断 。   在有过单片机中断编程经历者都知道当EA=1,ET0=1的条件下,满足TF0=1时,如果在此期间没有更高优先级的中断执行的情况下定时器中断0必定会产生中断响应。而在我所编写的程序中仅使用了定时器中断0,一个中断也就谈不上存在优先级问题。经过我对自己程序的检查并对各教材中断程序对比发现我的程序中的一个问题:由于中断的不可控性决定其跳出中断返回主程序的不确定,而由于程序需要中断跳出后能跳到指定的地址。为了解决这个问题我在中断结束的地方直接用了无条件跳转指令 LJMP ADR16 其
[单片机]
51单片机产品数量自动计量系统Proteus仿真程序设计
1. 设计要求 如右图所示,以MCS-51系列单片机为核心设计一个具有独创功能的计量控制系统,控制瓶装产品包装生产流水线,每计满一定瓶数产品时发出一个包装控制信号,通过相关电路驱动包装机完成一次包装动作。 要求: 1. 每箱产品的瓶数为51瓶,可记录已封装箱数; 2. 系统具有人机交互功能,可由用户控制流水线工作速度,并实时显示已计量瓶数和封装箱数; 3. 流水线使用48V 2000W直流电机进行传动,设计MCU与该电机的接口电路,实现流水线传动的启停和速度 控制,并仿真其可行性; 4. 设计用于检测瓶子的 传感器应用电路,实现对瓶数的感测; 5. 包装机数据接口为 RS-485接口,设计MCU与包装机的接口电路; 6.
[单片机]
<font color='red'>51单片机</font>产品数量自动计量系统Proteus仿真程序设计
用类/微驱动模型开发DSP视频驱动程序
近年来,DSP运算能力的不断增强,使其在电子设备方面得到了广泛的应用。DSP/BIOS是TI公司推出的一个实时操作系统,与TI的CCS(Code Composer Studio)集成在一起。用DSP/BIOS可以大大简化DSP应用程序的开发和调试,其中与外围设备的I/O接口是DSP应用开发中不可缺少的重要部分。TI公司为C64x系列DSP的开发者提供了一种类/微驱动模型(class/mini drivermodel)。通过对外围设备设计驱动程序,为高层应用程序提供统一的接口来操作底层硬件。只要是遵循此驱动程序接口标准开发的高层应用程序,都可以在具有相同接口的不同硬件平台上运行,从而使DSP软件系统与硬件系统相分离,提高了软件的可重
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved