萬用電路板

----纯属爱好,谁与共鸣

« 【图】看看电赛中的两件获得“TI杯”的作品MSP430F149的ADC模块测试成功! »

【图】LCD1602液晶显示程序

/***********************************************
程序名称:1602液晶显示程序
简要说明:使用FM1602液晶显示器,数据口接P0口,控制端接P2.0-P2.2
寄存器选择信号端RS-P2.0、读写信号端R/W-P2.1、使能信号端EP-P2.2
编    写:JiangX.net
***********************************************/
#include <reg51.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;

sbit rs = P2^0;  //RS
sbit rw = P2^1;  //读写选择RW
sbit ep = P2^2;  //使能信号E

BYTE code dis1[] = {"Welcome!"};
BYTE code dis2[] = {"www.JiangX.net"};

/*****延时子程序*****/
void delay(BYTE ms)
{
 BYTE i;
 while(ms--)
 {
  for(i = 0; i< 125; i++);
 }
}

/*****判别LCD忙碌状态*****/
BOOL lcd_bz()
{
 BOOL result;
 rs = 0;
 rw = 1;
 ep = 1;
 result = (BOOL)(P0 & 0x80);
 ep = 0;
 return result; 
}
/*****写入指令数据到LCD*****/
void lcd_wcmd(BYTE cmd)
{
 while(lcd_bz());
 rs = 0;
 rw = 0;
 ep = 0; 
 P0 = cmd;
 ep = 1;
 ep = 0;  
}

/*****设定显示位置*****/
void lcd_start(BYTE start)
{       
 lcd_wcmd(start | 0x80);
}

/*****写入字符显示数据到LCD*****/
void lcd_data(BYTE dat) 
{       
 while(lcd_bz());
 rs = 1;
 rw = 0;
 ep = 0;
 P0 = dat;
 ep = 1;
 ep = 0; 
}

/*****LCD初始化设定*****/
void lcd_init()

    delay(15);      
 lcd_wcmd(0x38);   //设定LCD为16*2显示,5*7点阵,8位数据接口
 delay(2);
 lcd_wcmd(0x0c);   //开显示,不显示光标
 delay(2);
 lcd_wcmd(0x06);   //显示光标自动右移,整屏不移动
 delay(2);
 lcd_wcmd(0x01);   //显示清屏
 delay(2);
}

/*****主函数*****/
void main()
{
 BYTE i;
 lcd_init();   // 初始化LCD   
 delay(20);
 lcd_start(4);   // 设置显示位置为第一行的第5个字符
 i = 0;
 while(dis1[i] != '\0')
 {    // 显示第一行字符
  lcd_data(dis1[i]);
  i++;
 }
 lcd_start(0x41);  // 设置显示位置为第二行第一个字符
 i = 0;
 while(dis2[i] != '\0')
 {
  lcd_data(dis2[i]); // 显示第二行字符
  i++;
 }
 while(1);
}

程序演示效果如下:

本站原创如转载,请注明:转载自萬用電路板 [ http://www.jiangx.net/ ]

  • quote 4.xiaomu
  • to jiangxiao
    这个程序P0口是不是要接上拉电阻啊?我现在P0口没有上拉电阻,1602现在背光灯一直亮,但没有字符显示

    昨晚搞到一点,哈哈看到请回复
  • 2010-7-21 13:30:18 回复该留言
  • quote 2.susfly
  • 最高位?
    jiangx 于 2008-10-15 23:04:58 回复
    当状态字最高位为1时,表示LCM内部芯片正处于忙碌状态;每次写入指令或数据之前确保该位为0。
    在要求和速度不高的时候可以不检测忙信号,只需要在每次进行读写操作后进行一小段延时跳过LCM忙碌的时间便OK。

    由 jiangx 于 2008-10-15 23:36:55 最后编辑
    由 jiangx 于 2008-10-15 23:37:53 最后编辑
    susfly 于 2008-10-19 22:18:00 回复
    哦,我的那个1602开始怎么都不显示,检测了单片机引脚的电平都是对的,电路也没有问题,但就是只有背光灯亮着,什么都不显示,开始还以为是一直处于忙状态,后面才知道要接了个10K的电位器,进行对比度调节,才出现了字符,好兴奋~~
  • 2008-10-15 15:47:06 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

赞助商广告

最近发表

热文排行

最新评论及回复

广告

图标汇集

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2011 JiangX.com 萬用電路板 All Rights Reserved.
鄂ICP备08003060号 [login]