在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      SD卡讀寫程序

      作者: 時間:2018-09-11 來源:網絡 收藏

      //實驗目的:學習SD卡的操作

      本文引用地址:http://www.biyoush.com/article/201809/388868.htm

      //軟件設計
      // 1、SD卡采用SPI通信
      // 2、先往SD里順序寫入0-255共256個數據,然后再讀回送LCD1602顯示
      //硬件要求:
      // 撥碼開關S11置ON
      // 跳線J18全部接通

      #include p30f6014.h> //dsPIC30F6014標準頭文件

      _FOSC(CSW_FSCM_OFF XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
      _FWDT(WDT_OFF); //關閉看門狗定時器
      _FBORPOR(PBOR_OFF MCLR_EN); //掉電復位禁止,MCLR復位使能。
      _FGS(CODE_PROT_OFF); //代碼保護禁止

      #define cs PORTGbits.RG9 //定義SD卡片選腳

      #define rs LATBbits.LATB4 //定義LCD控制位(注意這里只能用LATB寄存器,不能直接用PORTB寄存器)
      #define rw LATBbits.LATB5
      #define e LATBbits.LATB6

      unsigned char __attribute__((address(0x900))) lcd[3]={0,0,0};

      void spi_init(); //申明系統(tǒng)初始函數
      void spi_low(); //申明產生低波特率函數(SD卡初始化使用)
      void spi_high(); //申明產生高波特率函數(SD卡初始化后使用)
      unsigned char sd_reset(); //申明SD卡初始化函數
      unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg); //申明寫SD卡命令函數
      unsigned char SPI_WriteByte(unsigned char val); //申明寫一字節(jié)函數
      unsigned char SPI_ReadByte(void); //申明接收一字節(jié)函數
      unsigned char SD_WriteSingleBlock(unsigned long sector); //申明寫SD卡單BLOCK數據函數
      unsigned char SD_ReadSingleBlock(unsigned long sector); //申明讀SD卡單BLOCK數據函數
      void lcd_display(); //申明結果顯示函數
      void delay(); //申明延時函數(顯示時用)


      //系統(tǒng)初始化函數
      void spi_init()
      {
      TRISG=0x00d0; //設置SDI為輸出,其他C口為輸出
      TRISB=0X0000; //設置B口為輸出
      TRISD=0X0000; //設置D口為輸出
      SPI2CON=0x0278; //空閑時總線為高電平,fosc/64
      SPI2STAT=0x8000; // 輸出數據的末尾采樣輸入數據,上升沿發(fā)送數據
      }

      //*************************寫LCD****************************************
      //寫一個字節(jié)數據函數
      //在電平發(fā)生改變后需要插入一段延時時間,否則LCD反應不過來。
      void write(unsigned char x)
      {
      PORTD=x; //待顯示數據送PORTD口
      delay();
      rs=1; //該字節(jié)數據為數據,而不是命令
      delay();
      rw=0; //此次操作為寫,而不是讀
      delay();
      e=0; //拉低使能信號
      delay(); //保持使能信號為低一段時間
      e=1; //拉高使能信號,建立LCD操作所需要的上升沿
      delay();
      }

      //********************LCD顯示設置函數**************************************
      //在電平發(fā)生改變后需要插入一段延時時間,否則LCD反應不過來。
      void lcd_enable()
      {
      delay();
      rs=0; //該字節(jié)數據為命令,而不是數據
      delay();
      rw=0; //此次操作為寫,而不是讀
      delay();
      e=0; //拉低使能信號
      delay(); //保持使能信號為低一段時間
      e=1; //拉高使能信號,建立LCD操作所需要的上升沿
      delay();
      }

      //*********************LCD初始化函數**************************************
      void lcd_init()
      {
      PORTD=0X1; //清除顯示
      lcd_enable();
      PORTD=0X38; //8位2行5*7點陣
      lcd_enable();
      PORTD=0X0e; //顯示開,光標開,閃爍
      lcd_enable();
      PORTD=0X06; //文字不動,光標右移
      lcd_enable();
      PORTD=0X86; //時間顯示地址
      lcd_enable();
      }

      //***********************LCD顯示函數************************************
      void lcd_display()
      {
      unsigned char i,j;
      lcd_init();
      for(i=0;i3;i++) //一共3字節(jié)數據
      {
      write(lcd[i]); //查表獲取數據并調用寫一個字節(jié)數據函數送LCD顯示
      for(j=0;j5;j++) //延時一段時間(主要是為了控制顯示的速度)
      {delay();}
      }
      }

      //****************寫一字節(jié)函數***************************
      unsigned char SPI_WriteByte(unsigned char val)
      {
      SPI2BUF = val; //待發(fā)送數據裝載到發(fā)送寄存器
      while(!IFS1bits.SPI2IF); //等待發(fā)送完成
      IFS1bits.SPI2IF=0; //清除發(fā)送完成標志位
      return SPI2BUF; //讀取接收寄存器(即使是無效數據也需清空)
      }

      //****************接收一字節(jié)函數**************************
      unsigned char SPI_ReadByte(void)
      {
      SPI2BUF = 0xff; //發(fā)送寄存器裝載數據,以啟動數據接收
      while(!IFS1bits.SPI2IF); //等待接收完成
      IFS1bits.SPI2IF=0; //清除接收完成標志位
      return SPI2BUF; //讀取接收到的數據
      }

      //*****************發(fā)送命令函數****************************
      unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg)
      {
      unsigned char r1;
      unsigned char retry1=0; //重復操作次數

      cs=0; //使能片選信號

      SPI_WriteByte(cmd | 0x40); //分別寫入命令
      SPI_WriteByte(arg>>24); //數據段第4字節(jié)
      SPI_WriteByte(arg>>16); //數據段第3字節(jié)
      SPI_WriteByte(arg>>8); //數據段第2字節(jié)
      SPI_WriteByte(arg); //數據段第1字節(jié)
      SPI_WriteByte(0x95); //CRC效驗和

      while((r1 = SPI_WriteByte(0xff)) == 0xff)//等待響應
      if(retry1++ > 200) break;//超時退出

      cs=1; //清初片選信號

      return r1; //返回狀態(tài)值
      }

      //*******************SD開初始化函數**************************


      上一頁 1 2 下一頁

      關鍵詞: SD卡讀寫 程序

      評論


      相關推薦

      技術專區(qū)

      關閉