在线时间68 小时
UID2029919
注册时间2014-9-24
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 444
- 最后登录
- 2019-3-7
|
正在用S08的片子开发BLDC驱动器,闲着无事献上自己S08驱动5110显示屏的程序,发现S08的SPI还是相当的靠谱(IIC调试了两天都没搞好),看参考手册写完代码,编译无错误,上电LCD就点亮了,显示也很正常,下一步把IIC调好,不知道有对S08上的IIC有调试心得的没!下面附上SPI部分的代码,详细见附件里面的文件,主要在CW10.6里面开发的,在CW6.3里面编译的话可能会出现头文件错误(无赖电脑CW6.3一直装不上去,虚拟机里面用的也相当无语,只好选择CW10.6),貌似TBDM/OSBDM在CW10.6中都是无法调试的,自己做了一个简单的USBDM,在CW10.6里面完美调试。- /*
- * spi.c
- *
- * Created on: 2015-1-4
- * Author: Jack
- */
- #include "spi.h"
- #include "english_6x8_pixel.h"
- #include "stdio.h"
- #include "math.h"
- void SPI_Init(byte SPI_SPI_PSC_DIV,byte SPI_RATE_DIV)
- {
- SPI1C1=0X50;//使能SPI模块为主模式,使能SPI1,禁止SPI中断,
- SPI1C2=0X09;//SS引脚作为通用IO,用户程序控制其信号。
- //SPI1BR=0X44; //设置通讯波特率=4M/3/4
- SPI1BR_SPR=SPI_RATE_DIV;
- SPI1BR_SPPR=SPI_SPI_PSC_DIV;
- PTED_PTED4=0;//SS引脚初始为低电平
- PTEDD_PTEDD4=1;//PTE4为输出引脚,即SS引脚。
- }
- void SPI_Write(byte Data)
- {
- while(!SPI1S_SPTEF);
- (void)SPI1S;
- SPI1D=Data;
- while(!SPI1S_SPRF);
- (void)SPI1D;
- }
- byte SPI_Read(void)
- {
- SPI1D=0xFF;
- while(!SPI1S_SPRF);
- return(SPI1D);
- }
- void LCD_Send_Data(unsigned char Data)
- {
- LCD_CS=0;
- LCD_DC=1;
- SPI_Write(Data);
- LCD_CS=1;
- LCD_DC=1;
- }
- void LCD_Send_CMD(unsigned char CommandByte)
- {
- LCD_CS=0;
- LCD_DC=0;
- SPI_Write(CommandByte);
- LCD_CS=1;
- LCD_DC=1;
- }
- void LCD_Set_XY(unsigned char X, unsigned char Y)
- {
- LCD_DC=0;
- LCD_Send_CMD(0x40 | Y); // Y(page?)
- LCD_Send_CMD(0x80 | X); // X(column?)
- LCD_DC=1;
- }
- void LCD_Clear(void)
- {
- unsigned char t;
- unsigned char k;
- LCD_Set_XY(0,0);
- for(t=0;t<6;t++)
- {
- for(k=0;k<84;k++)
- {
- LCD_Send_Data(0x00);
- }
- }
- }
- void LCD_Init(void)
- {
- PTADD_PTADD0=1;
- PTADD_PTADD1=1;
- PTGDD_PTGDD1=1;
- PTGDD_PTGDD2=1;
- PTASE_PTASE0=1;
- PTADS_PTADS0=1;
- PTASE_PTASE1=1;
- PTADS_PTADS1=1;
- PTGSE_PTGSE1=1;
- PTGDS_PTGDS1=1;
- PTGSE_PTGSE2=1;
- PTGDS_PTGDS2=1;
- SPI_Init(SPI_PSC_DIV4,SPI_RATE_DIV4);
- LCD_RES=0;
- SPI_Delay();
- LCD_RES=1;
- LCD_Send_CMD(0x21); // ????????LCD??
- LCD_Send_CMD(0xc8); // ??????
- LCD_Send_CMD(0x06); // ????
- LCD_Send_CMD(0x13); // 1:48
- LCD_Send_CMD(0x20); // ??????
- LCD_Send_CMD(0x0c); // ??????,????
- LCD_Clear(); // ??
- }
- void LCD_Write_Char(unsigned char cdata,unsigned char mode)
- {
- unsigned char line;
- cdata -= 32;
- for (line=0; line<6; line++)
- {
- if(mode)
- {
- LCD_Send_Data(~font6x8[cdata][line]);
- }
- else
- {
- LCD_Send_Data(font6x8[cdata][line]);
- }
- }
- }
- /*void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *str, unsigned char mode)
- {
-
- LCD_Set_XY(x,y);
- while (*str!='\0')
- {
- LCD_Write_Char(*str++,mode);
-
-
- }
- }*/
- void LCD_Write_String(unsigned char x,unsigned char y,const char *str, unsigned char mode)
- {
-
- LCD_Set_XY(x,y);
- while (*str!='\0')
- {
- LCD_Write_Char(*str++,mode);
-
-
- }
- }
- void LCD_DispNum(unsigned char x,unsigned char y,unsigned char sl, double num,unsigned char mode)//sl保留小数位数
- {
- char aTextBuffer[20]={0};
- float_to_string(num,aTextBuffer,sl);
- LCD_Write_String(x,y,aTextBuffer,mode);
- }
- void LcdTestInit(void)
- {
- LCD_Write_String(0,0,"Out:",0);
- LCD_Write_String(0,1,(unsigned char *)"In : 'C",0);
- LCD_Write_String(0,2,(unsigned char *)"All:",0);
- LCD_Write_String(0,3,(unsigned char *)"TL1:",0);
- LCD_Write_String(0,4,(unsigned char *)"TL2:",0);
- LCD_Write_String(0,5,(unsigned char *)"TL3:",0);
- LCD_Write_String(72,3,(unsigned char *)"mm",0);
- LCD_Write_String(72,4,(unsigned char *)"mm",0);
- LCD_Write_String(72,5,(unsigned char *)"mm",0);
- }
- /*void Back_Led(void)
- {
- if(key==0)LCD_LED=0;
- else LCD_LED=1;
- }*/
- // 浮点数转换成字符串
- // 参数:data
- // 返回:str
- void float_to_string(double data, char *str,byte dotlength)
- {
- int i,j,k;
- long temp,tempoten;
- byte intpart[20], dotpart[20]; // 数的整数部分和小数部分
- //1.确定符号位
- /*if(data<0) {str[0]='-';data=-data;}
- else str[0]='+';*/
- //2.确定整数部分
- temp=(long)data;
- i=0;
- tempoten=temp/10;
- while(tempoten!=0)
- {
- intpart[i]=temp-10*tempoten+48; //to ascii code
- temp=tempoten;
- tempoten=temp/10;
- i++;
- }
- intpart[i]=temp+48;
- //3.确定小数部分,取了12位小数
- data=data-(long)data;
- for(j=0;j<dotlength;j++)
- {
- dotpart[j]=(int)(data*10)+48;
- data=data*10.0;
- data=data-(long)data;
- }
- //4.数据组装
- for(k=0;k<=i;k++) str[k]=intpart[i-k];
- if(dotlength>0)
- str[i+1]='.';
- for(k=i+2;k<i+j+2;k++) str[k]=dotpart[k-i-2];
- str[i+j+3]='\0';
- }
- void SPI_Delay(void)
- {
- byte i;
- i=10;
- while(i>0)
- {
- i--;
- }
- }
- /*************************************************************************************************************************/
复制代码 自己写了一个浮点转字符串的函数,感觉库里面的sprintf占用了太多的资源,所以就没有在S08里面用(发现在S08里面做除法简直慢的要死),现附上主要的文件!
SPI 5110.zip
(4.55 KB, 下载次数: 16)
|
|