cmd控制屏幕光标_单片机 1602移屏幕

这篇博客介绍了如何使用C语言控制1602 LCD显示屏的光标,包括初始化屏幕、设置显示模式、清屏、移动光标以及显示字符串等操作。通过一系列函数实现屏幕的控制,例如`lcdwritecmd`和`lcdwritedata`,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

#include

#include

#define lcd1602_db P0

typedef unsigned int uint16;

sbit lcd1602_en=P2^4;

sbit lcd1602_rs=P2^5;

sbit lcd1602_rw=P2^6;

void delay(uint16 x_ms); //延迟  x_ms*1  毫秒

/*

LCD1602指令

显示模式设置指令

  DB7  DB6 DB5 DB4 DB3 DB2 DB1  DB0

0     0   1   DL  N   F   *    *

  DL=1;          8位数据接口气            DL=0; 4位数据接口

  N=1;           两行显示;                N=0;单行显示

  F=1;           5*10点阵字符             F=0.5*8点阵字符

*/

  #define lcd_mode_pin8  0x38  //8位数据口,两行,5*8点阵

  #define lcd_mode_pin4  0x28  //4位数据口,两行,5*8点阵

  #define lcd_screen_clr  0x01  //清屏幕

  #define lcd_cursor_rst  0x02  //光标复位

// 显示开关控制指令

 #define lcd_dis_cur_blk_on 0x0F  //显示开,光标开,光标闪烁

 #define lcd_dis_cur_on 0x0E  //显示开,光标开,光标不闪烁

 #define lcd_dis_on 0x0C  //显示开,光标关,光标不闪烁

 #define lcd_dis_off 0x08  //显示关,光标关,光标不闪烁

 //显示模式控制

  # define lcd_cursor_right 0x06   //光标右移,显示不移动

  # define lcd_cursor_left 0x04   //光标左移,显示不移动

  # define lcd_dis_mode_left 0x07   //操作后,AC自增,画面平移,

  # define lcd_dis_mode_right 0x05   //操作后,AC自减,画面平移,

//光标、显示移动指令

#define lcd_cur_move_left 0x10 //光标左移

#define lcd_cur_move_right 0x14 //光标左移

#define lcd_dis_move_left 0x18 //光标左移

#define lcd_dis_move_right 0x1C //光标左移

/*

         DDRAM   地址设置

      DB7   DB6   DB5   DB4    DB3      DB2     DB1      DB0

      1     A6     A5    A4     A3       A2      A1       A0

      N=0; 单行显示 A6  -  A0=00H-4FH

      N=1; 首行     A6  -  A0=00H-27H

         次行     A6  -  A0=40H-67H

     读BF /  AC 值(BF:BUSY FLAG)

           RS  R/W  DB7  DB6  DB5   DB4  DB3   DB2    DB1    DB0

            0    1    BF   A6   A5    A4   A3    A2     A1     A0  

           写数据

          RS  R/W  DB7   DB6   DB5   DB4    DB3    DB2    DB1    DB0

          1   0     A7    A6    A5    A4     A3     A2     A1     A0

写命令 

RS  R/W   DB7   DB6   DB5   DB4   DB3   DB2    DB1    DB0

0    0    A7    A6    A5    A4    A4    A3     A2     A1  

*/

void lcdreadbf()

{

unsigned char state;

unsigned char  i;

lcd1602_db=0xff;//i0口置1  做输入 

lcd1602_rs=0;

lcd1602_rw=1;

do

{

  lcd1602_en=1;

state=lcd1602_db;

lcd1602_en=0;

  i++;

if(i>50)

break;

}

while(state&0x80);

}

void lcdwritecmd(unsigned char cmd)

{

lcdreadbf();//等待忙检测 ,不忙时操作 

  lcd1602_rs=0;  

lcd1602_rw=0;

lcd1602_db=cmd;

lcd1602_en=1;

lcd1602_en=0;

}

void lcdwritedata(unsigned char dat)

{

lcdreadbf();           //等待忙检测 ,不忙时操作

  lcd1602_rs=1;   

lcd1602_rw=0;

lcd1602_db=dat;

lcd1602_en=1;

lcd1602_en=0;

}

void lcdinit()

{

   lcdwritecmd(lcd_mode_pin8); //显示模式设置 2行,5*8点阵

   lcdwritecmd(lcd_dis_on);     //显示开  光标关

lcdwritecmd(lcd_cursor_right);   //光标右移

   lcdwritecmd(lcd_screen_clr);    //清屏

}

void lcdshowstr(unsigned char x,unsigned char y,unsigned char *str)

{

   if(0==y)

{

lcdwritecmd(0x80|x); 

     }  

else

{

lcdwritecmd(0x80|0x40+x);

}

while(*str!='\0')

{

lcdwritedata(*str++);

}

}

void main()

{

unsigned  char i;

unsigned char str[]="  hello everybody ";

unsigned char str1[]="  123456789abcdefg";

  lcdinit();

//lcdwritecmd(lcd_dis_mode_left);

delay(30);

while(1)

{

lcdwritecmd(0x80);

for(i=0;i

{

lcdwritedata(str[i]);

}

lcdwritecmd(0xc0);

for(i=0;i

{

lcdwritedata(str1[i]);

}

  lcdwritecmd(0x18);

delay(65535);

}

}

void delay(uint16 x_ms) //延迟  x_ms*1  毫秒

{

   uint16 i,j;

for(i=x_ms;i>2;i--)

for(j=1;j>2;j--);

}

23788888145efbe14cca52b588d83fed.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值