查看: 4684|回复: 4

MC9S08AC08 SPI驱动LCD5110

[复制链接]

该用户从未签到

7

主题

107

帖子

0

中级会员

Rank: 3Rank: 3

积分
444
最后登录
2019-3-7
发表于 2015-4-26 13:16:47 | 显示全部楼层 |阅读模式
正在用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里面完美调试。
  1. /*
  2. * spi.c
  3. *
  4. *  Created on: 2015-1-4
  5. *      Author: Jack
  6. */
  7. #include "spi.h"
  8. #include "english_6x8_pixel.h"
  9. #include "stdio.h"
  10. #include  "math.h"
  11. void SPI_Init(byte SPI_SPI_PSC_DIV,byte SPI_RATE_DIV)
  12. {

  13.     SPI1C1=0X50;//使能SPI模块为主模式,使能SPI1,禁止SPI中断,
  14.     SPI1C2=0X09;//SS引脚作为通用IO,用户程序控制其信号。
  15.     //SPI1BR=0X44; //设置通讯波特率=4M/3/4
  16.     SPI1BR_SPR=SPI_RATE_DIV;
  17.     SPI1BR_SPPR=SPI_SPI_PSC_DIV;
  18.     PTED_PTED4=0;//SS引脚初始为低电平
  19.     PTEDD_PTEDD4=1;//PTE4为输出引脚,即SS引脚。
  20. }
  21. void SPI_Write(byte Data)
  22. {
  23. while(!SPI1S_SPTEF);
  24.         (void)SPI1S;
  25.         SPI1D=Data;
  26.         while(!SPI1S_SPRF);
  27.         (void)SPI1D;
  28. }
  29. byte SPI_Read(void)
  30. {
  31.         SPI1D=0xFF;
  32.         while(!SPI1S_SPRF);       
  33.         return(SPI1D);
  34. }
  35. void LCD_Send_Data(unsigned char Data)
  36. {
  37.         LCD_CS=0;
  38.         LCD_DC=1;  
  39.         SPI_Write(Data);
  40.     LCD_CS=1;
  41.         LCD_DC=1;  
  42. }
  43. void LCD_Send_CMD(unsigned char CommandByte)
  44. {
  45.         LCD_CS=0;
  46.         LCD_DC=0;  
  47.         SPI_Write(CommandByte);
  48.     LCD_CS=1;
  49.         LCD_DC=1;  
  50. }
  51. void LCD_Set_XY(unsigned char X, unsigned char Y)
  52. {
  53.         LCD_DC=0;
  54.         LCD_Send_CMD(0x40 | Y);    // Y(page?)
  55.         LCD_Send_CMD(0x80 | X);    // X(column?)
  56.         LCD_DC=1;
  57. }
  58. void LCD_Clear(void)
  59. {
  60.         unsigned char t;
  61.         unsigned char k;
  62.         LCD_Set_XY(0,0);
  63.         for(t=0;t<6;t++)
  64.         {
  65.                 for(k=0;k<84;k++)
  66.                 {
  67.                         LCD_Send_Data(0x00);
  68.                 }
  69.         }
  70. }
  71. void LCD_Init(void)
  72. {
  73.         PTADD_PTADD0=1;
  74.         PTADD_PTADD1=1;
  75.         PTGDD_PTGDD1=1;
  76.         PTGDD_PTGDD2=1;
  77.         PTASE_PTASE0=1;
  78.         PTADS_PTADS0=1;
  79.         PTASE_PTASE1=1;
  80.         PTADS_PTADS1=1;
  81.         PTGSE_PTGSE1=1;
  82.         PTGDS_PTGDS1=1;
  83.         PTGSE_PTGSE2=1;
  84.         PTGDS_PTGDS2=1;
  85.         SPI_Init(SPI_PSC_DIV4,SPI_RATE_DIV4);
  86.     LCD_RES=0;
  87.     SPI_Delay();
  88.     LCD_RES=1;
  89.         LCD_Send_CMD(0x21);  // ????????LCD??
  90.     LCD_Send_CMD(0xc8);  // ??????
  91.     LCD_Send_CMD(0x06);  // ????
  92.     LCD_Send_CMD(0x13);  // 1:48
  93.     LCD_Send_CMD(0x20);  // ??????
  94.     LCD_Send_CMD(0x0c);  // ??????,????
  95.     LCD_Clear();                    // ??
  96. }
  97. void LCD_Write_Char(unsigned char cdata,unsigned char mode)
  98. {
  99.     unsigned char line;
  100.      cdata -= 32;
  101.     for (line=0; line<6; line++)
  102.     {
  103.         if(mode)
  104.         {
  105.             LCD_Send_Data(~font6x8[cdata][line]);
  106.         }
  107.         else
  108.         {
  109.             LCD_Send_Data(font6x8[cdata][line]);
  110.         }
  111.     }
  112. }
  113. /*void LCD_Write_String(unsigned char x,unsigned char y,unsigned  char *str, unsigned char mode)
  114. {
  115.        
  116.         LCD_Set_XY(x,y);
  117.     while (*str!='\0')
  118.     {
  119.         LCD_Write_Char(*str++,mode);
  120.                
  121.         
  122.     }
  123. }*/
  124. void LCD_Write_String(unsigned char x,unsigned char y,const char *str, unsigned char mode)
  125. {
  126.        
  127.         LCD_Set_XY(x,y);
  128.     while (*str!='\0')
  129.     {
  130.         LCD_Write_Char(*str++,mode);
  131.                
  132.         
  133.     }
  134. }
  135. void LCD_DispNum(unsigned char x,unsigned char y,unsigned char sl, double num,unsigned char mode)//sl保留小数位数
  136. {
  137.         char aTextBuffer[20]={0};
  138.         float_to_string(num,aTextBuffer,sl);
  139.         LCD_Write_String(x,y,aTextBuffer,mode);

  140. }

  141. void LcdTestInit(void)
  142. {
  143.         LCD_Write_String(0,0,"Out:",0);
  144.         LCD_Write_String(0,1,(unsigned char *)"In :        'C",0);
  145.         LCD_Write_String(0,2,(unsigned char *)"All:",0);
  146.         LCD_Write_String(0,3,(unsigned char *)"TL1:",0);
  147.         LCD_Write_String(0,4,(unsigned char *)"TL2:",0);
  148.         LCD_Write_String(0,5,(unsigned char *)"TL3:",0);
  149.         LCD_Write_String(72,3,(unsigned char *)"mm",0);
  150.         LCD_Write_String(72,4,(unsigned char *)"mm",0);
  151.         LCD_Write_String(72,5,(unsigned char *)"mm",0);
  152. }

  153. /*void Back_Led(void)
  154. {
  155.         if(key==0)LCD_LED=0;
  156.         else LCD_LED=1;
  157. }*/

  158. // 浮点数转换成字符串
  159. // 参数:data
  160. // 返回:str
  161. void float_to_string(double data, char *str,byte dotlength)
  162. {
  163.   int i,j,k;
  164.   long temp,tempoten;
  165.   byte intpart[20], dotpart[20];  // 数的整数部分和小数部分

  166.   //1.确定符号位
  167.   /*if(data<0) {str[0]='-';data=-data;}
  168.   else str[0]='+';*/

  169.   //2.确定整数部分
  170.   temp=(long)data;

  171.   i=0;
  172.   tempoten=temp/10;
  173.   while(tempoten!=0)
  174.   {
  175.     intpart[i]=temp-10*tempoten+48; //to ascii code
  176.     temp=tempoten;
  177.     tempoten=temp/10;
  178.     i++;
  179.   }
  180.   intpart[i]=temp+48;

  181.   //3.确定小数部分,取了12位小数
  182.   data=data-(long)data;
  183.   for(j=0;j<dotlength;j++)
  184.   {
  185.     dotpart[j]=(int)(data*10)+48;
  186.     data=data*10.0;
  187.     data=data-(long)data;
  188.   }

  189.   //4.数据组装
  190.   for(k=0;k<=i;k++) str[k]=intpart[i-k];
  191.   if(dotlength>0)
  192.   str[i+1]='.';
  193.   for(k=i+2;k<i+j+2;k++) str[k]=dotpart[k-i-2];
  194.   str[i+j+3]='\0';

  195. }
  196. void SPI_Delay(void)
  197. {
  198.         byte i;
  199.                 i=10;
  200.                 while(i>0)
  201.                 {
  202.                         i--;
  203.                 }
  204. }
  205. /*************************************************************************************************************************/
复制代码
自己写了一个浮点转字符串的函数,感觉库里面的sprintf占用了太多的资源,所以就没有在S08里面用(发现在S08里面做除法简直慢的要死),现附上主要的文件!
SPI 5110.zip (4.55 KB, 下载次数: 16)
回复

使用道具 举报

  • TA的每日心情
    无聊
    2018-9-20 10:55
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    24

    主题

    1189

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1642
    最后登录
    2022-3-21
    发表于 2015-4-26 13:22:34 | 显示全部楼层
    帮楼主顶下  继续关注
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2015-4-26 16:05:33 | 显示全部楼层
    S08一直觉得不错,但是FSL没有怎么推广,现在好像是要被放弃了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    300

    帖子

    0

    高级会员

    Rank: 4

    积分
    746
    最后登录
    2016-5-26
    发表于 2015-5-29 09:00:03 | 显示全部楼层
    谢谢分享。。。。
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    41

    帖子

    0

    注册会员

    Rank: 2

    积分
    135
    最后登录
    1970-1-1
    发表于 2016-8-23 13:43:55 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-1 09:35 , Processed in 0.093252 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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