转载 :用飞思卡尔的 HCS12DG128 控制1602液晶屏C程序
引脚使用情况:源程序:
//Name:LCD OUTPUT TEST
//Description:HCS12DG128 with LCD1602, Edit in CodeWarrior 5.1
//显示main函数中tempshow数组中的字符
//采用了读取1602工作状态来检测忙/闲的方式,而不是简单的利用delay()做短时间延迟
//等待,虽然多用了一个I/O引脚,但是将LCD显示占用时间降到了最短,工作也更可靠
#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;
}
//---------- 时钟初始化 ------------//
void InitPLL(void) //BusCLK=24M
{
CLKSEL=0x00;
PLLCTL=0xe1; //检测到外部晶振失效时进入自给时钟方式
SYNR=2; //PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=1; //24MHz
PLLCTL=0x60; //时钟监控、锁相环电路允许
asmNOP; //空操作,进行简单的延时,等待锁相环的相应
asmNOP;
asmNOP;
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)
{
byte i;
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)
{
byte tempshow[]="abc45678ABCDEFGHabc45678ABCDEFGH";
DisableInterrupts;
InitPort();
InitPLL();
InitLCD();
EnableInterrupts;
for(;;)
{
LCDShow(tempshow);
_FEED_COP();
}
} 学习了 谢谢分享
页:
[1]