Freescale HCS12DG128 控制1602液晶屏

该程序展示了如何使用Freescale HCS12DG128微控制器控制1602液晶显示屏。通过特定的I/O引脚配置,实现了发送指令和数据到LCD,并采用读取1602工作状态的方式来优化显示效率,避免简单延迟。程序包括初始化LCD、发送指令和数据的函数,以及主函数中的显示循环。

引脚使用情况:

 

1602 DB 0~7

PORTA0~7

1602 E

PTM7

1602 RW

PK0

1602 RS

PK2

 

 

源程序:

//Name:LCD OUTPUT TEST
//Description:HCS12DG128 with LCD1602, Edit in CodeWarrior 5.1

//显示main函数中tempshow数组中的字符

//采用了读取1602工作状态来检测忙/闲的方式,而不是简单的利用delay()做短时间延迟

//等待,虽然多用了一个I/O引脚,但是将LCD显示占用时间降到了最短,工作也更可靠

//Date:04/01/2011
//Written by RXDu, NCEPU


#include<hidef.h>     
#include"derivative.h"     


//LCD OUTPUT
#define LCDData PORTA
#define LCDRS PORTK_BIT2
#define LCDRW PORTK_BIT0
#define LCDE PTM_PTM7 

void LCDSendCom(byte cmd);
void LCDSendData(byte data);
void LCDWaitForReady(void);

 

//---------- IO口初始化 ------------//
void InitPort(void)
{
  DDRB=0xff;
  PORTB=0x00;
 
  DDRA=0xff;
  DDRK=0xff;
  DDRM=0xff;
}

//---------- 时钟初始化 ------------//
voidInitPLL(void)   //BusCLK=24M
{
 CLKSEL=0x00;       
 PLLCTL=0xe1;       //检测到外部晶振失效时进入自给时钟方式
 SYNR=2;            //PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
 REFDV=1;           //24MHz
 PLLCTL=0x60;       //时钟监控、锁相环电路允许
  asm NOP;          //空操作,进行简单的延时,等待锁相环的相应
  asm  NOP;
  asm  NOP;
  while(!(CRGFLG_LOCK)==1); //时钟校正同步
 CLKSEL=0x80;       //锁相环频率锁定
 
  //COPCTL =0x00;     //关闭看门狗
}

 

 

void InitLCD(void)
{
  LCDWaitForReady();
  LCDSendCom(0x38);
 
  LCDWaitForReady();
  LCDSendCom(0x06);
 
  LCDWaitForReady();
  LCDSendCom(0x0c); 
}

void LCDSendCom(byte cmd)
{
  //RS,RW=00写指令
  LCDRS=0;
  LCDRW=0;
 
  LCDData=cmd;
 
  //给出E信号下降沿,使指令写入LCD
  LCDE=1;
  LCDE=0;
}

void LCDSendData(byte data)
{
  //RS,RW=10写数据
  LCDRS=1;
  LCDRW=0;
 
  LCDData=data;
 
  //给出E信号下降沿,使数据写入LCD
  LCDE=1;
  LCDE=0;
}

void LCDWaitForReady(void)
{
  //RS,RW=10读忙标志
  LCDRS=0;
  LCDRW=1;
 
  DDRA_BIT7=0;
  LCDE=1;
 
  while(PORTA_BIT7==1);
   
  DDRA_BIT7=1;
}
 
void LCDShow(byte* str)
{
  bytei;   
 
  LCDWaitForReady();
  LCDSendCom(0x80);
 
  for(i=0;i<16;i++)
  {
   LCDWaitForReady();
   LCDSendData(*str);
   str++;    
  }
 
  LCDWaitForReady();
  LCDSendCom(0xc0);
     
  for(i=0;i<16;i++)
  {
   LCDWaitForReady();
   LCDSendData(*str);
   str++;       
  }
}



void main(void)
{
 
  bytetempshow[]="abc45678ABCDEFGHabc45678ABCDEFGH";
 
 DisableInterrupts;  
  InitPort();
  InitPLL();
  InitLCD();

  EnableInterrupts;


  for(;;)
  {
   LCDShow(tempshow);   
   _FEED_COP();
  }
 
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值