Donald's BLOG

回忆是一缕淡淡的月光,握紧了便成黑暗

« 配置Apache+MySQL+PHP几时眷顾 »

LCD1602-在MC9SDG128的程序

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


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


  另外的3到14脚的作用如下。
  第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。调程序时,别忘了适当调整电位器。Donald在调试时,开始时老是显示不出来,经过各种检查程序,还是不行,最后没办法调了下电位器,发现已经显示在上面了,晕!
  第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
  第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  第7~14脚:D0~D7为8位双向数据线。
  还有两个引脚没有引出来,他们是"A"和"K",为背光引脚,"A"接正,"K"接负便会点亮背光灯。

  这里,Donald由于自己腐蚀的扩展板是单面板,需考虑最小系统板和引线方便。就让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;

  


以下为头文件。
/*-------------------------------------------------------
    LCD1602 Module (head file)
    Donald
    Apr 30, 2007
-------------------------------------------------------*/
#ifndef _LCD1602_14P
#define _LCD1602_14P

#define  LINE1           0
#define  LINE2           1
#define  LINE1_HEAD      0x80
#define  LINE2_HEAD      0xC0
#define  DATA_MODE        0x38    // 8 bit data transmission mode, double line

// LCD1602 Command Macro
#define  CLR            0x01
#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  SCREEN_OPEN     0x0C
#define  SCREEN_OPEN_CUR   0x02
#define  SCREEN_OPEN_TWI   0x01
#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);   //write data function
void LcdSetXY( unsigned char x, unsigned char y );   //set display address function
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(void);              //LCD initize function
unsigned char ReadStatus(void);
void LcdDelay(void);                       //LCD Delay Function

#endif
头文件结束。

以下是源文件。
/*-------------------------------------------------------
    LCD1602 Module
    Donald
    Apr 30, 2007
-------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#include "LCD1602_14P.h"

void LcdInit(){
  DDRH = 0xff;
  DDRE = 0xff;
  LCDIO_DIR = LCDIO_DIR_OUT;
 LcdDelay();
 LcdCommand(CLR,0);          //clear screen
 LcdCommand(DATA_MODE,1);    //set 8 bit data transmission mode
 LcdCommand(INPUTMODE_CUR_R | INPUTMODE_ALL_D, 1);   // cursor right, disable moving
 LcdCommand(SCREEN_OPEN
   | SCREEN_OPEN_CUR
   | SCREEN_OPEN_TWI
   , 1);                     //open display (enable lcd display)
 LcdCommand(LINE1_HEAD,1);   //set lcd first display address
 LcdCommand(CLR,1);          //clear screen
}

////////////////////////////////////////////////////////////////////
// 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;     // if Not save the port value, it should be change
 LCDIO_DIR = LCDIO_DIR_OUT;
 return(cRtn);
}

void LcdDelay(void){
  word i, j;
  for (i = 0; i < 300; i++)
    for(j = 0; j < 3000; j++);
}

////////////////////////////////////////////////////////////////////
// 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)
    address = LINE1_HEAD + x;
 else
    address = LINE2_HEAD + x;
 LcdCommand(address,1);
}

////////////////////////////////////////////////////////////////////
// write lcd string function
//
void LcdWriteStr(unsigned char X,unsigned char Y,char *s)
{
    LcdSetXY( X, Y ); //set address
    while (*s)  // write character
    {
      LcdData(*s, 1);  
      s++;
    }
}
源文件结束。

附:LCD1602手册(该种资料可从网上搜到,有的是)

www.donald.net.cn/upload/LCD1602_14Pin.pdf

  • 相关文章:
  • quote 1.ngglm
  • http://www.baidu.com
  • 你的網好美,如果有減肥的資訊更好,過胖原因,減肥餐單及相關健康資訊.現在愈來愈多人意識到身軀過胖,對健康造成極大的威脅,不過要成功減肥,便要靠適當的飲食,均衡營養,和適量的運動,從而達到減肥及健康之效果. 0.2578777351742355
  • 2008-9-19 4:35:38 回复该留言
  • quote 3.cshkp
  • http://www.baidu.com
  • 環保回收公司,專營五金回收,服務範圍遍佈港九及新界。我們的客戶包括商廈、工廠、酒樓及五金店等等,環保回收公司還會為客戶提供清拆及清理貨倉服務。擁有多部運輸車輛,包括垃圾收集車、夾斗車及環保斗運輸各種廢物,並採用先進的科技及車隊管理系統,而廢料回收的價格亦很高,能盡量令客戶得到稱心的回報,滿意的服務。 0.20592430823235963
  • 2008-9-20 19:06:49 回复该留言
  • quote 4.cjyum
  • http://www.baidu.com
  • 專業設計裝修工程有限公司,為顧客承辦過無數大小之各類裝修工程,當中包括室內設計裝修,裝修工程,家居裝修,家居設計裝修,家居室內設計裝修,住宅裝修,寫字樓裝修及廠房裝修各類形裝修工程。 0.23081190223501447
  • 2008-9-21 16:38:32 回复该留言
  • quote 5.lfkzg
  • http://www.baidu.com
  • W388是特別為中小企提最佳的網站設計網頁設計及專業的搜尋引擎最佳化服務.我們提供豐富的網頁設計及網絡推廣之專業知識,秉著專業,承諾,品質的服務理念,為對網站服務需求之客戶尋求最經濟及高品質的解決方案.我們的目標是創造你的網上世界. 0.08304658246923424
  • 2008-9-22 5:15:07 回复该留言
  • quote 6.uilgq
  • http://www.baidu.com
  • 醫學更生嫩膚減肥療程,輕盈美態療程,身心淨化,靈氣修身獻瑞療程,時光倒流去紋療程,完美彩光嫩膚收緊療程,智能收緊眼部療程,雷射美白收緊療程,晶瑩滑膚磨皮護理,七色光醫學塑造護理. 0.49420888211059444
  • 2008-9-24 22:29:57 回复该留言
  • quote 7.ukxcg
  • http://www.baidu.com
  • 星匯搬運搬屋
    公司一向致力提供各種搬運服務,專業服務包括: 搬遷住宅、搬寫字樓、廠房等; 搬運各類大小貨品; 提供長短期存倉服務。另特設嶄新家居滅蟲服務(由維康滅蟲服務有限公司提供),好讓各住客用戶日後免受昆蟲滋擾。 0.40993253027347953
  • 2008-9-26 10:31:18 回复该留言
  • quote 10.kckip
  • http://www.baidu.com
  • 星匯搬運搬屋公司一向致力提供各種搬運服務,專業服務包括,搬遷住宅,搬寫字樓,廠房等, 搬運各類大小貨品,提供長短期存倉服務.另特設嶄新家居滅蟲服務(由維康滅蟲服務有限公司提供),好讓各住客用戶日後免受昆蟲滋擾. 0.18459868913645472
  • 2008-10-18 3:01:05 回复该留言
  • quote 11.ukzcp
  • http://www.baidu.com
  • Weima Smart Card Technology Co.,Limited, is a company that specializes in the production of plastic cards, discount cards.We are committed to bring [url=http://www.weimacards.com/aboutus.html[/url] into hands of our customers and out into the market. Our success is rooted in the expertise and experience of our staffs. 0.25042461934869387
  • 2008-10-19 4:29:22 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.7 Laputa Build 70216

Adore designed by Donald
Copyright Donald.net.cn Some Rights Reserved.
辽ICP备08001691号