久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8842|回復: 10
打印 上一主題 下一主題
收起左側

單片機+ch375讀U盤 5110液晶顯示

  [復制鏈接]
跳轉到指定樓層
樓主



電路原理圖


ch375與單片機接線圖.jpg
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include "CH375HF4.H"
  4. #include "5110.H"

  5. #define           CH375HF_NO_CODE                1
  6. sbit P22=P2^2;
  7. sbit P23=P2^3;
  8. //uchar num=0;
  9. /* 以下定義的詳細說明請看CH375HF4.H文件 */
  10. #define LIB_CFG_DISK_IO                        1                /* 磁盤讀寫的數據的復制方式,1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */
  11. #define LIB_CFG_FILE_IO                        1                /* 文件讀寫的數據的復制方式,0為"外部子程序",1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */
  12. #define LIB_CFG_INT_EN                        0                /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */

  13. #define CH375_CMD_PORT_ADDR                0xBeF1        /* CH375命令端口的I/O地址 */
  14. #define CH375_DAT_PORT_ADDR                0xBCF0        /* CH375數據端口的I/O地址 */
  15. /* 只使用單片機內置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區, 以字節為單位讀寫文件不需要文件數據讀寫緩沖區FILE_DATA_BUF */
  16. #define        DISK_BASE_BUF_ADDR                0x0000        /* 外部RAM的磁盤數據緩沖區的起始地址,從該單元開始的緩沖區長度為SECTOR_SIZE */

  17. #define CH375_INT_WIRE                        INT0        /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態 */

  18. #define NO_DEFAULT_CH375_F_ENUM                1                /* 未調用CH375FileEnumer程序故禁止以節約代碼 */
  19. #define NO_DEFAULT_CH375_F_QUERY        1                /* 未調用CH375FileQuery程序故禁止以節約代碼 */



  20. #ifdef        NO_DEFAULT_CH375_INT                        /* 自行編寫中斷處理程序,加上了超時處理,并且在等待中斷的過程中可以做其它事 */
  21. void xQueryInterrupt( void )                        /* 查詢CH375中斷并更新中斷狀態,該程序基本框架可以參考CH375HF?.H文件 */
  22. {
  23.         UINT16        i;
  24.         for ( i = 65535; i != 0; i -- ) {  /* 正常情況下該過程為幾毫秒到幾十毫秒,偶爾也會達到幾百毫秒 */
  25. //                if ( CH375_INT_WIRE == 0 ) break;  /* 如果CH375的中斷引腳輸出低電平則說明CH375操作完成 */
  26.                 if ( ( CH375_CMD_PORT & 0x80 ) == 0 ) break; // 對于CH375B芯片,也查詢CH375B的命令端口的位7為0說明中電平
  27. //                在等待CH375中斷的過程中,可以做些需要及時處理的事情
  28.         }
  29.         if ( i == 0 ) //CH375超時,通常是硬件問題;
  30.         CH375_CMD_PORT = CMD_GET_STATUS;  /* 獲取當前中斷狀態 */
  31.         mDelay2uS( );  /* 操作無意義,用于至少延時2uS,可以用多個NOP空操作指令實現 */
  32.         CH375IntStatus = CH375_DAT_PORT;  /* 獲取中斷狀態 */
  33.         if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 檢測到USB設備斷開事件 */
  34.         else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 檢測到USB設備連接事件 */
  35. }
  36. #endif

  37. /* 以毫秒為單位延時,不精確,適用于24MHz時鐘 */
  38. void        mDelaymS( UINT8 delay )
  39. {
  40.         unsigned char        i, j, c;
  41.         for ( i = delay; i != 0; i -- ) {
  42.                 for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz時鐘下延時500uS */
  43.                 for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz時鐘下延時500uS */
  44.         }
  45. }

  46. /* 將程序空間的字符串復制到內部RAM中,返回字符串長度 */
  47. UINT8        mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
  48. {
  49.         UINT8        i = 0;
  50.         while ( *iDestination = *iSource ) {
  51.                 iDestination ++;
  52.                 iSource ++;
  53.                 i ++;
  54.         }
  55.         return( i );
  56. }

  57. /* 檢查操作狀態,如果錯誤則顯示錯誤代碼并停機 */
  58. void        mStopIfError( UINT8 iError )
  59. {
  60.         if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
  61.         printf( "Error: %02X\n", (UINT16)iError );  /* 顯示錯誤 */
  62.         while ( 1 );


  63. }

  64. void host( )
  65. {
  66.         UINT8        i, c, TotalCount;
  67.         UINT8        code *pCodeStr;
  68.         UINT16        EnumCount;

  69. #if DISK_BASE_BUF_LEN == 0
  70.         pDISK_BASE_BUF = &my_buffer[0];  /* 不在.H文件中定義CH375的專用緩沖區,而是用緩沖區指針指向其它應用程序的緩沖區便于合用以節約RAM */
  71. #endif

  72.         i = CH375LibInit( );  /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */
  73.        
  74.         mStopIfError( i );        /* 檢查操作狀態,如果錯誤則顯示錯誤代碼并停機 */

  75. while ( 1 )
  76.   {
  77.         //        printf( "Insert USB disk\n" );
  78.         LCD_write_hanzi(0,2,2);  //插       
  79.         LCD_write_hanzi(1,2,3);  //入
  80.         LCD_write_shu(4,2,6);  //u
  81.         LCD_write_hanzi(3,2,4);  //盤
  82.     LCD_write_shu(8,2,5);  //.
  83.         LCD_write_shu(9,2,5);  //.
  84.         LCD_write_shu(10,2,5);  //.
  85.         LCD_write_shu(11,2,5);  //.
  86.                 while ( CH375DiskStatus < DISK_CONNECT )   /* 等待U盤插入 */
  87.                 {          CH375LibInit( );
  88. /*                        if ( CH375_INT_WIRE == 0 ) xQueryInterrupt( );*/  /* 如果CH375中斷,那么查詢CH375中斷并更新中斷狀態,可以改成中斷方式 */
  89.                         mDelaymS( 100 );  /* 沒必要頻繁查詢 */
  90.                         if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;        /* 查詢方式: 檢查磁盤是否連接,返回成功說明連接 */
  91.                 }

  92.                 mDelaymS( 250 );  /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
  93.                        


  94. /* 檢查U盤是否準備好,但是某些U盤必須要執行這一步才能工作 */
  95.                 for ( i = 0; i < 5; i ++ )   /* 有的U盤總是返回未準備好,不過可以被忽略 */
  96.                 {        mDelaymS( 100 );
  97.                 //        printf( "Ready ?\n" );

  98.           LCD_write_shu(0,4,7);  //r
  99.           LCD_write_shu(1,4,8);  //e
  100.           LCD_write_shu(2,4,9);  //a
  101.           LCD_write_shu(3,4,10);  //d
  102.         LCD_write_shu(4,4,11);  //y
  103.         LCD_write_shu(5,4,12);  //?
  104.         LCD_write_shu(6,4,13);  //


  105.                         if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查詢磁盤是否準備好,不支持CH375S,節約代碼空間 */
  106. //                        if ( CH375sDiskReady( ) == ERR_SUCCESS ) break;  /* 查詢磁盤是否準備好,支持CH375S和CH375A,但占用更多的代碼空間 */
  107.                 }

  108. #if DISK_BASE_BUF_LEN
  109.                 if ( DISK_BASE_BUF_LEN < CH375vSectorSize )   /* 檢查磁盤數據緩沖區是否足夠大,CH375vSectorSize是U盤的實際扇區大小 */
  110.                 {        printf( "Too large sector size\n" );
  111.                         while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 );
  112.                         continue;
  113.                 }
  114. #endif
  115.                  while(1)
  116.         {
  117.                  if(P22==0)          //判斷是否按下
  118.         { mDelaymS( 5 );           //延時
  119.                if(P22==0)           //確實按下

  120.          while(!P22);        //松手檢測
  121.                  mDelaymS( 5 );
  122.            while(!P22);
  123.                     break;
  124.            }
  125.                  
  126.          }
  127.         //        printf( "Open\n" );
  128.                 LCD_clear(); //清屏幕
  129.           LCD_write_shu(0,0,14);  //o
  130.           LCD_write_shu(1,0,15);  //p
  131.           LCD_write_shu(2,0,16);  //e
  132.           LCD_write_shu(3,0,17);  //n


  133.                 mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/QQ.TXT" );  /* 文件名*/
  134.                 i = CH375FileOpen( );  /* 打開文件 */
  135.                 if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE )   /* 沒有找到子目錄,沒有找到文件名 */
  136.        {
  137.                         if ( i == ERR_MISS_DIR ) pCodeStr = "/*";  /* 子目錄不存在則列出根目錄下的所有文件 */
  138.                         else pCodeStr = "/QQ*";  /* 文件不存在則列出子目錄下的以文件名開頭的文件 */
  139.                 //        printf( "List file %s\n", pCodeStr );


  140.                         for ( EnumCount = 0; EnumCount < 10000; EnumCount ++ )  /* 最多搜索前10000個文件,實際上沒有限制 */
  141.                         {         i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr );  /* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */
  142.                                 mCmdParam.Open.mPathName[ i ] = 0xFF;  /* 根據字符串長度將結束符替換為搜索的序號,從0到254,如果是0xFF即255則說明搜索序號在CH375vFileSize變量中 */
  143.                                 CH375vFileSize = EnumCount;  /* 指定搜索/枚舉的序號 */
  144.                                 i = CH375FileOpen( );  /* 打開文件,如果文件名中含有通配符*,則為搜索文件而不打開 */
  145.                                      /* CH375FileEnum 與 CH375FileOpen 的唯一區別是當后者返回ERR_FOUND_NAME時那么對應于前者返回ERR_SUCCESS */
  146.                                 if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已經沒有匹配的文件名 */
  147.                                 if ( i == ERR_FOUND_NAME )  /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區中 */
  148.                                  {         printf( "  match file %04d#: %s\n", (unsigned int)EnumCount, mCmdParam.Open.mPathName );  /* 顯示序號和搜索到的匹配文件名或者子目錄名 */
  149.                                         continue;  /* 繼續搜索下一個匹配的文件名,下次搜索時序號會加1 */
  150.                               }
  151.                                 else   /* 出錯 */
  152.                                 {        mStopIfError( i );
  153.                                         break;
  154.                                 }
  155.                     }
  156.             }
  157.                 else   /* 找到文件或者出錯 */
  158.                 {        mStopIfError( i );
  159.                         TotalCount = CH375vFileSize;  /* 準備讀取總長度 */
  160.                 //        printf( "從文件中讀出的前%d個字符是:\n",(UINT16)TotalCount );

  161.                     LCD_write_hanzi(0,2,5);  //文       
  162.         LCD_write_hanzi(1,2,6);  //件
  163.         LCD_write_hanzi(2,2,7);  //名
  164.         LCD_write_shu(6,2,18);  //:
  165.         LCD_write_shu(7,2,19);  //q
  166.         LCD_write_shu(8,2,19);  //q
  167.     LCD_write_shu(9,2,5);  //.
  168.         LCD_write_shu(10,2,20);  //t
  169.         LCD_write_shu(11,2,21);  //x
  170.         LCD_write_shu(12,2,20);  //t

  171.                 while(1)
  172.          {
  173.                  if(P22==0)          //判斷是否按下
  174.         { mDelaymS( 5 );           //延時
  175.                if(P22==0)           //確實按下

  176.          while(!P22);        //松手檢測
  177.                  mDelaymS( 5 );
  178.            while(!P22);
  179.                     break;
  180.            }
  181.      }
  182.                           LCD_clear(); //清屏幕
  183.                  LCD_write_hanzi(0,0,8);  //內
  184.         LCD_write_hanzi(1,0,9);  //容
  185.         LCD_write_shu(4,0,18);  //:
  186.        
  187.         LCD_write_hanzi(0,2,10);  //創
  188.         LCD_write_hanzi(1,2,11);  //新
  189.            LCD_write_hanzi(2,2,12);  //實
  190.         LCD_write_hanzi(3,2,13);  //驗
  191.         LCD_write_hanzi(4,2,14); //室
  192.                 LCD_write_hanzi(5,2,21); //室

  193.         LCD_write_shu(0,4,22);  //v
  194.     LCD_write_shu(1,4,16);  //e
  195.         LCD_write_shu(2,4,7);  //r
  196.         LCD_write_shu(3,4,11);  //y
  197.         LCD_write_shu(4,4,13);  //
  198.     LCD_write_shu(5,4,23);  //g
  199.     LCD_write_shu(6,4,14);  //o
  200.         LCD_write_shu(7,4,14);  //o
  201.         LCD_write_shu(8,4,10);  //d
  202.         LCD_write_shu(9,4,24);  //!


  203.                         while ( TotalCount )   /* 如果文件比較大,一次讀不完,可以再調用CH375ByteRead繼續讀取,文件指針自動向后移動 */
  204.                    {                if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO;  /* 剩余數據較多,限制單次讀寫的長度不能超過 sizeof( mCmdParam.ByteRead.mByteBuffer ) */
  205.                                 else c = TotalCount;  /* 最后剩余的字節數 */
  206.                                 mCmdParam.ByteRead.mByteCount = c;  /* 請求讀出幾十字節數據 */
  207.                                 i = CH375ByteRead( );  /* 以字節為單位讀取數據塊,單次讀寫的長度不能超過MAX_BYTE_IO,第二次調用時接著剛才的向后讀 */
  208.                                 mStopIfError( i );
  209.                                 TotalCount -= mCmdParam.ByteRead.mByteCount;  /* 計數,減去當前實際已經讀出的字符數 */
  210.                                 for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] );  /* 顯示讀出的字符 */
  211.                                 if ( mCmdParam.ByteRead.mByteCount < c )   /* 實際讀出的字符數少于要求讀出的字符數,說明已經到文件的結尾 */
  212.                                 {        printf( "\n" );
  213.                                         printf( "文件已經結束\n" );
  214.                                         break;
  215.                                 }
  216.                 }

  217.                         printf( "Close\n" );
  218.                         i = CH375FileClose( );  /* 關閉文件 */
  219.                         mStopIfError( i );
  220.                  }

  221. #ifdef EN_DISK_WRITE  /* 子程序庫支持寫操作 */
  222. /* 產生新文件(覆蓋原文件數據),關于向原有文件中添加數據的例子請參考EXAM7和EXAM8 */

  223.                 //printf( "Create\n" );
  224.                 mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/QQ.TXT" );  /* 新文件名,在根目錄下,中文文件名 */
  225.                 i = CH375FileCreate( );  /* 新建文件并打開,如果文件已經存在則先刪除后再新建 */
  226.                 mStopIfError( i );
  227.                 //printf( "Write\n" );
  228.                                 while(1)
  229.          {
  230.                  if(P22==0)          //判斷是否按下
  231.         { mDelaymS( 5 );           //延時
  232.                if(P22==0)           //確實按下

  233.          while(!P22);        //松手檢測
  234.                  mDelaymS( 5 );
  235.            while(!P22);
  236.                     break;
  237.            }
  238.      }
  239.                         LCD_clear(); //清屏幕
  240.                  LCD_write_hanzi(0,0,15);  //寫
  241.         LCD_write_hanzi(1,0,5);  //文       
  242.         LCD_write_hanzi(2,0,6);  //件

  243.        
  244.         LCD_write_hanzi(0,2,16);  //覆
  245.         LCD_write_hanzi(1,2,17);  //蓋
  246.            LCD_write_hanzi(2,2,18);  //原
  247.         LCD_write_hanzi(3,2,5);  //文
  248.         LCD_write_hanzi(4,2,6); //件



  249.                 pCodeStr = "wangmaoquan163\xd\xavery good!\xd\xa";
  250.                 while( 1 )   /* 分多次寫入文件數據 */
  251.            {   for ( i=0; i<MAX_BYTE_IO; i++ )
  252.                         {        c = *pCodeStr;
  253.                                 mCmdParam.ByteWrite.mByteBuffer[i] = c;
  254.                                 if ( c == 0 ) break;  /* 源字符串結束 */
  255.                                 pCodeStr++;
  256.                     }
  257.                         if ( i == 0 ) break;  /* 源字符串結束,完成寫文件 */
  258.                         mCmdParam.ByteWrite.mByteCount = i;  /* 寫入數據的字符數,單次讀寫的長度不能超過MAX_BYTE_IO,第二次調用時接著剛才的向后寫 */
  259.                         i = CH375ByteWrite( );  /* 向文件寫入數據 */
  260.                         mStopIfError( i );
  261.                 }
  262.         //        printf( "Close\n" );

  263.                 LCD_write_shu(0,4,14);  //o
  264.                 LCD_write_shu(1,4,25);  //k
  265.                  LCD_write_shu(2,4,24);  //!

  266.                 mCmdParam.Close.mUpdateLen = 1;  /* 自動計算文件長度,以字節為單位寫文件,建議讓程序庫關閉文件以便自動更新文件長度 */
  267.                 i = CH375FileClose( );
  268.                 mStopIfError( i );
  269. #endif






  270.         //        printf( "Take out USB disk\n" );
  271. //                while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  /* 查詢CH375中斷并更新中斷狀態,等待U盤拔出 */
  272.                 while ( CH375DiskStatus >= DISK_CONNECT )   /* 等待U盤拔出 */
  273.                 {        if ( CH375DiskConnect( ) != ERR_SUCCESS ) break;
  274.                        /* 刪除某文件 */

  275.                     if(P23==0)          //判斷是否按下
  276.       { mDelaymS( 5 );           //延時
  277.                if(P23==0)           //確實按下

  278.          while(!P22);        //松手檢測
  279.                  mDelaymS( 5 );
  280.            while(!P22);
  281.                     
  282.                            //        printf( "Erase\n" );
  283.                 mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/QQ.TXT" );//  將被刪除的文件名,在根目錄下
  284.                 i = CH375FileErase( );//  刪除文件并關閉
  285.                 if ( i != ERR_SUCCESS ) printf( "Error: %02X\n", (UINT16)i );//  顯示錯誤
  286.                                               LCD_clear(); //清屏幕
  287.                  LCD_write_hanzi(0,0,19);  //刪
  288.         LCD_write_hanzi(1,0,20);  //除       
  289.      LCD_write_hanzi(2,0,5);  //文
  290.         LCD_write_hanzi(3,0,6); //件

  291.                         LCD_write_shu(0,2,14);  //o
  292.                 LCD_write_shu(1,2,25);  //k
  293.                  LCD_write_shu(2,2,24);  //!
  294.           
  295.            }
  296.                         mDelaymS( 100 );
  297.                 }
  298.            mDelaymS( 100 );
  299.    }
  300. }
復制代碼

ch375讀寫u盤,配合按鍵操作,在5110液晶上顯示,也可串口發送顯示(去掉屏蔽即可)。本人親測。壓縮包包涵有源程序、99se原理圖、接線圖等




所有資料下載:
ch375_5110.rar (224.04 KB, 下載次數: 126)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:108931 發表于 2016-7-20 22:21 | 只看該作者
看看吧能不能用上。
回復

使用道具 舉報

板凳
ID:64089 發表于 2016-7-21 12:54 | 只看該作者
Good i like it,thanks!
回復

使用道具 舉報

地板
ID:134954 發表于 2016-7-25 15:59 | 只看該作者
在么
樓主  為什么我OPEN以后出現錯誤:1F
回復

使用道具 舉報

5#
ID:111632 發表于 2016-11-23 15:55 | 只看該作者
串口發送接收指的是單片機上的串口還是CH375上的?
回復

使用道具 舉報

6#
ID:189880 發表于 2017-4-15 16:42 | 只看該作者
下來看看能否可以
回復

使用道具 舉報

7#
ID:16695 發表于 2017-4-22 08:38 | 只看該作者
資料不錯,在找
回復

使用道具 舉報

8#
ID:236933 發表于 2017-10-1 22:25 | 只看該作者
下載試試看!!!
回復

使用道具 舉報

9#
ID:146874 發表于 2017-10-9 19:08 | 只看該作者
下載試試看
回復

使用道具 舉報

10#
ID:858595 發表于 2020-12-12 16:17 來自手機 | 只看該作者
可以發一下電路原件嗎?
回復

使用道具 舉報

11#
ID:858595 發表于 2020-12-12 16:24 來自手機 | 只看該作者
就是prroteus原理圖
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一本 | 懂色中文一区二区在线播放 | 亚洲天堂精品久久 | 日韩欧美电影在线 | 国产日韩欧美在线观看 | av一区二区在线观看 | 91国产视频在线观看 | 成人精品一区二区三区 | 91免费电影 | 国产精品欧美精品 | 福利片一区二区 | 国产日韩精品在线 | 久久精品99 | 久久久久网站 | 91免费看片 | 国产精品mv在线观看 | 亚洲一区二区在线播放 | 老熟女毛片 | 欧美日韩综合视频 | 天天综合日日夜夜 | 精品久久久久久久久久久久 | 日韩视频免费在线 | 中文精品视频 | 欧美日韩一卡二卡 | 99国产精品久久久久久久 | 成人免费视频网站在线看 | 自拍中文字幕 | 999久久久久久久久6666 | 午夜精品一区二区三区在线视频 | 91久久国产综合久久91精品网站 | 亚洲国产福利视频 | av在线成人| 国产在线观看一区二区 | 精品国产乱码久久久久久闺蜜 | 欧美xxxx性 | 中文字幕一区二区三区四区 | 爱综合| 午夜小电影 | 91亚洲国产成人久久精品网站 | 成人在线 | 亚洲精品久久久一区二区三区 |