在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币28
TA的每日心情 | 奋斗 2025-5-7 09:07 |
---|
签到天数: 353 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 5785
- 最后登录
- 2025-5-7
|
本帖最后由 wambob 于 2015-5-9 22:26 编辑
在人机界面上,显示不可缺少,液晶、数码管、OLED、段LCD等,相信你不会陌生。自从拿下GPIO后,就开始着手SPI,参考关盘里的SPI两个例程,参考手册,经过几天的辛苦调试,总算水落石出了。
前面已经介绍了SPI和12864的接口https://www.nxpic.org.cn/module/forum/thread-598706-1-1.html
手头的液晶质量不敢恭维,可视角度非常差,以至于有显示了,但角度不好的话,只看到亮屏。这个在程序调试好后调解了下液晶的显示,效果比开始好了。若不是直视了下,我还在纳闷,程序明明写的不差多少了,就是不显示。开始显示的时候出现乱码,这个在学习ADI的时候碰到过,估计是12864的响应时间问题,+个简单的延迟函数解决了。
使用了PTC5 、PTC6作为SPI0的SCK 、SID。和+5V、GND,焊了4个排针接到12864上。
SPI0的时钟来自总线时钟,在调试的时候,发现初始化时钟MCGOUTCLK==48M,但是OUTDIV1分频为2,OUTDIV4=1.也就是说,系统时钟是24M,总线时钟也是24M。
好吧,就以24M来计算SPI的波特率吧。
SPI Baud Rate Register (SPIx_BR)
计算公式
以500K计算,可以得到寄存器值01000000
时钟设置成CPOL=1,CPHA=1
- <P><FONT size=3 face=宋体>/*
- * File: SPI-DEMO.c
- * Purpose: Main process
- *
- */
- #include "common.h"
- void LcdInit(void);
- void SPIInit(void);
- void WriteCommandLCM(int WCLCM);
- void WriteDataLCM(int WDLCM);
- void display_x(int row ,char* dispx);
- void spiTX(SPI_MemMapPtr SPI,unsigned char ucData);
- void Send_byte(unsigned char Byte) ;
- void delay(unsigned long counnt);
- unsigned char szTemp[16] = "";
- char dispx[]={" ´ºÃß²»¾õÏþ, "} ;
- char dispy[]={" ´¦´¦ÎÅÌäÄñ¡£ "} ;
- char dispz[]={" Ò¹À´·çÓêÉù£¬ "} ;
- char dispw[]={" »¨ÂäÖª¶àÉÙ¡£ "} ;
- /********************************************************************/
- int main (void)
- {
- SystemCoreClockUpdate ();
- SPIInit();
- LcdInit();
- display_x(0x80,dispx);
- display_x(0x88,dispy);
- display_x(0x90,dispz);
- display_x(0x98,dispw);
- while(1)
- {
- }
- }
- /********************************************************************/
- void LcdInit(void)
- {
- WriteCommandLCM(0x30);
- WriteCommandLCM(0x02);
- WriteCommandLCM(0x06);
- WriteCommandLCM(0x0c);
- WriteCommandLCM(0x01);
- WriteCommandLCM(0x80);
- }
- void SPIInit(void)
- {
- SIM->SCGC5 |=3U<<10; //使能端口B、C</FONT></P>
- <P><FONT size=3 face=宋体>SIM->SCGC4 |=1U<<22; //使能SPI0
- /* 初始化SPI管脚*/
- PORTC_PCR5 |= PORT_PCR_MUX(2); /* 开启PTC5复用功能2 SPI0 SCK */
- PORTC_PCR6 |= PORT_PCR_MUX(2); /* 开启PTC6复用功能2 SPI0 MOSI*/
- SPI0->C1|=0x58; //使能主SPI CPOL=1 CPHA=1
- SPI0->C2|=0x00; // 8bit 禁止中断,采用查询方式
- SPI0->BR|=0x40; //波特率500K
- }
- void spiTX(SPI_MemMapPtr SPI,unsigned char ucData)
- {
- while((SPI->S & SPI_S_SPTEF_MASK) != SPI_S_SPTEF_MASK); /* 发送前查询发送空标志是否置位 */
- SPI->DL = ucData;
- }
- void WriteCommandLCM(int WCLCM)
- {
- unsigned char Hdata,Ldata;
- Hdata = WCLCM&0xf0; // È¡¸ß4λ
- Ldata = ( WCLCM << 4) & 0xf0; // È¡µÍ4λ
- Send_byte(0xF8); // ´ÓMCUµ½LCDдָÁî
- Send_byte(Hdata); // ·¢Ë͸ß4λ
- Send_byte(Ldata); // ·¢Ë͵Í4λ
- }
- void WriteDataLCM(int WDLCM)
- {
- unsigned char Hdata,Ldata;
- Hdata = WDLCM & 0xf0; // È¡¸ß4λ
- Ldata = ( WDLCM << 4) & 0xf0; // È¡µÍ4λ
- Send_byte(0xFa); //´ÓMCUµ½LCDдÊý¾Ý
- Send_byte(Hdata); // ·¢ËÍ
- Send_byte(Ldata);
- }
- void display_x(int row ,char* dispx)
- {
- unsigned char a;
- WriteCommandLCM(row);
- for(a=0;a<16;a++)
- {
- WriteDataLCM(*dispx++);
- }
- }
- void Send_byte(unsigned char Byte)
- {
- // while((SPI0_S & SPI_S_SPTEF_MASK) != SPI_S_SPTEF_MASK);
- spiTX( SPI0_BASE_PTR,Byte);
- delay(10000);
- }
- void delay(unsigned long counnt){
- volatile int i;
- for(i=0; i < counnt; i++){
- }
- }
- </P></FONT>
复制代码 效果图
|
-
|