⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 freescale s12系列单片机驱动集。作者自己编写
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dt256.h>     /* derivative information */
#include "SCI.h"
#include "MC9S12.h"
#include "SPI.h"

#if SPI_EN
void SPI_Init(void){
  unsigned char tmp;
  SPI0BR  = 0x02;// Baud Rate = BusClock / BaudRateDivisor = 2M
                 // 2M / 8 = 256k
  SPI0CR1 = 0x1c;
  SPI0CR2 = 0x00;
 
  tmp = SPI0SR;
  
  SPI0CR1 |= 0x40;
  //SPI0DR  = 0x00;               
  #if LCD_EN
    // LCD_Init();
  #endif
}
#endif

//interrupt 19 SPI_Interrupt(void){
  

/*****************************************************************/
/*                    软件延时														       */
/* 一个NOP为2个周期,即8个脉冲,而一个脉冲为1/2 US,一个NOP为4US */
/*---------------------------------------------------------------*/
void delay_Ms(unsigned int N)
{
	unsigned int i,j;
	j = N << 8;//N *1000 / 4
	for(i = 0;i < j;i ++) asm("nop");
	
}
void delay_us(unsigned int N){
	unsigned int i,j;
  j = N >> 2;	
	for(i = 0;i < j;i ++) asm("nop");
}

#if LCD_EN
void LCD_Init(void){  
  delay_Ms(40);
 	Lcd_WrCommand(0x30);
	delay_us(100);
	Lcd_WrCommand(0x30);
	delay_us(100);
	Lcd_WrCommand(0x0c);//显示LCD但不显光标
	delay_us(100);
	Lcd_WrCommand(0x01);//清除DDRAM
	delay_Ms(10);
	Lcd_WrCommand(0x06);//设定输入时光标移动方向
}

void  Spi_SendData(unsigned char Data){
 // unsigned char tmp;
 // tmp = SPI0SR & 0x20;
    SPI0DR = Data;
  	while(!(SPI0SR & 0x20));// 等SPTEF = 1时,才去写数据寄存器
    

 //SCI_Transmit("||");		
// SCI_Tran(Data);
// SCI_Transmit("||");
// 	SCI_Tran(SPI0DR);
	//Data ++;
//	Data = SPI0DR;
	//tmp = SPI0SR & 0x80;
 while(!(SPI0SR & 0x80));// 等SPIF = 1时,数据发送完毕
	
}


void Lcd_WrCommand(byte Command){//写入指令
	Spi_SendData(0xf8);//11111000:输入指令
	Spi_SendData(Command & 0xf0);
	Spi_SendData(Command << 4);
	delay_Ms(3);//延时3ms
}

void Lcd_WrStr(unsigned char * str)//写一字符串到ddram中
{
	byte	Byte_N;//Byte_N用来标志即将写入DDRAM的字节是第多少个字节
	Byte_N = 1;
	while(*str != '\0')
	{
		switch(Byte_N)
		{
			case	1: Lcd_WrCommand(0x80);break;
			case	17:Lcd_WrCommand(0x90);break;
			case	33:Lcd_WrCommand(0x88);break;
			case	49:Lcd_WrCommand(0x98);break;
			
		}
		
		/*控制DDRam的地址,向Line_Addr地址写入数据,控制输出的地址
		每16个字节,使Ram地址Addr变动一次。
		*/
		Byte_N ++;
		Lcd_WrByte(*str ++);
	}
}

void Lcd_WrByte(byte data)//输出一个字节的内容到Ram(CGRam,DDRam,IRam,GDRam)
{
	Spi_SendData(0xfa);//11111010:输入数据到ram
	Spi_SendData(data & 0xf0);
	Spi_SendData(data << 4);
	delay_Ms(3);	
}

/*void GDRam_Clr()
{
	byte	x,y;
	Lcd_WrCommand(0x34);//使用扩充指令
	for(y=0;y<64;y++)
	{
		for(x=0;x<16;x++)
		{
			Lcd_WrCommand(y|0x80);//写入纵坐标
			Lcd_WrCommand(x|0x80);//写入横坐标
			Lcd_WrByte(0x00);//清零
			Lcd_WrByte(0x00);//清零			
		}
	}
	Lcd_WrCommand(0x36);//使GDRam显示
}
*/  
  
#endif  
  
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -