1602左右滚动显示

发布者:BlissfulHeart最新更新时间:2016-11-24 来源: eefocus关键字:左右滚动显示 手机看文章 扫描二维码
随时随地手机看文章

//////////////////左右滚动显示/////////////////////

C51  8051
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit rs=P2^0; 
sbit rw=P2^1;
sbit e=P2^2;
uchar key_val;
uchar code dis0[]={"Take time to yell English,it will build your confidence and enhance your personal power.  "};
void delayms(uchar ms)
{       // 延时子程序
 uchar i,j;
 for(;ms>0;ms--)
  for(i=6;i>0;i--)
   for(j=82;j>0;j--);
}
bit lcd_bz()
{       // 测试LCD忙碌状态
 bit result;
 rs=0;
 rw=1;
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result=(bit)(P0&0x80);
 e=0;
 return result; 
}

void lcd_w_cmd(uchar cmd)
{       // 写入指令数据到LCD
 while(lcd_bz());
 rs=0;
 rw=0;
 e=0;
 _nop_();
 _nop_(); 
 P0=cmd;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=0;  
}

void lcd_pos(uchar pos)
{       //设定显示位置
 lcd_w_cmd(pos|0x80);
}

void lcd_w_dat(uchar dat) 
{       //写入字符显示数据到LCD
 while(lcd_bz());
 rs=1;
 rw=0;
 e=0;
 P0=dat;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=0; 
}

void lcd_init()
{       //LCD初始化设定
 lcd_w_cmd(0x38);   //
 delayms(1);
 lcd_w_cmd(0x0c);   //
 delayms(1);
 lcd_w_cmd(0x06);   //
 delayms(1);
 lcd_w_cmd(0x01);   //清除LCD的显示内容
 delayms(1);
}
void lcd_disp(uchar x,uchar y,uchar *str)
{
 if(y==0) //Y=0为第一行, *STR为所显示字符串
 {
  if(x<16) //16为字符长度, x表示起启位置
  {
   lcd_pos(x);
   for(;x<16&&*str!='\0';x++)
   {
    lcd_w_dat(*(str++));
   }
   
      }
   }
 if(y==1) //Y=0为第一行, *STR为所显示字符串
 {
  if(x<16) //16为字符长度, x表示起启位置
  {
   lcd_pos(0x40+x);
   for(;x<16&&*str!='\0';x++)
   {
    lcd_w_dat(*(str++));
   }
   
      }
   }   
}

void main()
{  
 uchar *cp;
 cp=dis0;
 lcd_init();    // 初始化LCD   
 delayms(10);
 while(1)
 {
  lcd_w_cmd(0x01);  // clear screen
  delayms(2);
  lcd_disp(0,0,cp);
  delayms(200);
  cp++;
  if(*cp=='\0')
  {
   cp=dis0;
  }
 }
}
  **************************************************************/////
/**************************************LCD1602头文件*********************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_

//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06   //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04   //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05   //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04   //数据读、写操作,画面不动
#define LCD_GO_HOME               0x02   //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C         //显示开
#define LCD_DISPLAY_OFF           0x08         //显示关
#define LCD_CURSOR_ON             0x0A         //光标显示
#define LCD_CURSOR_OFF            0x08         //光标不显示
#define LCD_CURSOR_BLINK_ON       0x09         //光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08         //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18         //LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C         //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10         //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14         //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38         //两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30         //单行显示
#define LCD_CLEAR_SCREEN  0X01   //清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD    0x80   // 第一行DDRAM起始地址 
#define LINE2_HEAD    0xc0   //  第二行DDRAM起始地址
#define LINE1         0      //第一行
#define LINE2         1      //第二行
#define LINE_LENGTH   16     //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************/

#define LCDIO     P2         //定义P2口与LCD1602的数据口相接
  sbit   LCD_RS=P1^4;         
  sbit   LCD_RW=P1^3;         
  sbit   LCD_EN=P1^2;
  sbit  LCD_BUSY=LCDIO^7;
 /**********************另外相关的定*********************************/
 #define HIGH               1
 #define LOW                0   
 #define TURE               1
 #define  FALSE             0
 #define  uchar unsigned char
 #define  uint  unsigned int
 
 /*************************以下是函数的申明部*************************/
 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
 /******************************************************************
 
/#include
#include "LCD1602.h"
/*******************主函数**********************************/
uchar string[]="     I LOVE YOU! ";            //这里是要显示的字符
void main(void)
{
 uchar *cp;
 cp=string;
 LCD_init();
 while(1)
 {
  LCD_send_command(LCD_CLEAR_SCREEN);
  delay_ms(2);
  LCD_disp_string(0,1,cp);
  delay_ms(100);
         cp++;
  if(*cp=='\0')
  {
   cp=string;                 //到达字符的尾部时,改变指针,重新指向字符串的头部
  }
 }
}
/*********************************************************/
/**************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状态,看它是不是还在忙呢
{
 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写数据**************************/
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  {
   LCD_send_command(LINE1_HEAD+x);
   for(;x   {
    LCD_send_data(*(Data++));
   }
   if(*Data!='\0')
   {
    x=0;
    y=LINE2;
   }
  }
 }
 if(y==LINE2)
 {
  LCD_send_command(LINE2_HEAD+x);
  for(;x  {
   LCD_send_data(*(Data++));
  }
 }
}
/****************************************************************/
/********************延时函数***********************************/
  
/***************************************************************/
void delay_ms(uint n)
{
 uint i,j;
 for(i=n;i>0;i--)
    for(j=0;j<1140;j++)
    ;
}
/*********************************************************************/ 


关键字:左右滚动显示 引用地址:1602左右滚动显示

上一篇:C51按键识别,等待释放
下一篇:最简单的4*4矩阵键盘程序 c51

推荐阅读最新更新时间:2024-03-16 15:22

单片机控制LCD1602显示字符(测试通过)
本次测试的是常用 LCD1602 显示屏,操作流程很简单,但有些小问题要注意,如该LCD处理速度有些慢,单片机在发送控制指令时需要适当延时,否则可能操作失败。 一、硬件简介 1 引脚介绍 具体引脚如下: 单片机需要操作的引脚有:RS、RW、E及DB0~7 2 指令介绍 在这里,仅仅介绍下什么是CGRAM、什么是DDRAM? CGRAM:是用户自定义字符存放存储器,可以自己在指定地址定义字符 DDRAM:是对应屏幕位置的存储器,设定了该地址,就确定了从屏幕什么位置开始显示字符 二、软件部分 #include #include #define DATA P0
[单片机]
pic16f877双机通信lcd1602液晶显示
/************************************************************************************************* * 文 件 名:485c.c * 功 能:485从机通信模块 * 硬件条件: 1.CPU型号:P IC 16F877 * 2. 晶振 :2M *************************************************************************************************/ //-----------------------函数声明,变量定义--------------
[单片机]
单片机:矩阵键盘和LCD1602
一、矩阵键盘 1、检测按键的方法: (1)先使1-4全部赋低电平,5-8赋高电平。当有按键按下时,5-8中会有某个点平被拉低。 (2)然后依次将1-4中的某一位置0,其他位置1,观察对应返回值,即可确定哪个按键被按下。 2、对应程序 unsigned char bsp_mkeyscan() { unsigned char keyvalue = 0x99; KEYPORT = 0xF0; if (KEYPORT != 0xF0) { KEYPORT = 0xFE; if (KEYPORT != 0xFE) { keyvalue = KEYPORT; while(keyvalue
[单片机]
PIC单片机LCD1602显示单个A字程序
P IC 单片机 LCD 1602显示单个A字程序 STATUS EQU 3H ;定义状态寄存器地址 PORTA EQU 5H ;定义RA口数据寄存器地址 PORTC EQU 7H ;定义RC口数据寄存器地 PORTD EQU 8H ;定义RD口数据寄存器地址 TR ISA EQU 85H ;定义RA口方向控制寄存器地址 TRISC EQU 87H ;定义RC口方向控制寄存器地址 TRISD EQU 88H ;定义RD口方向控制寄存器地址 ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址 ;******************** Z EQU 2 ;定义0
[单片机]
89C52单片机通过LCD1602显示任意长度字符串
1,开发板:89C52RC开发板。 2,开发环境:Keil uv4 打算通过89C52在LCD1602上面显示任意长度的字符串,因为该显示屏只能显示两行,每行只能显示16个英文字符,所以打算写个函数,实现在需要显示超过16个字符的时候,能够从液晶屏右边向左边移动显示文字,网上好像没有相关资料,于是只能自力更生,调试了几个小时,终于搞定了 void main() { uchar i; P0 = 0; P1 = 0; lcd_init(); lcd_clear(); while(1) { lcd_clear(); lcd_write_string(6, 0, 123456789abcdefghijklmn
[单片机]
89C52单片机通过LCD<font color='red'>1602</font><font color='red'>显示</font>任意长度字符串
51单片机采用ADC0808检测ADC_LCD1602显示
系统整体设计 1)本设计的控制器采用51单片机 2)ADC0808采集光敏电阻的分压 光照强度越弱,被点亮的LED数目越多,当弱到一定阈值的时候 Speaker报警 3)LCD1602显示当前电压值 具体实现如下代码 #include reg51.h #include stdio.h #define uchar unsigned char #define uint unsigned int #define DATA_PORT P0 #define OPEN 0 #define CLOSE 1 volatile uchar Speaker_Alarm = 0; uchar Flag_2s = 0; //---------
[单片机]
51单片机采用ADC0808检测ADC_LCD<font color='red'>1602</font><font color='red'>显示</font>
Atmega16的1602液晶使用
#include avr/io.h #include util/delay.h #include 1602.h uchar L = L I Miss You ; void display()//显示函数 { write_com(0x80); show_string(L);//显示字符串 } void init()//初始化函数 { DDRC=0xff;//全部设置为输出 DDRA|=(1 7)|(1 6);//设置PA口的第6位(1602的rs控制脚)和第7位(1602的en控制脚)为输出 init_1602();//1602液晶初始化 } int main() { init(); display(); wh
[单片机]
基于atmega的LCD1602驱动(8线/4线)
//************************************************* // 文件名: 1602.h // 作用: AVR的LCD1602 4/8线驱动 // 说明: 使用GCC编程,1602提供4/8线驱动 // 4线暂时高4位 //*************************************************/ #ifndef __1602_H_ #define __1602_H_ 1 //***头文件调用***// #include avr/io.h #include util/delay.h #include avr/portpins.h #include compat
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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