搜索
bottom↓
回复: 1

转载 :用飞思卡尔的 HCS12DG128 控制1602液晶屏C程序

[复制链接]

出0入0汤圆

发表于 2014-5-7 07:56:13 | 显示全部楼层 |阅读模式
引脚使用情况:




源程序:
//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;        //时钟监控、锁相环电路允许
  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)
{
  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();
  }

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-5-7 08:13:16 | 显示全部楼层
学习了 谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 18:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表