| 
在线时间3 小时
UID2090182
注册时间2014-9-12
NXP金币0 
 该用户从未签到 新手上路 
 
 
	积分17 
最后登录2015-5-8 | 
 
| 用飞思卡尔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 */
 }
 
 
 | 
 |