找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4501|回復(fù): 0
收起左側(cè)

51單片機(jī) 1602從右到左移動顯示字符實驗

[復(fù)制鏈接]
ID:318620 發(fā)表于 2018-7-30 17:31 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include "LCD1602.h"
/*******************主函數(shù)**********************************/
uchar string[]=" I LOVE YOU! C51 ";            //這里是要顯示的字符
void main(void)
{
uchar *cp;
cp=string;
LCD_init();
while(1)
{
  LCD_send_command(LCD_CLEAR_SCREEN);
  delay_ms(2);
  LCD_disp_string(0,0,cp);
  delay_ms(100);
         cp++;
  if(*cp=='\0')
  {
   cp=string;                 //到達(dá)字符的尾部時,改變指針,重新指向字符串的頭部
  }
}
}
/*********************************************************/
/**************LCD1602的初始化***************************/
void LCD_init(void)
{
LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
LCD_send_command(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_send_command(LCD_CLEAR_SCREEN);
}
/********************************************************/

void LCD_check_busy(void)   //檢測LCD狀態(tài),看它是不是還在忙呢
{
do
  {
   LCD_EN=0;
   LCD_RS=0;
   LCD_RW=1;
   LCDIO=0xff;
   LCD_EN=1;
   }
   while(LCD_BUSY==1);

    LCD_EN=0;
}
/************LCD1602寫命令*******************************/
void LCD_send_command(uchar command)
{
LCD_check_busy();
LCD_RS=LOW;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=command;
LCD_EN=LOW;
}
/********************************************************/
/*****************LCD1602寫數(shù)據(jù)**************************/
void LCD_send_data(uchar dat)
{
LCD_check_busy();
LCD_RS=HIGH;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=dat;
LCD_EN=LOW;
}
/********************************************************
void LCD_write_char(uchar x,uchar y,uchar dat)
{
     unsigned char address;
     if (y == LINE1)
         address = LINE1_HEAD + x;
     else
        address = LINE2_HEAD + x;
     LCD_send_command(address);
    LCD_send_data(dat);
}
******************LCD1602顯示字符串*********************/
void LCD_disp_string(uchar x,uchar y,uchar *Data)
{
if(y==LINE1)
{
  if(x<LINE_LENGTH)
  {
   LCD_send_command(LINE1_HEAD+x);
   for(;x<LINE_LENGTH&&*Data!='\0';x++)
   {
    LCD_send_data(*(Data++));
   }
   if(*Data!='\0')
   {
    x=0;
    y=LINE2;
   }
  }
}
if(y==LINE2)
{
  LCD_send_command(LINE2_HEAD+x);
  for(;x<LINE_LENGTH&&*Data!='\0';x++)
  {
   LCD_send_data(*(Data++));
  }
}
}
/****************************************************************/
/********************延時函數(shù)***********************************/

/***************************************************************/
void delay_ms(uint n)
{
uint i,j;
for(i=n;i>0;i--)
    for(j=0;j<1140;j++)
    ;
}
/*********************************************************************/



/**************************************LCD1602頭文件*********************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_

//輸入方式設(shè)置
#define LCD_AC_AUTO_INCREMENT     0x06   //數(shù)據(jù)讀、寫操作后,AC自動增一
#define LCD_AC_AUTO_DECREASE      0x04   //數(shù)據(jù)讀、寫操作后,AC自動減一
#define LCD_MOVE_ENABLE           0x05   //數(shù)據(jù)讀、寫操作,畫面平移
#define LCD_MOVE_DISENABLE        0x04   //數(shù)據(jù)讀、寫操作,畫面不動
#define LCD_GO_HOME               0x02   //AC=0,光標(biāo)、畫面回HOME位
//設(shè)置顯示、光標(biāo)及閃爍開、關(guān)
#define LCD_DISPLAY_ON            0x0C         //顯示開
#define LCD_DISPLAY_OFF           0x08         //顯示關(guān)
#define LCD_CURSOR_ON             0x0A         //光標(biāo)顯示
#define LCD_CURSOR_OFF            0x08         //光標(biāo)不顯示
#define LCD_CURSOR_BLINK_ON       0x09         //光標(biāo)閃爍
#define LCD_CURSOR_BLINK_OFF      0x08         //光標(biāo)不閃爍
//光標(biāo)、畫面移動,不影響DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD顯示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD顯示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光標(biāo)左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光標(biāo)右移一位
//工作方式設(shè)置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //兩行顯示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //單行顯示
#define LCD_CLEAR_SCREEN  0X01   //清屏
/***********************LCD1602地址相關(guān)******************************/
#define LINE1_HEAD    0x80   // 第一行DDRAM起始地址
#define LINE2_HEAD    0xc0   //  第二行DDRAM起始地址
#define LINE1         0      //第一行
#define LINE2         1      //第二行
#define LINE_LENGTH   16     //每行的最大字符長度
/***********************LCD1602接線引腳定義**************************/

#define LCDIO     P0         //定義P2口與LCD1602的數(shù)據(jù)口相接
  sbit   LCD_RS=P2^0;         
  sbit   LCD_RW=P2^1;         
  sbit   LCD_EN=P2^2;
  sbit  LCD_BUSY=LCDIO^7;
/**********************另外相關(guān)的定*********************************/
#define HIGH               1
#define LOW                0   
#define TURE               1
#define  FALSE             0
#define  uchar unsigned char
#define  uint  unsigned int

/*************************以下是函數(shù)的申明部*************************/
void LCD_init(void);                    //LCD1602初始化
void LCD_send_command(uchar command);   //
void LCD_send_data(uchar dat);
void LCD_write_char(uchar x,uchar y,uchar dat);
void LCD_disp_string(uchar x,uchar y,char *Data);
void delay_ms(uint n);
void LCD_check_busy(void);
#endif
/******************************************************************

1602從右到左移動顯示字符實驗.rar

15.33 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表