258963519的笔记 https://bbs.21ic.com/?487648 [收藏] [复制] [RSS]

日志

lcd1602c语言驱动程序

已有 2755 次阅读2007-7-13 21:33 |个人分类:51单片机|系统分类:单片机| 1602, 驱动程序, C语言, keilc51

前一段准备将1602的c语言驱动写出来 不过忙期末考试去了 今天才考完

写了一驱动传上来 现在功能比较简单 不足之处多指教

显示Hello everyone!!

        Welcome!

由于是在仿真下完成 不保证实际应用中的可靠性   有时间再讲一讲1602的显示原理及方法


/*1602驱动程序 **********************************************/
/*版本  V1.0     **********************************************/
/*2007-7-13     **********************************************/
/*吾人           **********************************************/

/*属个人原创 转载请注明出处!  谢谢*********************/

/*1602.h***************************/

#include <intrins.h>

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint  unsigned int
#endif

#define DATA  P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;
sbit BS=P0^7;

void read_busy()        //读忙标志或地址
{
 do
 {
  DATA=0xFF;
  RS=0;
  RW=1;
  E=0;
  _nop_();
  E=1;
 }while(BS);
}  

void data_oper(uchar dat)
{
 DATA=dat;
 RS=0;
 RW=0;
 E=0;
 read_busy();
 E=1;
}

void data_opers(uchar dat)
{
 DATA=dat;
 RS=1;
 RW=0;
 E=0;
 read_busy();
 E=1;
}

void clear_display(uchar dat)     //清显示  1 清除
{
 data_oper(dat); 
}

void cursor_back()        //光标返回
{
 data_oper(0x02);
}

void set_inmod(uchar id,uchar s)     //id 光标是否左移或右移   1右移 0 左移
{                                                               //s文字是否同光标一同移动 1是   0 否        
 data_oper(0x04|(id<<1)|s);
}

void display_sw(uchar d,uchar c,uchar b)     //显示开关控制
{                                                                             //d  整体开关控制   1 开  2 关
 data_oper(0x08|(d<<2)|(c<<1)|b);                //c  光标开关控制   1 开  2 关
}                                                                             //b  光标是否闪烁   1 是  2 否 

void curchar_move(uchar sc,uchar rl)            //sc 1 移动显示文字 0 移动显示光标
{                                                                           //rl 1 右移         0 左移
 data_oper(0x10|(sc<<3)|(rl<<2));
}

void set_function(uchar dl,uchar n,uchar f)  //dl 1 四位总线     0 八位总线
                                                                             //有些dl  1 八位总线  0  四位总线 现在做实验的就是
{                                                                            //n  1 双行显示     0 单行显示
 data_oper(0x20|(dl<<4)|(n<<3)|(f<<2));       //f  1 5*10显示     0 5*7 显示
}

void set_charaddr(uchar agg)                 //置字符发生器地址
{
 data_oper(0x40|agg);
}

void set_dataaddr(uchar add)                 //显示数据存储器地址
{
 data_oper(add|0x80);
}

void write_data(uchar dat)      //写显示数据
{
 data_opers(dat);
}

void c1602_print(uchar row ,char *p)   //显示函数  row显示起始地址  *p显示字符指针
{
 uchar a;
 set_dataaddr(row);
 while((*p)!='\0')
 {
  write_data(*p++);
  a++;
  if(((a+row)>=16)||((*p)=='\n'))
  {set_dataaddr(0x40);a=0;}
 }
}

 

/*main.c**************************************/

#include <reg51.h>
#include "1602.h"
#define uchar unsigned char
#define uint  unsigned int

void c1602_initial()
{
 clear_display(1);
 set_function(1,1,0);
 display_sw(1,0,0);
 clear_display(0);
}

void main()
{
 c1602_initial();
 c1602_print(0x00,"Hello everyone!!\nWelcome!");
 while(1);
}

 

 

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (3 个评论)

回复 182006 2007-10-26 11:21
好东东!
回复 lxxz2001@sohu 2008-12-23 08:58
当E端由高电平跳变成低电平时,液晶模块执行命令。 应该是: //写指令 E = 1; ReadBusy(); //判断是否允许进行读写操作 E = 0; 不是:E=0; read_busy(); E=1;
回复 613 2009-3-20 12:22
好东东