视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
飞思卡尔单片机控制LCD1602程序范例
2025-10-02 13:51:14 责编:小OO
文档
飞思卡尔单片机控制LCD1602程序范例(2008-11-19 09:24:27)标签:杂谈 分类:电子科技 

  LCD1602是很常用的液晶显示屏。在网络上已经有不少应用于51等单片机的程序。这里用的是Freescale的MC9SDG128,已经成功显示。

  使用的是如下引脚的1602。以前用的是横排管脚的封装。而本次用的是这种管脚排列,可气的是,网上给资料竟然和Donald手头的这个模块不同,其中1脚是VDD,接+5V电源,2脚是VSS,接地。看了很多类似的模块,基本是和本人手里的模块一样,也就是说网上的资料基本是抄来抄去的,可以连试都没试过。

  另外的3到14脚的作用如下。

  第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。调程序时,别忘了适当调整电位器。在调试时,开始时老是显示不出来,经过各种检查程序,还是不行,最后没办法调了下电位器,发现已经显示在上面了,晕!

  第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

  第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

  第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

  第7~14脚:D0~D7为8位双向数据线。

  还有两个引脚没有引出来,他们是"A"和"K",为背光引脚,"A"接正,"K"接负便会点亮背光灯。

  这里,由于自己腐蚀的扩展板是单面板,需考虑最小系统板和引线方便。就让RS引脚接PORTE_BIT2,RW接的是PORTH的PTH0,E连接的是PTH2,并行数据口接的是PORTA。这些都在头文件中做了宏定义,可方便地应用于其它端口。

  因为16位MCU的I/O口通常不像51那样直接输入输出,其具有多种功能。所以在使用时要经常对其数据方向寄存器进行配置。为了方便,Donald做了如下定义:

  #define   LCDIO_DIR           DDRA

  #define   LCDIO_DIR_IN        0x00

  #define   LCDIO_DIR_OUT       0xFF

  这样,当需要变换端口数据传输方向时,只需用如下语句:

  LCDIO_DIR = LCDIO_DIR_IN;

 or

  LCDIO_DIR = LCDIO_DIR_OUT;

  

以下为头文件。

#ifndef _LCD1602_14P

#define _LCD1602_14P

#define  DATA_MODE        0x38    // 8 bit data transmission mode, double line

// LCD1602 Command Macro

#define  BUSY            0x80   // LCD Busy Tag

#define   CURSOR_RESET        0x02

#define   INPUTMODE_CUR_R     0x06

#define   INPUTMODE_CUR_L     0x04

#define   INPUTMODE_ALL_E     0x05

#define   INPUTMODE_ALL_D     0x04

#define   SCSHIFT_CUR_L       0x10    // Screen or Cursor shift

#define   SCSHIFT_CUR_R       0x14

#define   SCSHIFT_SCR_L       0x18

#define   SCSHIFT_SCR_R       0x1C

// LCD1602 Pins

#define   LCD1602_RS          PORTE_BIT2 //Data Command Pin  1 data  0 command

#define   LCD1602_RW          PTH_PTH0    //Read Write Pin    1 read   0 write

#define   LCD1602_EN          PTH_PTH2    //LCD Enable Signal

#define   LCDIO               PORTA

#define   LCDIO_DIR           DDRA

#define   LCDIO_DIR_IN        0x00

#define   LCDIO_DIR_OUT       0xFF

void LcdCommand(unsigned char command,unsigned char BusyC); //write command function

void LcdData(unsigned char temp,unsigned char BusyC

void LcdSetXY

void LcdWriteChar( unsigned char x,unsigned char y,unsigned char dat);//write lcd a character function

void LcdWriteStr(unsigned char X,unsigned char Y,char *s);//write lcd string function

void LcdInit(initize function

unsigned char ReadStatus(void);

void LcdDelay

#endif

头文件结束。

以下是源文件。

#include #include "LCD1602_14P.h"

void LcdInit(){

  DDRH = 0xff;

  DDRE = 0xff;

  LCDIO_DIR = LCDIO_DIR_OUT;

 LcdDelay();

 LcdCommand

 LcdCommand

 LcdCommand

 LcdCommand(SCREEN_OPEN

   , 1);                     //open display (enable lcd display)

 LcdCommand(lcd first display address

 LcdCommand

}

////////////////////////////////////////////////////////////////////

// write command function

//

void LcdCommand(unsigned char command,unsigned char BusyC){

 if (BusyC) ReadStatus(); //Test it busy or not

 LCDIO=command;

 LCD1602_RS=0;  

 LCD1602_RW=0;

 LCD1602_EN=0;

 LCD1602_EN=0;

 LCD1602_EN=1;

}

unsigned char ReadStatus(void)

{

  unsigned char cRtn;

 LCDIO_DIR = LCDIO_DIR_IN;

 LCD1602_RS = 0;

 LCD1602_RW = 1;

 LCD1602_EN = 0;

 LCD1602_EN = 0;

 LCD1602_EN = 1;

 while (LCDIO & BUSY); //Test Busy State

 cRtn

 LCDIO_DIR = LCDIO_DIR_OUT;

 return(cRtn);

}

void LcdDelay(void){

  word i, j;

  for (i = 0; i < 300; i++)

}

////////////////////////////////////////////////////////////////////

// write data function

//

void LcdData(unsigned char dat,unsigned char BusyC)

{

 if (BusyC) ReadStatus(); //Test it busy or not

 LCDIO=dat;

 LCD1602_RS=1;

 LCD1602_RW=0;

 LCD1602_EN=0;

 LCD1602_EN=0;

 LCD1602_EN=1;

}

////////////////////////////////////////////////////////////////////

// write lcd a character function

//

void LcdWriteChar( unsigned char x,unsigned char y,unsigned char dat){

  LcdSetXY(x, y);

 LcdData(dat,1);

}

////////////////////////////////////////////////////////////////////

// set display address function

//

void LcdSetXY( unsigned char x, unsigned char y ){

 unsigned char address;

 if (y == LINE1)

 else

 LcdCommand(address,1);

}

////////////////////////////////////////////////////////////////////

// write lcd string function

//

void LcdWriteStr(unsigned char X,unsigned char Y,char *s)

{

 LcdSetXY( X, Y ); //set address

 LcdData(*s, 1);  

}下载本文

显示全文
专题