wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

標題: STC32G12K128屠龍刀+FT24C256A+MAX7219 [打印本頁]

作者: wuzhengmin    時間: 2025-11-11 21:43
標題: STC32G12K128屠龍刀+FT24C256A+MAX7219
最近開始折騰STC32G12K128
買了塊屠龍刀回來,手頭有IIC的存儲芯片FT24C256A

今天我們目的是使用STC的USB-CDC功能,在存儲芯片上寫入8個數值后讀取出來,在數碼管上顯示,同時

要打印到PC機的串口(不用普通串口,用STC-USB-CDC串口)

先看器件:

作者: wuzhengmin    時間: 2025-11-11 21:47
先看主程序:
  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用戶文件頭說明信息  
  4. // 文件名稱: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改記錄:
  8. //   1. (2025-11-06) 創建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>


  11. #include "config.h"                     //默認已包含stdio.h、intrins.h等頭文件


  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用戶頭文件包含
  14. #include "i2c.h"
  15. #include "MAX7219.h"
  16. //        8位Max7219數碼管模塊顯示, CLK = P6^4;CS = P6^5; DIN = P6^6;
  17. //選擇I2C數據口: SCL(P2.5), SDA(P2.4),IIC分頻系數n=60
  18. //<<AICUBE_USER_INCLUDE_END>>


  19. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  20. // 在此添加用戶全局變量定義、用戶宏定義以及函數聲明
  21. void PlaySMG(u8  tmp_1[8]);

  22. char code LEDcode[]=
  23. {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00     /*0,1,2,3,4,5,6,7,8,9,全滅*/
  24. ,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff};    /*A,B,C,D,E,F,P,U,全亮*/


  25. char code table[]={
  26. 0x7e, //0
  27. 0x18, //1
  28. 0x37, //2
  29. 0x3d, //3
  30. 0x59, //4
  31. 0x6d, //5
  32. 0x6f, //6
  33. 0x38, //7
  34. 0x7f, //8
  35. 0x7d, //9
  36. 0x7b, //A
  37. 0x4F, //b
  38. 0x66, //C
  39. 0x1F, //d
  40. 0x67, //E
  41. 0x63,  //F
  42. };     //共陰
  43. //<<AICUBE_USER_GLOBAL_DEFINE_END>>



  44. ////////////////////////////////////////
  45. // 項目主函數
  46. // 入口參數: 無
  47. // 函數返回: 無
  48. ////////////////////////////////////////
  49. void main(void)
  50. {
  51.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  52.     // 在此添加用戶主函數初始化代碼
  53.                 u8 i=0;
  54.                 u8  tmp[8];
  55.     //<<AICUBE_USER_MAIN_INITIAL_END>>

  56.     SYS_Init();

  57.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  58.     // 在此添加主函數中運行一次的用戶代碼
  59.         Initial();               //MAX7219初始化
  60.                 P40 = 0;        //三極管引腳輸出低電平
  61.                 P60 = 0;        //輸出低電平   //這2顆燈亮了
  62.                 P61 = 0;        //輸出低電平   //說明這段程序是執行了
  63.                 delay_ms(2000);//經STC論壇版主erci***指導“print_usb并非阻
  64.         //塞函數,所以在打開串口前可能已經打印完成了。 所以延時應放在打印前,或者在循環里
  65.         //每隔1s反復打印這樣每次打開串口都能看到!
  66. //                printf_usb( " A 首先從24C02讀取8個數\xfd:            \r\n");  
  67. //                printf_usb( " B 把從24C02讀取8個數\xfd加1后寫入24C02:\r\n");
  68. //                printf_usb( " C 把從24C02讀取8個數\xfd減1后寫入24C02:\r\n");
  69. //                printf_usb( " D 把24C02地址0x0000的8個數\xfd清零:    \r\n");
  70.                 //printf_usb( " 發字符給printf_usb,引發bUsbInBusy檢測    \r\n");
  71.                 //可以先printf再while(bUsbInBusy == 1);,但是這樣依然看不到第一條printf的
  72.                 //while(bUsbInBusy==1) //cdc串口發數據之前可以判斷一下當前的usb狀態,等他空閑了再發,
  73.                                                          //實測這樣一點問題沒有,但是我們這里不行啊
  74.                 //{
  75.                 printf_usb( " A 首先從24C256讀取8個數:            \r\n");  
  76.                 printf_usb( " B 把從24C256讀取8個數加1后寫入24C256:\r\n");
  77.                 printf_usb( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
  78.                 printf_usb( " D 把24C256地址0x0000k開始的8個數清零:    \r\n");
  79.                 //};
  80.                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  81.                
  82.                 for( i=0;i<8;i++ )
  83.                 {
  84.                 printf_usb( "%u\t ",tmp[i] );
  85.                 }                                                        //為什么串口助手看不到以上打印結果?
  86.                                                                         //可能是USB查詢方式,只有在回答查詢的時候才輸出?
  87.                
  88.                
  89.                                                
  90.                 PlaySMG(tmp); //數碼管打印8個字節
  91.        
  92.     //<<AICUBE_USER_MAIN_CODE_END>>

  93.     while (1)
  94.     {
  95.        // USBLIB_OUT_Done();              //查詢方式處理USB接收的數據

  96.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  97.         // 在此添加主函數中用戶主循環代碼
  98.                                         if( bUsbOutReady )                                                               
  99.                 {
  100.                         //USB_SendData(UsbOutBuffer,OutNumber);
  101.                
  102.                        
  103.                                
  104.                         switch( UsbOutBuffer[0] )
  105.                         {
  106.                                 case 'A':                        //
  107.                                             //printf("從24C02讀出8個數\xfd據: \r\n");
  108.                                                 printf("從24C256讀出8個數據: \r\n");

  109.                                                 //-----------------------讀取數據-----------------------
  110.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  111.                                                
  112.                                                 for( i=0;i<8;i++ )
  113.                                                 {
  114.                                                 printf( "%u\t",tmp[i] );  
  115.                                                 /*  以十進制打印
  116.                                                 "%u\t" 是格式化字符串,其中:%u 是一個格式控制符,用于指定輸出一個無符號整數。
  117.                                                 \t 是一個轉義字符,表示輸出一個水平制表符。dat[i] 是要輸出的數據,它應該是一個無符號整數類型的數組元素。
  118.                                                 %u格式控制符用于將數字轉換為無符號整數格式。無符號整數是指不帶符號的整數,即只能表示零和正數的整數類型
  119.                                                 */

  120.                                                 }
  121.                                                 printf( "讀取結束\r\n");
  122.                                                
  123.                                                 PlaySMG(tmp); //數碼管打印8個字節
  124.                                                 delay_ms(200);
  125.                                        
  126.                                         break;
  127.                                 case 'B':
  128.                                                
  129.                                                 printf( " B 把從24C256讀取8個數加1后寫入24C02:\r\n");

  130.                                                 //-----------------------寫入修改后的數據-----------------------
  131.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  132.                                                 for( i=0;i<8;i++ )
  133.                                                 {
  134.                                                         tmp[i] = (tmp[i] +1);
  135.                                                 }       
  136.                                                 IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都加1后,原位置寫回去
  137.                                                
  138.                                                 delay_ms(200);
  139.                                                 printf("加1后存儲完成再從24C256讀出8個數據: \r\n");
  140.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  141.                                                
  142.                                                 for( i=0;i<8;i++ )
  143.                                                 {
  144.                                                 printf( "%u\t",tmp[i] );
  145.                                                 }
  146.                                                
  147.                                                 PlaySMG(tmp); //數碼管打印8個字節
  148.                                                 delay_ms(200);
  149.                                                
  150.                                                 printf("請比較差別,證實加1寫入成功\r\n");
  151.                                                 break;
  152.                                 case 'C':
  153.                                                
  154.                                                 printf( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
  155.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  156.                                                 for( i=0;i<8;i++ )
  157.                                                 {
  158.                                                         tmp[i] = (tmp[i] -1);
  159.                                                 }       
  160.                                                 IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都減1后,原位置寫回去
  161.                                                
  162.                                                 delay_ms(200);
  163.                                                
  164.                                                 printf("減1后存儲完成再從24C256讀出8個數據: \r\n");
  165.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  166.                                                
  167.                                                 for( i=0;i<8;i++ )
  168.                                                 {
  169.                                                 printf( "%u\t",tmp[i] );
  170.                                                 }
  171.                                                 delay_ms(200);
  172.                                                
  173.                                                 printf("請再次比較差別,證實減1寫入成功\r\n");
  174.                                                 PlaySMG(tmp); //數碼管打印8個字節
  175.                                                 break;
  176.                                 case 'D':
  177.                                                 printf( " D 把24C256地址0x0000開始的8個數清零::\r\n");
  178.                                
  179.                                                 for( i=0;i<8;i++ )
  180.                                                 {
  181.                                                         tmp[i] = 0x00;
  182.                                                 }       
  183.                                                 IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,數組成員都變0后,原位置寫回去
  184.                                                
  185.                                                 delay_ms(200);
  186.                                                
  187.                                                 printf( " D 24C256地址0x0000開始的8個數已經變成::\r\n");
  188.                                                 IIC_Read_NGByte(0x00,0x08,tmp,8);        // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
  189.                                                
  190.                                                 for( i=0;i<8;i++ )
  191.                                                 {
  192.                                                 printf( "%u\t",tmp[i] );
  193.                                                 }
  194.                                                 delay_ms(200);
  195.                                                
  196.                                                 printf("請再次比較差別,證實清零成功\r\n");
  197.                                                 PlaySMG(tmp); //數碼管打印8個字節
  198.                                                 break;
  199.                                
  200.                                 default:
  201.                                                                                                
  202.                                                 break;                               
  203.                         }
  204.                         usb_OUT_done();
  205.                
  206.                 }
  207.                
  208.         //<<AICUBE_USER_MAIN_LOOP_END>>
  209.     }
  210. }

  211. ////////////////////////////////////////
  212. // 系統初始化函數
  213. // 入口參數: 無
  214. // 函數返回: 無
  215. ////////////////////////////////////////
  216. void SYS_Init(void)
  217. {
  218.     EnableAccessXFR();                  //使能訪問擴展XFR
  219.     AccessCodeFastest();                //設置最快速度訪問程序代碼
  220.     AccessIXramFastest();               //設置最快速度訪問內部XDATA
  221.     IAP_SetTimeBase();                  //設置IAP等待參數,產生1us時基

  222.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  223.     // 在此添加用戶預初始化代碼  
  224.     //<<AICUBE_USER_PREINITIAL_CODE_END>>

  225.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口為準雙向口模式
  226.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口為準雙向口模式
  227.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口為準雙向口模式
  228.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口為準雙向口模式
  229.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口為準雙向口模式
  230.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口為準雙向口模式
  231.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口為準雙向口模式
  232.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口為準雙向口模式

  233.     I2C_Init();                         //I2C初始化
  234.     delay_ms(1);
  235.     USBLIB_Init();                      //USB庫初始化
  236.     delay_ms(1);

  237.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  238.     // 在此添加用戶初始化代碼  
  239.     //<<AICUBE_USER_INITIAL_CODE_END>>

  240.     EnableGlobalInt();                  //使能全局中斷
  241.     USBLIB_WaitConfiged();              //等待USB完成配置
  242. }

  243. ////////////////////////////////////////
  244. // 微秒延時函數
  245. // 入口參數: us (設置延時的微秒值)
  246. // 函數返回: 無
  247. ////////////////////////////////////////
  248. void delay_us(uint16_t us)
  249. {
  250.     do
  251.     {
  252.         NOP(18);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  253.     } while (--us);
  254. }


  255. ////////////////////////////////////////
  256. // 毫秒延時函數
  257. // 入口參數: ms (設置延時的毫秒值)
  258. // 函數返回: 無
  259. ////////////////////////////////////////
  260. void delay_ms(uint16_t ms)
  261. {
  262.     uint16_t i;

  263.     do
  264.     {
  265.         i = MAIN_Fosc / 6000;
  266.         while (--i);
  267.     } while (--ms);
  268. }


  269. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  270. // 在此添加用戶函數實現代碼
  271. ////////////////////////////////////////
  272. // MAX7219顯示函數
  273. // 入口參數: tmp_1[8]數組 (要顯示的8個數的數組)
  274. // 函數返回: 無
  275. ////////////////////////////////////////
  276. void PlaySMG(u8  tmp_1[8])
  277. {

  278.                 Write7219(8,tmp_1[0]);                //數碼管左邊第1位,如果給15就是熄滅
  279.                 Write7219(7,tmp_1[1]);                //數碼管左邊第2位
  280.                 Write7219(6,tmp_1[2]);                //數碼管左邊第3位
  281.                 Write7219(5,tmp_1[3]);                 //數碼管左邊第4位
  282.                 Write7219(4,tmp_1[4]);                //數碼管左邊第5位,如果給15就是熄滅
  283.                 Write7219(3,tmp_1[5]);                //數碼管左邊第6位
  284.                 Write7219(2,tmp_1[6]);                //數碼管左邊第7位
  285.                 Write7219(1,tmp_1[7]);                 //數碼管左邊第8位 99--3 100--4 101--5 102--6 103--7  104--8 105--9
  286.                 //Write7219(1,LEDcode[14]|0x80);                 //數碼管左邊第8位  106--"-" 107--E  108--H 109--L 91--E 92--H


  287. }

  288. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>


復制代碼




作者: wuzhengmin    時間: 2025-11-11 21:48
接著看IIC.C
  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用戶文件頭說明信息  
  4. // 文件名稱: i2c.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改記錄:
  8. //   1. (2025-11-06) 創建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>


  11. #include "config.h"


  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用戶頭文件包含
  14. #include "i2c.h"
  15. //<<AICUBE_USER_INCLUDE_END>>


  16. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  17. // 在此添加用戶全局變量定義、用戶宏定義以及函數聲明
  18. bit zjyd_ASK;   //zjyd_ASK=0 就是ASK zjyd_ASK=1 就是NASK
  19. u8 dat;
  20. //<<AICUBE_USER_GLOBAL_DEFINE_END>>



  21. ////////////////////////////////////////
  22. // I2C初始化函數
  23. // 入口參數: 無
  24. // 函數返回: 無
  25. ////////////////////////////////////////
  26. void I2C_Init(void)
  27. {
  28.     I2C_SwitchP2425();                  //選擇I2C數據口: SCL(P2.5), SDA(P2.4)

  29.     I2C_MasterMode();                   //設置I2C為主機模式
  30.     I2C_SetClockDivider(60);            //設置I2C為主機模式時鐘

  31.     I2C_Enable();                       //使能I2C功能

  32.     //<<AICUBE_USER_I2C_INITIAL_BEGIN>>
  33.     // 在此添加用戶初始化代碼  
  34.     //<<AICUBE_USER_I2C_INITIAL_END>>
  35. }

  36. ////////////////////////////////////////
  37. // 主機模式等待命令完成
  38. // 入口參數: 無
  39. // 函數返回: 無
  40. ////////////////////////////////////////
  41. void I2C_MasterWait(void)
  42. {
  43.     while (!I2C_CheckMasterFlag());     //等待完成標志
  44.     I2C_ClearMasterFlag();              //清除完成標志
  45.     I2C_Idle();                         //恢復IDLE狀態
  46. }

  47. ////////////////////////////////////////
  48. // 主機模式發送起始信號
  49. // 入口參數: 無
  50. // 函數返回: 無
  51. ////////////////////////////////////////
  52. void I2C_MasterStart(void)
  53. {
  54.     I2C_Start();                        //觸發主機模式起始命令
  55.     I2C_MasterWait();                   //等待命令完成
  56. }

  57. ////////////////////////////////////////
  58. // 主機模式發送停止信號
  59. // 入口參數: 無
  60. // 函數返回: 無
  61. ////////////////////////////////////////
  62. void I2C_MasterStop(void)
  63. {
  64.     I2C_Stop();                         //觸發主機模式停止命令
  65.     I2C_MasterWait();                   //等待命令完成
  66. }

  67. ////////////////////////////////////////
  68. // 主機模式發送1字節數據
  69. // 入口參數: dat (待發送的字節數據)
  70. // 函數返回: 0   (接收的應答信號為ACK)
  71. //           1   (接收的應答信號為NAK)
  72. ////////////////////////////////////////
  73. BOOL I2C_MasterSendByte(uint8_t dat)
  74. {
  75.     I2C_WriteData(dat);                 //將數據寫入I2C數據寄存器
  76.     I2C_SendData();                     //觸發主機模式寫數據命令
  77.     I2C_MasterWait();                   //等待命令完成
  78.     I2C_RecvACK();                      //觸發主機模式接收應答命令
  79.     I2C_MasterWait();                   //等待命令完成

  80.     return I2C_MasterReadACK();         //讀取并返回應答信號
  81. }

  82. ////////////////////////////////////////
  83. // 主機模式接收1字節數據
  84. // 入口參數: ack (待發送的應答信號)
  85. // 函數返回:     (接收的字節數據)
  86. ////////////////////////////////////////
  87. uint8_t I2C_MasterReadByte(BOOL ack)
  88. {
  89.     uint8_t dat;

  90.     I2C_RecvData();                     //觸發主機模式讀數據命令
  91.     I2C_MasterWait();                   //等待命令完成
  92.     dat = I2C_ReadData();               //讀取接收的數據
  93.     if (!ack)
  94.         I2C_MasterSetACK();             //將ACK數據寫入寄存器
  95.     else
  96.         I2C_MasterSetNAK();             //將NAK數據寫入寄存器
  97.     I2C_SendACK();                      //觸發主機模式發送應答命令
  98.     I2C_MasterWait();                   //等待命令完成

  99.     return dat;                         //返回接收的數據
  100. }



  101. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  102. // 在此添加用戶函數實現代碼


  103. //存儲地址超過2K的,要用16位地址
  104. ////////////////////////////////////////
  105. // 主機模式向IIC_24c256寫入1字節數據
  106. // 入口參數: addrH(地址高8位),addrL(地址低8位),dat (待發送的1字節數據)
  107. // 函數返回:無
  108. //         
  109. ////////////////////////////////////////
  110. void IIC_Write1Gbyte(u8 addrH,u8 addrL, u8 dat)   //寫入一個字節
  111. {
  112.         I2C_MasterStart();                         // START
  113.         zjyd_ASK = I2C_MasterSendByte(SLAW);       //發送從設備地址+寫
  114.        
  115.         if(!zjyd_ASK)                              // 收到ASK就發送AT24C256地址高8位
  116.         {
  117.                 zjyd_ASK = I2C_MasterSendByte(addrH);  //寫存儲地址高8位

  118.                 if(!zjyd_ASK)                           // 收到ASK就發送AT24C256地址低8位
  119.                 {
  120.                 zjyd_ASK = I2C_MasterSendByte(addrL);   //寫存儲地址低8位       
  121.                         if(!zjyd_ASK)                              // 收到ASK就向AT24C256寫1字節數據
  122.                         {
  123.                         zjyd_ASK = I2C_MasterSendByte(dat);   //寫1字節數據       
  124.                         }
  125.                         if(zjyd_ASK)                        //應答是NASK,就中止
  126.                         return;
  127.                         I2C_MasterStop();                                 //發送停止命令
  128.                 }
  129.         }
  130.        
  131. }

  132. ////////////////////////////////////////
  133. // 主機模式讀取1字節數據
  134. // 入口參數: addrH(地址高8位),addrL(地址低8位),ack (待發送的應答信號)
  135. // 函數返回:     (接收的字節數據)
  136. ////////////////////////////////////////
  137. void I2C_MasterRead1GByte(u8 addrH,u8 addrL)
  138. {

  139.        
  140.         I2C_MasterStart();                         // START
  141.         zjyd_ASK = I2C_MasterSendByte(SLAW);       //發送從設備地址+寫
  142.        
  143.         if(!zjyd_ASK)                              // 收到ASK就發送AT24C256地址高8位
  144.         {
  145.                 zjyd_ASK = I2C_MasterSendByte(addrH);  //寫存儲地址高8位

  146.                 if(!zjyd_ASK)                           // 收到ASK就發送AT24C256地址低8位
  147.                 {
  148.                 zjyd_ASK = I2C_MasterSendByte(addrL);   //寫存儲地址低8位       
  149.                                 if(zjyd_ASK)                        //應答是NASK,就中止
  150.                                 return ;
  151.                                 else
  152.                                 {
  153.                                         I2C_MasterStart();                         // START
  154.                                         zjyd_ASK = I2C_MasterSendByte(SLAW);       //發送從設備地址+讀
  155.                                                 if(!zjyd_ASK)                          // 收到ASK就向AT24C256讀1字節數據
  156.                                                 {
  157.                                                 dat = I2C_MasterReadByte(zjyd_ASK);   //就讀1個字節,入口參數是非應答
  158.                                                 I2C_MasterStop();                                 //發送停止命令
  159.                                                 }
  160.                                                
  161.                                 }
  162.                
  163.                 }
  164.         }
  165.        


  166. }


  167. //--------------------------------功能函數--------------------------------
  168. // (器件24C256的應答ASK或者NASK)
  169. //存儲地址超過2K的,要用16位地址,連續讀取iic幾個字節的函數
  170. void IIC_Write_NByte(u8 addrH,u8 addrL, u8 *p, u8 number) /*  WordAddress,1st Data Address,2nd Data
  171. Address,Byte lenth 在芯片addrH+addrL開始的地址里寫入p的內容,長度是number個字節,F0=0,right, F0=1,error */

  172. {                                               //
  173.         // 1. 發送起始信號+設備地址(寫模式)
  174.         I2C_MasterStart();                          // START
  175.         zjyd_ASK = I2C_MasterSendByte(SLAW);       //主機模式發送1字節數據,函數返回: 接收的應答信號0為ACK),1為NAK
  176.                                                                                        // 設備地址 + 寫命令(最后一位是0)
  177.         if(!zjyd_ASK)                              // 2. 收到ASK就發送AT24C02地址
  178.         {
  179.                 zjyd_ASK = I2C_MasterSendByte(addrH);  //寫存儲器地址高8位
  180.                 if(!zjyd_ASK)                           // 收到ASK就發送AT24C256地址低8位
  181.                 {
  182.                 zjyd_ASK = I2C_MasterSendByte(addrL);   //寫存儲地址低8位       
  183.                                 if(zjyd_ASK)                        //應答是NASK,就中止
  184.                                 return;
  185.                                 else
  186.                                 {
  187.                                         do                                                   //開始連續寫number個字節
  188.                                         {
  189.                                                 zjyd_ASK = I2C_MasterSendByte(*p);    //寫入數組p的內容去IIC
  190.                                                 p++;                                   //指針+1,主機模式寫1字節數據,函數返回0為ACK, 1為NAK

  191.                                                 if(zjyd_ASK)  break;                   //出錯了就終止
  192.                                                
  193.                                         }
  194.                                         while(--number);
  195.                                         I2C_MasterStop();                 //發送停止命令,結束IIC通信
  196.                                 }
  197.             }
  198.         }
  199.        
  200.    
  201.        
  202. }


  203. //連續讀取iic幾個字節的函數
  204. void IIC_Read_NGByte(u8 addrH, u8 addrL, u8 *p, u8 number)  //WordAddress,1st Data Address,2nd Data Address,Byte lenth   

  205. {
  206.         // 1. 發送起始信號+設備地址(寫模式)
  207.         I2C_MasterStart();                   // START
  208.         zjyd_ASK = I2C_MasterSendByte(SLAW); //主機模式發送1字節,函數返回: 0(應答信號為ACK), 1(接收的應答信號為NAK)
  209.                                                                                  // 設備地址 + 寫命令(最后一位是0)
  210.        
  211.         if(!zjyd_ASK)  // 2. 收到ASK就發送AT24C256高位地址
  212.                 zjyd_ASK = I2C_MasterSendByte(addrH);  //發送存儲芯片AT24C256高位地址
  213.                        
  214.         if(!zjyd_ASK) // 3. 還能收到ASK就發送低位地址
  215.        
  216.                 zjyd_ASK = I2C_MasterSendByte(addrL);  //發送存儲芯片AT24C256低位地址
  217.        
  218.         if(!zjyd_ASK) // 3. 還能收到ASK就發送起始信號
  219.         {
  220.         I2C_MasterStart();                     // START
  221.         zjyd_ASK = I2C_MasterSendByte(SLAR);   //發送設備地址+讀命令
  222.         }
  223.         if(!zjyd_ASK) //4. 還能收到ASK連續讀取number字節(最后1字節發送NACK)
  224.         {
  225.                         do
  226.                         {
  227.                          *p = I2C_MasterReadByte(zjyd_ASK); //主機模式接收1字節數據,入口參數: ack (待發送的應答信號)函數返回: (接收的字節數據)
  228.                                                                                                 //讀取1字節數據函數
  229.                          p++;                                                                //指針+1
  230.                                        
  231.                         if(number!= 1)
  232.                                                
  233.                         zjyd_ASK=0;                     //發送ASK函數
  234.                         else
  235.                         zjyd_ASK=1;                     //發送NASK函數
  236.                                                        
  237.                         }while(--number);
  238.                                                  
  239.                         I2C_MasterStop();
  240.                                        
  241.         }       
  242.                                        
  243. }




  244. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>


復制代碼




作者: wuzhengmin    時間: 2025-11-11 21:50
接著是IIC.h
  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用戶文件頭說明信息  
  4. // 文件名稱: i2c.h
  5. ////////////////////////////////////////
  6. //<<AICUBE_USER_HEADER_REMARK_END>>


  7. #ifndef __I2C_H__
  8. #define __I2C_H__


  9. //<<AICUBE_USER_DEFINE_BEGIN>>
  10. // 在此添加用戶宏定義
  11. #define SLAW    0xA0                                        // IIC地址+寫 1010 0000          0xA0   (A2=0,A1=0,A0=0)
  12. #define SLAR    0xA1                                        // IIC地址+讀 1010 0001             0xA1        (A2=0,A1=0,A0=0)
  13. //<<AICUBE_USER_DEFINE_END>>


  14. void I2C_Init(void);
  15. void I2C_MasterWait(void);
  16. void I2C_MasterStart(void);
  17. void I2C_MasterStop(void);
  18. BOOL I2C_MasterSendByte(uint8_t dat);
  19. uint8_t I2C_MasterReadByte(BOOL ack);



  20. //<<AICUBE_USER_EXTERNAL_DECLARE_BEGIN>>
  21. // 在此添加用戶外部函數和外部變量聲明
  22. extern  u8 dat;
  23. void IIC_Write1Gbyte(u8 addrH,u8 addrL, u8 dat);   //寫入一個字節
  24. void I2C_MasterRead1GByte(u8 addrH,u8 addrL);
  25. void IIC_Write_NByte(u8 addrH,u8 addrL, u8 *p, u8 number); /*  WordAddress,1st Data Address,2nd Data
  26. Address,Byte lenth 在芯片addrH+addrL開始的地址里寫入p的內容,長度是number個字節,F0=0,right, F0=1,error */
  27. void IIC_Read_NGByte(u8 addrH, u8 addrL, u8 *p, u8 number);  //WordAddress,1st Data Address,2nd Data Address,Byte lenth   

  28. //<<AICUBE_USER_EXTERNAL_DECLARE_END>>


  29. #endif
復制代碼




作者: wuzhengmin    時間: 2025-11-11 21:51
再看MAX7219.c

  1. #include "MAX7219.h"
  2. #include "config.h"

  3. //地址、數據發送子程序
  4. void Write7219(unsigned char address,unsigned char dat)
  5. {  
  6.     unsigned char i;
  7.     CS=0;                       //拉低片選線,選中器件
  8.     //發送地址
  9.     for (i=0;i<8;i++)           //移位循環8次            
  10.     {   
  11.        CLK=0;                   //清零時鐘總線
  12.        DIN=(bit)(address&0x80); //每次取高字節     
  13.        address<<=1;             //左移一位
  14.        CLK=1;                   //時鐘上升沿,發送地址
  15.     }
  16.     //發送數據
  17.     for (i=0;i<8;i++)              
  18.     {  
  19.        CLK=0;
  20.        DIN=(bit)(dat&0x80);   
  21.        dat<<=1;
  22.        CLK=1;                  //時鐘上升沿,發送數據
  23.     }
  24.     CS=1;                      //發送結束,上升沿鎖存數據                     
  25. }
  26. //MAX7219初始化,設置MAX7219內部的控制寄存器
  27. void Initial(void)               
  28. {
  29.     Write7219(SHUT_DOWN,0x01);         //開啟正常工作模式(0xX1)
  30.     Write7219(DISPLAY_TEST,0x00);      //選擇工作模式(0xX0)
  31.     Write7219(DECODE_MODE,0xff);       //選用全譯碼模式
  32.     Write7219(SCAN_LIMIT,0x07);        //8只LED全用
  33.     Write7219(INTENSITY,0x02);         //設置初始亮度,共有16級可選擇,用于設置SMG的顯示亮度,從0x00~0x0F
  34. }
復制代碼




作者: wuzhengmin    時間: 2025-11-11 21:52
接著是MAX7219.h
  1. #ifndef __MAX7219_H__
  2. #define __MAX7219_H__

  3. #include <STC32G.h>

  4. sbit CLK = P6^4;                   //MAX7219串行時鐘CLK   
  5. sbit CS = P6^5;                          //MAX7219片選CS                 
  6. sbit DIN = P6^6;                   //MAX7219串行數據DIN     


  7. #define DECODE_MODE  0x09   //譯碼控制寄存器
  8. #define INTENSITY    0x0A   //亮度控制寄存器,有16級可選擇,用于設置LED的顯示亮度,從0xX0~0xXF
  9. #define SCAN_LIMIT   0x0B   //掃描界限寄存器
  10. #define SHUT_DOWN    0x0C   //關斷模式寄存器
  11. #define DISPLAY_TEST 0x0F   //測試控制寄存器     

  12. void Write7219(unsigned char address,unsigned char dat);
  13. void Initial(void);

  14. #endif
復制代碼




作者: wuzhengmin    時間: 2025-11-11 21:56
器件很簡單:

STC32G12K128 屠龍刀1塊,MAX7219  8位數碼管1個 AT24C256 IIC 存儲芯片一塊

編譯環境 :256

μVision V5.14.2

CKeil_v5\C251BIN C251.exe V5.60.0.0
A251.exe V4.69.13.0
L251.exe V4.66.93.0LIB251.exe OH251.exe S251.DLL DCORE51.DLL V4.30.1.0V1.47.0.0
V3.129.0.0
V2.81.6.0


作者: wuzhengmin    時間: 2025-11-11 22:00
最后我把程序打包,壓縮發上來:


STC32G IIC256 MAX7219.zip

426.48 KB, 下載次數: 0, 下載積分: 黑幣 -5


作者: wuzhengmin    時間: 2025-11-11 22:01
歡迎大家多交流
作者: joyb    時間: 2025-11-13 08:27
c251如何安裝?




歡迎光臨 (http://m.izizhuan.cn/bbs/) Powered by Discuz! X3.1
国产一区二区久久精品| 国产精品手机在线观看| 久久精品国产视频| 欧美性生交xxxxx久久久| 粉嫩欧美一区二区三区高清影视| 国产精品对白| av中文资源在线资源免费观看| www狠狠操| 午夜视频福利在线| 一级片中文字幕| 成年人在线观看av| 欧美 日韩 国产 激情| 欧美精品人人做人人爱视频| 欧美性在线观看| 亚洲男人天堂九九视频| 欧美日韩在线播放三区四区| 国产精品亲子伦对白| 日本成人在线一区| 国产精品传媒精东影业在线| www.久久爱.com| 男人天堂亚洲天堂| 免费在线观看一级毛片| 成色在线视频| 免费看污片的软件| 亚洲精品国产一区二区在线| 国产毛片久久久久| 国产又大又黄又粗| 我家有个日本女人| 黑人巨大精品欧美| 一区二区三区国产好的精华液| 国产 国语对白 露脸| 蜜桃狠狠色伊人亚洲综合网站| 欧美专区日韩视频| 欧美日韩成人网| 在线观看国产精品淫| 日韩欧美亚洲国产另类| 欧美在线综合视频| 调教+趴+乳夹+国产+精品| 中文字幕 久热精品 视频在线| 国产a视频精品免费观看| 日本欧美一区二区在线观看| 伊人激情综合| 午夜欧美理论片| 日本不卡电影| 成人网18免费网站| 免费福利视频一区| www.成人网| 在线观看欧美| 国产日本久久| 日韩一区精品| 欧美日韩激情电影| 亚洲精品久久久久久久久久久久久久| 欧美精品一级片| 成人高潮免费视频| 国产高潮流白浆| 国产这里有精品| 国产高潮国产高潮久久久91| 人妻一区二区视频| 久久午夜福利电影| 成人性视频免费看| 亚洲综合久久av一区二区三区| 草草影院第一页| 一级黄色片大全| www在线观看免费视频| 亚洲精品乱码久久久久久不卡| 国产艳妇疯狂做爰视频| 青青草视频成人| 中国美女黄色一级片| 国产不卡在线观看视频| 国产成人免费在线观看视频| 精品亚洲乱码一区二区| 久久精品视频免费在线观看| 久久伊人成人网| 免费在线不卡视频| 日韩欧美一级大片| 日本午夜一区二区| 韩国一区二区三区| 99精品久久久久久| 中文幕一区二区三区久久蜜桃| 国产精品国产自产拍高清av王其| 亚洲美女区一区| 欧美性生活大片免费观看网址| 欧美伊人久久久久久午夜久久久久| 91久久精品国产91性色tv | 国产福利视频一区二区| 国产噜噜噜噜噜久久久久久久久 | 在线一区视频观看| 久久99成人| 国产探花一区二区| 午夜日韩视频| 开心九九激情九九欧美日韩精美视频电影| 国产毛片精品视频| 国产视频视频一区| 亚洲国产精品麻豆| 91精品国产一区二区三区香蕉| 日韩精品亚洲精品| 欧美理论片在线观看| 国产成人精品久久二区二区91| 舔着乳尖日韩一区| 色偷偷一区二区三区| 欧美一区二区三区视频在线| 亚洲精品资源美女情侣酒店| 精品中文字幕视频| 成人黄在线观看| 天堂资源在线亚洲视频| 青青视频在线播放| 波多野结衣先锋影音| 欧美日韩偷拍视频| 91在线公开视频| 欧美高清xxxx性| 人成在线视频| 黑人极品ⅴideos精品欧美棵| 中文成人激情娱乐网| 精品国产午夜| 日本视频在线一区| 中文字幕不卡在线| 欧美猛男gaygay网站| 爽爽爽爽爽爽爽成人免费观看| 日韩美女在线播放| 日韩欧美亚洲精品| 在线观看的毛片| 亚洲欧美另类日本| 99精品人妻无码专区在线视频区| 国产l精品国产亚洲区在线观看| 97香蕉久久| 中文字幕在线视频久| 亚州av一区| 男人操女人的视频在线观看欧美| 国产性色一区二区| 9191成人精品久久| 国模视频一区二区三区| 久久亚裔精品欧美| 天天干天天操天天做| 精国产品一区二区三区a片| 日本免费一区视频| 欧美艹逼视频| 日韩一区二区三区免费| 国产精品二区不卡| 成人免费高清视频在线观看| 丰满岳妇乱一区二区三区| 亚洲图片欧美日产| 岛国一区二区三区高清视频| 日韩中文字幕在线视频观看| 无码少妇一区二区| 亚洲国产精品一| 婷婷综合影院| 欧美一区=区三区| 一区二区久久| 樱桃国产成人精品视频| 精品视频中文字幕| 亚洲综合小说区| 男操女免费网站| 日韩福利片在线观看| 欧美日韩亚洲色图| 69亚洲精品久久久蜜桃小说| 国产精品你懂的在线观看| av网站大全在线观看| 久久亚洲道色| 国产伦理精品不卡| 欧美怡红院视频| 国产精品久久久久av| 亚洲精品无码久久久久久| 四虎成人精品永久免费av| 99高清免费国产自产拍| av在线免费播放| 99国产精品一区二区| 久久欧美一区二区| 亚洲免费视频一区二区| 蜜桃免费一区二区三区| 亚洲午夜福利在线观看| 男人的天堂色| 国产在线高清理伦片a| 天天综合一区| 亚洲免费在线观看视频| 久久夜色精品亚洲噜噜国产mv| 亚洲精蜜桃久在线| 永久av免费网站| 尤物在线观看视频| 成人短视频app| 日本欧美在线观看| 日韩一区二区三区av| 91久久国产综合久久91精品网站| www.桃色.com| www.国产视频| 黄色小视频在线免费观看| 精品午夜久久| 亚洲蜜桃精久久久久久久| 97精品国产aⅴ7777| 日本www在线播放| 亚洲天堂中文网| 日韩美女一级视频| sdde在线播放一区二区| 中文字幕一区日韩精品欧美| 久久天天躁狠狠躁夜夜躁| 男人草女人视频| 欧美男人亚洲天堂| 欧美精品一区二区三区涩爱蜜| 亚洲影院天堂中文av色| 中文字幕亚洲精品在线观看| 九九久久国产精品| 成人精品小视频| 精品国产av一区二区三区| 韩日视频在线| 亚洲经典三级| 欧美美女bb生活片| 久久涩涩网站| 欧美黄色一区二区三区| 黄色一级片视频| 欧美日韩一二三四| 五月婷婷激情综合| 91欧美精品成人综合在线观看| 完美搭档在线观看| 高清精品一区二区三区一区| 欧美男女视频| 97久久中文字幕| 国产日韩欧美电影| 91成人在线播放| 日本一本在线视频| 久久精品成人欧美大片免费| 欧美视频精品| 亚洲欧洲另类国产综合| 国产精品激情自拍| 色婷婷av777| 999www成人| 国产一区二区三区网| 黄网站色欧美视频| 国产在线播放一区二区| 国产亚洲欧美精品久久久久久| 福利资源在线久| 国产精品www.| 亚洲第一精品夜夜躁人人爽| 97超碰国产精品| 亚洲av无码乱码在线观看性色| 91福利在线免费| 99视频精品全部免费在线| 欧美精品久久久久a| 亚洲欧美高清在线| h在线观看视频免费网站| 欧美日韩老妇| 日韩你懂的在线播放| 日韩精品一区二区三区四| 亚洲av无码一区二区三区性色| 在线视频超级| 欧美激情在线看| 成人午夜黄色影院| 国产五月天婷婷| 欧美r级在线| 国产精品亚洲人在线观看| 久久免费视频在线观看| 国产精品第七页| 黄页网址在线观看| 肉丝袜脚交视频一区二区| 最近2019免费中文字幕视频三| 久久久久xxxx| eeuss影院eeuss最新直达| 在线看片不卡| 日韩极品精品视频免费观看| 看欧美ab黄色大片视频免费| xxx欧美老熟| 久久久久亚洲| 国产午夜精品免费一区二区三区 | 激情六月婷婷久久| 久久久免费在线观看| 少妇久久久久久久久久| 最新中文在线视频| 蜜臀久久久久久久| 555www成人网| 麻豆亚洲av成人无码久久精品| 米奇精品一区二区三区| 久久一区二区视频| 国产精品久久国产三级国电话系列| 国产又大又黄又粗| 户外露出一区二区三区| av动漫精品一区二区| 欧美性色黄大片| 啊啊啊一区二区| 黄色a**址| 99国产精品久久久久久久| 俺去啦;欧美日韩| 最新中文字幕av| 免费在线毛片网站| 最新国产精品久久精品| 日韩激情视频| 日韩一本大道| 重囗味另类老妇506070| 日韩亚洲国产中文字幕| 国产精品国产三级国产专业不| 在线观看二区| 国产精品全国免费观看高清| 亚洲7777| 久久精品最新免费国产成人| 欧美视频官网| 高清在线视频日韩欧美| 久久久国产精品黄毛片| 色在线中文字幕| 日韩欧美国产成人| 国产成人av影视| 浪潮av在线| 不卡的看片网站| 欧美lavv| 欧美videos另类| 99精品福利视频| 国产精品99久久久久久久久久久久 | 久久久久久久欧美精品| 69精品小视频| 亚洲黄色免费观看| 亚洲日本视频在线| 欧美性性性性性ⅹxxbbbb| 国产精品国产三级国产三级人妇 | 欧美一区二区网站| 国产视频三区四区| 57pao成人永久免费| 影音先锋欧美精品| 亚洲精品一区二三区| 91精品国产福利在线观看麻豆| 国产日韩精品在线观看| 欧美白人猛性xxxxx交69| 国产v综合v亚洲欧| 无码人妻丰满熟妇区96| av网站无病毒在线| 欧美一区二区三区在线| 久久久精品99| 91亚洲人成网污www| 亚洲jizzjizz日本少妇| 日日夜夜网站| 亚洲国产精品精华液ab| 狠狠躁狠狠躁视频专区| sqte在线播放| 亚洲一级黄色片| 精品国精品国产自在久不卡| 99爱在线观看| 欧美v亚洲v综合ⅴ国产v| 日本在线视频免费观看| 亚洲欧美亚洲| 人禽交欧美网站免费| 色网址在线观看| 欧美在线播放高清精品| 久草网在线观看| 91精品久久久久久久蜜月 | www日本视频| 毛片av一区二区| 日韩精品一区二区免费| 理论片午午伦夜理片在线播放| 欧美成人video| 在线观看国产精品入口男同| 亚洲综合日韩| 日韩精品一区二区三区四| v天堂福利视频在线观看| 精品一区二区三区四区在线| 国产精品久久777777换脸| 青青草国产精品97视觉盛宴| 美女扒开大腿让男人桶| 俄罗斯一级**毛片在线播放| 色七七影院综合| 777片理伦片在线观看| 中文字幕的久久| 我不卡一区二区| 国产精品久久久乱弄| 欧美日韩国产一二| 国产在线观看网站| 日韩大陆毛片av| 亚洲第一视频在线| 99视频精品全部免费在线| 风韵丰满熟妇啪啪区老熟熟女| 日韩成人视屏| 亚洲一区二区少妇| 一区二区三区四区在线免费视频| 日韩天堂在线观看| 国产日韩欧美视频在线观看| 粉嫩欧美一区二区三区高清影视| 国产黄色一区二区三区| 国产精品高潮呻吟久久久久| 国产精品高清一区二区三区| 神马久久精品| 国产视频精品免费播放| 亚洲第一色网| 国产精品免费看片| 中文字幕91视频| 亚洲精品婷婷| 亚洲国产精品久久久久爰色欲| 福利一区二区免费视频| 国产精品视频播放| 两个人hd高清在线观看| 亚洲精品一区在线观看| 亚洲欧洲国产综合| 一区二区中文字幕在线| 成人性生活毛片| 日韩高清不卡在线| 色婷婷.com| 蜜桃a∨噜噜一区二区三区| 欧美日韩在线精品| 日韩经典av| 青青草精品毛片| 美女的诞生在线观看高清免费完整版中文 | 欧美色图17p| 亚洲欧美日韩综合国产aⅴ| 狠狠操精品视频| 日韩精品导航| 熟妇熟女乱妇乱女网站| 欧洲亚洲两性|