LCD12864驱动程序-51单片机

发布者:tony520最新更新时间:2014-12-17 来源: 51hei关键字:LCD1286  4驱动程序  51单片机 手机看文章 扫描二维码
随时随地手机看文章

/*************************************************************/

/*                                                                          */
/*                Copyright (c) 2012, pcwebmaster                           */
/*                     All rights reserved.                                 */
/*                                                                          */
/*      Email:pcwebmaste@163.com                                            */
/*                                                                          */
/*************************************************************/
/**********************************************************/
/* 文件名:LCD12864.c                                                       */
/* 版  本:Version 1.0                                                      */
/* 描  述:实现液晶和单片机的通讯协议,根据计算机发给的命令进行人机交互     */
/* 作  者:pcwebmaste                                                       */
/* 函  数:                                                                 */
/*         LCD12864_init                                                    */
/*         LCD12864WriteCommand                                             */
/*         LCD12864WriteByte                                                */
/*         LCD12864_init                                                    */
/*         LCD12864SetXY                                                    */
/*         LCD12864PrintfString                                             */
/* 历史记录:                                                               */
/*  pcwebmaste          2008-07-10     Creat Inital version. (Version 1.0)  */
/*    模块化 2012-06-02     Creat Inital version. (Version 2.0) */
/**********************************************************/
#include "12864.h"
 
#define LOW         0
#define HIGH        1
 
sbit wela    =  P2^6;
sbit dula    =  P2^7;
#define LCD12864_RS(x)     {if((x))P3 |=  1<                            else   P3 &=~(1< 
#define LCD12864_RW(x)     {if((x))P3 |=  1<                            else   P3 &=~(1< 
#define LCD12864_EN(x)     {if((x))P3 |=  1<                            else   P3 &=~(1< 
#define LCD12864_MD(x)     {if((x))P3 |=  1<                            else   P3 &=~(1< 
#define LCDWELA(x)     {if((x))P2 |=  1<<6; else   P2 &=~(1<<6);}
 
#define LCDDULA(x)     {if((x))P2 |=  1<<7; else   P2 &=~(1<<7);}
 
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
 
/*********************************************/
/*            */
/* 主程序                   */
/*                                           */
/*********************************************
void  main()
{
 DelayNOP();                 //延时
    wela=LOW;
 dula=LOW;
    LCD12864_init();            //初始化LCD           
 
 LCD12864PrintfString(0,1,dis1);
 LCD12864PrintfString(1,0,dis2);
 LCD12864PrintfString(2,0,dis3);
 LCD12864PrintfString(3,1,dis4);
    while(1);
}
/********************************************
*函数名称:LCD12864_init
*输    入:无
*输    出:lcd_busy    为1时,忙,等待。
    lcd-busy    为0时,闲,可写指令与数据
*说    明:LCD12864LCD检查忙状态
/*******************************************/
bit LCD1286_busy()
 {                        
    bit result;
    LCD12864_RS(LOW);
    LCD12864_RW(HIGH);
    LCD12864_EN(HIGH);
    DelayNOP();
    result = (bit)(LCD12864_PORT&0x80);
    LCD12864_EN(LOW);
    return(result);
 }
/********************************************
*函数名称:LCD12864WriteCommand
*输    入:ucCmd 要写入的命令
*输    出:无
*说    明:LCD12864 写命令
    RS=L,RW=L,E=高脉冲,D0-D7=指令码。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd)
{                        
   while(LCD1286_busy());
    LCD12864_RS(LOW);
    LCD12864_RW(LOW);
    LCD12864_EN(LOW);
    _nop_();
    _nop_();
    LCD12864_PORT = ucCmd;
    DelayNOP();
    LCD12864_EN(HIGH);
    DelayNOP();
    LCD12864_EN(LOW);
}
 
/********************************************
*函数名称:LCD12864WriteByte
*输    入:ucByte 要写入的字节
*输    出:无
*说    明:LCD12864 写字节
    RS=H,RW=L,E=高脉冲,D0-D7=数据。
********************************************/
void LCD12864WriteByte(unsigned char ucByte)
{                        
   while(LCD1286_busy());
    LCD12864_RS(HIGH);
    LCD12864_RW(LOW);
    LCD12864_EN(LOW);
    LCD12864_PORT = ucByte;
    DelayNOP();
    LCD12864_EN(HIGH);
    DelayNOP();
    LCD12864_EN(LOW);
}
/********************************************
*函数名称:LCD12864_init
*输    入:无
*输    出:无
*说    明:LCD12864LCD初始化设定
/*******************************************/
void LCD12864_init()
{
    LCD12864_MD(HIGH);            //并口方式  
    LCD12864WriteCommand(0x34);      //扩充指令操作
    LCD12864WriteCommand(0x30);      //基本指令操作
    LCD12864WriteCommand(0x0C);      //显示开,关光标
    LCD12864WriteCommand(0x01);      //清除LCD的显示内容
}
/********************************************
*函数名称:LCD12864SetXY
*输    入:x 横坐标 y 纵坐标
*输    出:无
*说    明:LCD12864 设置坐标
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y)
{                        
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   LCD12864WriteCommand(X+Y);     //显示地址
}
/********************************************
*函数名称:LCD12864SetXY
*输    入:x 横坐标 y 纵坐标
*输    出:无
*说    明:LCD12864 设置坐标
为什么这样写不行呢?
********************************************
void LCD12864SetXY(unsigned char x,unsigned char y)
{
   switch(y)
     {
  case 1:
        {
             LCD12864WriteCommand(0x80+x);
        }
        break;
 
  case 2:
        {
             LCD12864WriteCommand(0x90+x);
        }
        break;
 
  case 3:
        {
             LCD12864WriteCommand(0x88+x);
        }
        break;
 
  case 4:
        {
             LCD12864WriteCommand(0x98+x);
        }
        break;
 
  default:break;
     }
//  LCD12864WriteCommand(x+y);     //显示地址
}
/********************************************
*函数名称:LCD12864PrintfString
*输    入:x 横坐标 y 纵坐标 s字符串
*输    出:无
*说    明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s)
{
  LCD12864SetXY(x,y);    //设置显示坐标
 
     while(s && *s)
     {
        LCD12864WriteByte(*s);   //显示逐个字符
        s++;      
     }
}
 
 
 
/**********************************************************/
/*                                                                          */
/*                Copyright (c) 2012, pcwebmaster                           */
/*                     All rights reserved.                                 */
/*                                                                          */
/*      Email:pcwebmaste@163.com                                            */
/*                                                                          */
/***********************************************************/
/***********************************************************/
/* 文件名:LCD12864.c                                                       */
/* 版  本:Version 1.0                                                      */
/* 描  述:实现液晶和单片机的通讯协议,根据计算机发给的命令进行人机交互     */
/* 作  者:pcwebmaste                                                       */
/* 函  数:                                                                 */
/*         LCD12864_init                                                    */
/*         LCD12864WriteCommand                                             */
/*         LCD12864WriteByte                                                */
/*         LCD12864_init                                                    */
/*         LCD12864SetXY                                                    */
/*         LCD12864PrintfString                                             */
/* 历史记录:                                                               */
/*  pcwebmaste          2008-07-10     Creat Inital version. (Version 1.0)  */
/*    模块化 2012-06-02     Creat Inital version. (Version 2.0) */
/**************************************************************/
 
#ifndef __12864_H__
#define __12864_H__
 
#include
#include
 
#define LCD12864_PORT  P0  //数据口
#define LCD12864_RS_PIN   5
#define LCD12864_RW_PIN   6
#define LCD12864_EN_PIN   4
#define LCD12864_MD_PIN   7
 
unsigned char code dis1[] = {"中国昌乐是宝石"};
unsigned char code dis2[] = {"之都,西瓜之乡!"};
unsigned char code dis3[] = {"中国昌乐宝石城"};
unsigned char code dis4[] = {"人民欢迎您!"};
/********************************************
*函数名称:LCD12864_init
*输    入:无
*输    出:lcd_busy    为1时,忙,等待。
    lcd-busy    为0时,闲,可写指令与数据
*说    明:LCD12864LCD检查忙状态
/*******************************************/
bit LCD1286_busy();
/********************************************
*函数名称:LCD12864WriteCommand
*输    入:ucCmd 要写入的命令
*输    出:无
*说    明:LCD12864 写命令
    RS=L,RW=L,E=高脉冲,D0-D7=指令码。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd);
 
/********************************************
*函数名称:LCD12864WriteByte
*输    入:ucByte 要写入的字节
*输    出:无
*说    明:LCD12864 写字节
    RS=H,RW=L,E=高脉冲,D0-D7=数据。
********************************************/
void LCD12864WriteByte(unsigned char ucByte);
/********************************************
*函数名称:LCD12864_init
*输    入:无
*输    出:无
*说    明:LCD12864LCD初始化设定
/*******************************************/
void LCD12864_init();
/********************************************
*函数名称:LCD12864SetXY
*输    入:x 横坐标 y 纵坐标
*输    出:无
*说    明:LCD12864 设置坐标
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y);
/********************************************
*函数名称:LCD12864PrintfString
*输    入:x 横坐标 y 纵坐标 s字符串
*输    出:无
*说    明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s);
 
void LCD12864PrintfData(unsigned char x,unsigned char y,unsigned char DData);
/********************************************
*函数名称:LCD12864PrintfNum
*输    入:add ge shi bai
*输    出:无
*说    明:此函数不好写成通用函数,在连续地址里
   连续写数字半角显示。根据情况修改
********************************************/
void LCD12864PrintfNum(unsigned char add,unsigned char ge,unsigned char shi,unsigned char bai)
{
 LCD12864WriteCommand(add);
 LCD12864WriteByte(bai+0x30);
 LCD12864WriteByte(shi+0x30);
 LCD12864WriteByte(ge+0x30);
}
 
 
#endif

关键字:LCD1286  4驱动程序  51单片机 引用地址:LCD12864驱动程序-51单片机

上一篇:基于单片机控制的智能晾衣架控制系统的设计
下一篇:51通讯协议—和校验

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

MCS-51单片机指令系统速记法
汇编语言指令由操作码、操作数两部分组成。MCS-51使用汇编语言指令,共有111条指令,44个操作码助记符,33种功能,其操作数形式有 #data、direct、Rn、@Ri 等。 一、助记符号的记忆方法 1表格列举法 把44个指令助记符按功能分为五类,每类列表记忆。 2英文还原法 单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉语有助于理解其助记符含义,从而加强记忆。例如: 增量 INC-Incremect  减量 DNC-Decrement 短转移 SJMP-Short jump  长转移 LJMP-Long jump 比较转移 CJNE-Compare jump not equali
[单片机]
51单片机实验8:led点阵(1):点亮一个点
开发板led点阵模块电路图如下: 74HC595:74HC595是一个8位串行输入、并行输出的位移缓存器。芯片第11角为数据输入时钟线,上升沿有效。芯片第12脚为输出存储器锁存时钟线,上升沿有效。芯片第13脚为输出有效(低电平)。芯片第14脚为串行数据输入。 为表示出输入74HC595的8位二进制数,开发板加入了led模块(图一中绿色所示)。若要使led发光,则需将JP595接vcc。 OE为输出有效控制端,低电平有效,所以务必将JOE短接片短接到GND端。 _nop_();函数为延时一个机器周期,所对应头文件为intrins.h #include reg52.h #include intrins.h #
[单片机]
<font color='red'>51单片机</font>实验8:led点阵(1):点亮一个点
51单片机的一些开发实用技巧
一.C语言中嵌入汇编语言 单片机开发中,通常我们使用C语言编写主程序,这样可以充分借助C语言工具提供的运算库函数及强大的数据处理能力。但C语言的可控性不及汇编语言,在有些对时序要求严格的处理上,我们还需用灵活性更强的汇编语言来编写。上海AVR单片机培训这样就产生了C语言和汇编语言混合编程的问题,一般分成三种方式:1.汇编语言调用C语言函数;2. C语言调用汇编语言;3. C语言中嵌入汇编语言。这里我们主要介绍第3种,即C语言中嵌入汇编语言。 下面的一段程序是主程序调用精确的205μS延时子程序并使P1.0交替输出高、低电平的方波。 /*------------程序名test.c------------*/ #include P
[单片机]
<font color='red'>51单片机</font>的一些开发实用技巧
51单片机I2C总线协议的实现
//-----------------------函数声明,变量定义------------------------------------------------------- #include reg51.h #include intrins.h sbit SDA=P1^0; // 将p1.0口模拟数据口 sbit SCL=P1^1; // 将p1.1口模拟时钟口 #define NUM 10 // 接收和发送缓存区的深度 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; unsigned char idata sendbuf ; // 数据发送缓冲区
[单片机]
51单片机实现两片联级74HC595多任务并行处理两路跑马灯
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200528 ---- @ModifiedTime: 20200528
[单片机]
<font color='red'>51单片机</font>实现两片联级74HC595多任务并行处理两路跑马灯
如何使用8051单片机控制双向直流电机
如何将直流电机连接到8051单片机?在本文中,主要有8051单片机+DC电机系统两个部分。首先是带有控制电机所需程序的8051单片机,其次是合适的驱动电路。 大多数直流电机的功率要求远远超出了单片机的范围,而且在反转旋转方向时产生的电压尖峰更容易损坏单片机。因此将直流电机直接连接到单片机是不明智的,完美的解决方案是在单片机和直流电机之间使用电机驱动电路。 一、L293电机驱动芯片 L293是一款专用的H桥电机驱动器IC,采用16引脚封装。L293的电流容量为600mA/通道,电源电压范围为4.5至36VDC。它们配有内部高速钳位二极管,用于电感尖峰保护。L293的其他优点包括高抗噪性、内部ESD保护、热关断、每个通道的独立
[单片机]
如何使用80<font color='red'>51单片机</font>控制双向直流电机
51单片机驱动OLED
51单片机源程序如下: #include reg52.h #include function.h #include word_lib.h #define X_WIDTH 128 //显示屏每行的显示点数 #define Y_WIDTH 64 //显示屏每列的显示点数 /************************************************************************************* 以下为设置控制OLED的端口,D0、D1、RST、DC依次对应OLED的CK、DI、RST、DC *******************************
[单片机]
51单片机通用汇编延时子程序
[DELY]:通用延时子程序 [地址]:7FEBH - FFEBH [功能]:延时 [入口]:延时常数放在 R2 寄存器中。时间常数 N(十六进制)所对应的延时时间(6MZH 晶振时)见下表: [出口]:R2=0 [占用寄存器]:R2 [调用]:无 例:延时1 秒子程序 MOV R2,#18H LCALL 7FEBH RET ORG 7FEBH ;通用延时子程序(07EBH & 0FEBH & ...) L7FEB: PUSH 02H ;R2(复位后R2即为 02H)存放时间常数,进栈保护 L7FED: PUSH 02H ; R2 进栈保护 L7FEF: PUSH
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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