查看: 1672|回复: 0

[其他] LCD12864问题求助

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
17
最后登录
2015-5-8
发表于 2014-12-24 20:32:46 | 显示全部楼层 |阅读模式
用飞思卡尔8位单片机控制带字库12864,有几个问题希望有经验的师傅指点一下。
1.我用CW软件仿真,在纯软件的仿真情况下,LCD初始化是否可以运行下去,我尝试是不可以的,是不是必须要上电LCD后,初始化才能成功。
2.我之前下载一个显示程序,但下载之后,单片机出现问题,不能继续再下载程序了,而同样的程序,用DSP下载就可以用,没有什么影响,想问一下,在外扩12864后,单片机是否需要有些必要是系统初始化,或者编写相关的头文件。
附:(下面程序就是让单片机不能用的,希望大神们给些建议)
/*************************************************
名    称:LCD12864_串行测试程序
连接方式: 串行方式连接
*************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

#define CS     PTFD_PTFD0        //片选信号 高电平有效 单片LCD使用时可固定高电平
#define SID    PTFD_PTFD1        //数据传送接口
#define CLK    PTFD_PTFD2        //同步时钟


//***************************系统初始化 ***************************//
        //******************外部晶振为8MHZ********************//
void Systems_init(void){

  SOPT1  = 0xc3;    // 7:0 Enable BKGD,COP,RESET;disable STOP
  SOPT2  = 0x00;    //内部1K时钟提供COP,IIC选择PTA2和PTA3,ACMP输出不连接TPM输入通道0                     
  SPMSC1 = 0x1c;    // Disable LVD  屏蔽低电压中断
  SPMSC2 = 0x00;    // Disable power-down modes   屏蔽低功耗模式
  SPMSC3 = 0x00;    // Disable LVWIE, low trip points
  SCGC1  = 0xf9;    // Enable bus clock to peripherals外设 TPM3,TPM2,TPM1,ADC,IIC2,SCI1
  SCGC2  = 0x94;    // Enable bus clock to peripherals DBG,RTC,KBI

  ICSC1= 0x9a;//0x0a   /* External reference clock is selected, RDIV divide by 2, IREFS for external reference */
  //外部参考时钟、RDIV为2分频、FLL选择外部参考时钟输入、ICSIRCLK使能、屏蔽内部参考时钟

  ICSC2= 0x56;//0x16   /* external clock,BDIV=0,Oscillator requested,ICSERCLK active*/  
  // BDIV为2分频、外部时钟低频范围、高增益、FLL在旁路状态仍活动、外部参考时钟为振荡器、ICSERCLK活动、停止时禁止外部参考时钟
  //(外部晶振选8M,ICSOUT=4M,ICSFFCLK=1M)
}


/******IO管脚初始化*********
*******函数名LCD_PortInit****/
void LCD_PortInit(void)
{  
PTFD = 0x00;                           
PTFDD = 0x07;//0xff      // out-function SELECTED,LCD12864
PTFPE = 0x00;
}

/*******LCD延时函数**********
*******函数名LCD_delay*******/
void LCD_delay(uchar t)
{
    uchar x,y;
        for(x=0;x<t;x++)
        {
        for(y=0;y<100;y++){;}  //x=10,近似1ms
        }       
}

/*****串行发送一个字节*******
******函数名SendByte_LCD*****/
void SendByte_LCD(uchar data)
{
     uchar i;
     CS=1;
     CLK=0;
     for(i=0;i<8;i++)
     {
       if(data&0x80){SID=1;} //高位字节先发送,发送8次,一个字节
       else{SID=0;}
       data=data<<1;             //左移一位,准备发送下一位数据
       CLK=1;
       LCD_delay(20);          //发送一位数据
       CLK=0;
     }
     CS=0;
}

/*****发送指令子程序***********
******函数名SendCMD_LCD********/
void SendCMD_LCD(uchar Cdata )            //三个字节发送一次8位命令
{
     //LCD_delay(1);
     SendByte_LCD(0xf8);            //11111,RW(0),RS(0),0
     SendByte_LCD(Cdata&0xf0);      //先发高四位,用一个字节
     SendByte_LCD((Cdata<<4)&0xf0); //再发低四位低(先执行<<),用一个字节
}

/*****发送数据子程序*********
******函数名称SendDAT_LCD****/
void SendDAT_LCD(uchar Ddata )     //三个字节发送一次8位数据
{
     //LCD_delay(1);
     SendByte_LCD(0xfa);            //11111,RW(0),RS(1),0
     SendByte_LCD(Ddata&0xf0);      //高四位
     SendByte_LCD((Ddata<<4)&0xf0); //低四位(先执行<<)
}

/*****初始化LCD*********
******函数名Lcd_Init****/
void Lcd_Init(void)
{
    LCD_delay(50);
    SendCMD_LCD(0x30);        //选择基本指令集
    LCD_delay(50);
    SendCMD_LCD(0x01);        //清除显示,并且设定地址指针为00H
    LCD_delay(50);
    SendCMD_LCD(0x0c);        //开显示(无游标、不反白)
    LCD_delay(20);
}
/*************函数名Clear_DDRAM(void)****************
*******************清除屏幕**************************/
void Clear_DDRAM(void)
{   
    SendCMD_LCD(0x01);
}

/*************12864地址坐标设置************
********函数名 LCD_12864_address_set*******/
void LCD_12864_address_set( uchar x,uchar y )
{
uchar Address ;
switch( y )
{
case 1 : Address = 0x80 + (x - 1); break;
case 2 : Address = 0x90 + (x - 1); break;
case 3 : Address = 0x88 + (x - 1); break;
case 4 : Address = 0x98 + (x - 1); break;
default : break;
}
SendCMD_LCD(Address);
}

/**************12864显示字符串*****************************************
******* 函数名 LCD_12864_String( uchar y, uchar x, uchar *pData )******/
void LCD_12864_string( uchar y, uchar x, uchar *pData )
{
LCD_12864_address_set( x, y );
while( *pData != '\0' )
{
SendDAT_LCD(*pData++);
}
}

/***********************浮点型数据显示***********************
**************函数名LCD_float(uchar x,uchar y0,float NUM)*******/
void LCD_float(uchar x,uchar y0,float NUM) //
{
uchar a_SHOW[7];
long int t;
t=NUM*100;                             //先乘以100,再按整数方式显示,形式只能为xxx.xx,所以精度只能到小数点后两位
a_SHOW[0]=(t/10000)+'0';        //百
a_SHOW[1]=(t/1000%10)+'0' ;        //十
a_SHOW[2]=(t/100%10)+'0';          //个
a_SHOW[3]='.';                         //小数点
a_SHOW[4]=(t/10%10)+'0';          //shi fen
a_SHOW[5]=(t%10)+'0';               //bai fen
a_SHOW[6]='\0';
LCD_12864_string(x,y0,a_SHOW);
}

//******************** 汉字显示(内码输入方法)********************//
//***** 函数名LCD_Hanzi(uchar addr,uchar data1,uchar data2) *****//
void LCD_Hanzi(unsigned char addr, unsigned char data1, unsigned char data2)
{
  SendCMD_LCD(addr);
  SendDAT_LCD(data1);       
  SendDAT_LCD(data2);
}

/*****主函数*****/
void main(void)
{
        Systems_init();
        LCD_PortInit();
        Lcd_Init();

for(;;) {
        LCD_Hanzi(0x80,0xB8,0xDF);//高
        LCD_Hanzi(0x81,0xD1,0xB9);//压
        LCD_Hanzi(0x82,0xB0,0xB2);//安
        LCD_Hanzi(0x83,0xC8,0xAB);//全
        LCD_Hanzi(0x84,0xBC,0xEC);//检
        LCD_Hanzi(0x85,0xB2,0xE2);//测
        LCD_Hanzi(0x86,0xCF,0xB5);//系
        LCD_Hanzi(0x87,0xCD,0xB3);//统
        LCD_float(2,1,123.45);
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

我知道答案 目前已有0人回答
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 13:27 , Processed in 0.082465 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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