在线时间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 */
}
|
|