这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » wdy3585MCU DIY进程帖--LCD1602

共2条 1/1 1 跳转至

wdy3585MCU DIY进程帖--LCD1602

助工
2011-12-22 11:05:02     打赏

 LCD1602 上显示的内容:
                   ----MCU--DIY----
                    ------EEPW------

以下时程序代码:
---------------------------------LCD1602.H--------------------------------------------

#ifndef _LCD1602_H_
#define _LCD1602_H_

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int


#define issame 0   //单片机的数据口和LCD的数据口一致
#define nosame 1   //单片机的数据口和LCD的数据口不一致

#define inputway issame//不一致

#define LCDDATA P0
sbit RS=P2^4;
sbit RW=P2^5;
sbit CS=P2^6;

/*#define LCDDATA P2
sbit RS=P1^2;
sbit RW=P1^1;
sbit CS=P1^0;*/
//函数声明
void Delay_xms(uint x);                          //ms延时函数
void Delay_xus(uint t);                          //us延时函数
uchar change(uchar dat);
void LCD_en_write(void);                         //控制LCD写时序
void Write_Instruction(uchar command);           //写指令函数
void Write_Data(uchar Wdata);                    //写数据函数
void LCD_SET_XY(uchar X,uchar Y);                //字符显示初始地址设置
void LCD_write_str(uchar X,uchar Y,uchar *s);    //字符串显示函数
void LCD_write_char(uchar X,uchar Y,uchar Wdata);//单个字符显示函数
void LCD_clear(void);                            //清屏函数
void LCD_init(void);

#endif
-----------------------------------LCD1602.C--------------------------------------------------

#include "LCD1602.h"
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:晶振为12M
void Delay_xms(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<112;j++);
}
//功能:12us延时
void Delay_xus(uint t)        
{  
  for(;t>0;t--)
   {
  _nop_();
   }
}
//颠倒数据
uchar change(uchar dat)
{
 uchar d1,d2;
 uchar i;
 d1=dat;
 for(i=0;i<8;i++)
 {
   d2<<=1;
   d2|=(d1&0x01);
   d1>>=1;
 }
 return d2;
}
//控制LCD写时序
void LCD_en_write(void)      
{
    CS=1;   
    Delay_xus(20);
    CS=0;   
 Delay_xus(20);
}

//写指令函数
void Write_Instruction(uchar command)
{
  RS=0;
  RW=0;
  CS=1;
  #if inputway==issame
       LCDDATA=command;
  #else
      LCDDATA=change(command);
  #endif
  LCD_en_write();//写入指令数据
}

//写数据函数
void Write_Data(uchar Wdata)
{
  RS=1;
  RW=0;
  CS=1;
  #if inputway==issame
       LCDDATA=Wdata;
  #else
      LCDDATA=change(Wdata);
  #endif
  LCD_en_write();//写入数据
}

//字符显示初始地址设置
void LCD_SET_XY(uchar X,uchar Y)
{
  uchar address;
  if(Y==0)
    address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80
  else
    address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0xC0
  Write_Instruction(address);//写指令,设置显示初始地址
}

//在第X行Y列开始显示,指针*S所指向的字符串
void LCD_write_str(uchar X,uchar Y,uchar *s)
{
  LCD_SET_XY(X,Y);//设置初始字符显示地址
  while(*s)//逐次写入显示字符,直到最后一个字符"/0"
  {
    Write_Data(*s);//写入当前字符并显示
 s++;//地址指针加1,指向下一个待写字符
  }
}

//在第X行Y列开始显示Wdata所对应的单个字符
void LCD_write_char(uchar X,uchar Y,uchar Wdata)
{
  LCD_SET_XY(X,Y);//写地址
  Write_Data(Wdata);//写入当前字符并显示
}
//清屏函数
void LCD_clear(void)
{
  Write_Instruction(0x01);
  Delay_xms(5);
}
//显示屏初始化函数
void LCD_init(void)

 Write_Instruction(0x38);    //8bit interface,2line,5*7dots
 Delay_xms(5);
 Write_Instruction(0x38); 
 Delay_xms(5);
 Write_Instruction(0x38); 

 Write_Instruction(0x08); //关显示,不显光标,光标不闪烁
 Write_Instruction(0x01); //清屏
 Delay_xms(5);
 
 Write_Instruction(0x04); //写一字符,整屏显示不移动
 //Write_Instruction(0x05); //写一字符,整屏右移
 //Write_Instruction(0x06); //写一字符,整屏显示不移动
 //Write_Instruction(0x07); //写一字符,整屏左移
 Delay_xms(5);
 
 //Write_Instruction(0x0B); //关闭显示(不显示字符,只有背光亮)
 Write_Instruction(0x0C); //开显示,光标、闪烁都关闭
 //Write_Instruction(0x0D); //开显示,不显示光标,但光标闪烁
 //Write_Instruction(0x0E); //开显示,显示光标,但光标不闪烁
 //Write_Instruction(0x0F); //开显示,光标、闪烁均显示
}
-----------------------------------main.c-----------------------------------------
#include "reg52.h"
#include "LCD1602.h"

int main(void)
{
  LCD_init();
  LCD_clear();
  LCD_write_str(0,0,"----MCU--DIY----");
  LCD_write_str(0,1,"------EEPW------");
  while(1);
  return 0;
}




关键词: wdy3585MCU     进程     --LCD1602         

菜鸟
2012-01-28 14:35:29     打赏
2楼

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]