先看主程序:
- //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
- ////////////////////////////////////////
- // 在此添加用戶文件頭說明信息
- // 文件名稱: main.c
- // 文件描述:
- // 文件版本: V1.0
- // 修改記錄:
- // 1. (2025-11-06) 創建文件
- ////////////////////////////////////////
- //<<AICUBE_USER_HEADER_REMARK_END>>
- #include "config.h" //默認已包含stdio.h、intrins.h等頭文件
- //<<AICUBE_USER_INCLUDE_BEGIN>>
- // 在此添加用戶頭文件包含
- #include "i2c.h"
- #include "MAX7219.h"
- // 8位Max7219數碼管模塊顯示, CLK = P6^4;CS = P6^5; DIN = P6^6;
- //選擇I2C數據口: SCL(P2.5), SDA(P2.4),IIC分頻系數n=60
- //<<AICUBE_USER_INCLUDE_END>>
- //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
- // 在此添加用戶全局變量定義、用戶宏定義以及函數聲明
- void PlaySMG(u8 tmp_1[8]);
- char code LEDcode[]=
- {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全滅*/
- ,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff}; /*A,B,C,D,E,F,P,U,全亮*/
- char code table[]={
- 0x7e, //0
- 0x18, //1
- 0x37, //2
- 0x3d, //3
- 0x59, //4
- 0x6d, //5
- 0x6f, //6
- 0x38, //7
- 0x7f, //8
- 0x7d, //9
- 0x7b, //A
- 0x4F, //b
- 0x66, //C
- 0x1F, //d
- 0x67, //E
- 0x63, //F
- }; //共陰
- //<<AICUBE_USER_GLOBAL_DEFINE_END>>
- ////////////////////////////////////////
- // 項目主函數
- // 入口參數: 無
- // 函數返回: 無
- ////////////////////////////////////////
- void main(void)
- {
- //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
- // 在此添加用戶主函數初始化代碼
- u8 i=0;
- u8 tmp[8];
- //<<AICUBE_USER_MAIN_INITIAL_END>>
- SYS_Init();
- //<<AICUBE_USER_MAIN_CODE_BEGIN>>
- // 在此添加主函數中運行一次的用戶代碼
- Initial(); //MAX7219初始化
- P40 = 0; //三極管引腳輸出低電平
- P60 = 0; //輸出低電平 //這2顆燈亮了
- P61 = 0; //輸出低電平 //說明這段程序是執行了
- delay_ms(2000);//經STC論壇版主erci***指導“print_usb并非阻
- //塞函數,所以在打開串口前可能已經打印完成了。 所以延時應放在打印前,或者在循環里
- //每隔1s反復打印這樣每次打開串口都能看到。”
- // printf_usb( " A 首先從24C02讀取8個數\xfd: \r\n");
- // printf_usb( " B 把從24C02讀取8個數\xfd加1后寫入24C02:\r\n");
- // printf_usb( " C 把從24C02讀取8個數\xfd減1后寫入24C02:\r\n");
- // printf_usb( " D 把24C02地址0x0000的8個數\xfd清零: \r\n");
- //printf_usb( " 發字符給printf_usb,引發bUsbInBusy檢測 \r\n");
- //可以先printf再while(bUsbInBusy == 1);,但是這樣依然看不到第一條printf的
- //while(bUsbInBusy==1) //cdc串口發數據之前可以判斷一下當前的usb狀態,等他空閑了再發,
- //實測這樣一點問題沒有,但是我們這里不行啊
- //{
- printf_usb( " A 首先從24C256讀取8個數: \r\n");
- printf_usb( " B 把從24C256讀取8個數加1后寫入24C256:\r\n");
- printf_usb( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
- printf_usb( " D 把24C256地址0x0000k開始的8個數清零: \r\n");
- //};
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
-
- for( i=0;i<8;i++ )
- {
- printf_usb( "%u\t ",tmp[i] );
- } //為什么串口助手看不到以上打印結果?
- //可能是USB查詢方式,只有在回答查詢的時候才輸出?
-
-
-
- PlaySMG(tmp); //數碼管打印8個字節
-
- //<<AICUBE_USER_MAIN_CODE_END>>
- while (1)
- {
- // USBLIB_OUT_Done(); //查詢方式處理USB接收的數據
- //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
- // 在此添加主函數中用戶主循環代碼
- if( bUsbOutReady )
- {
- //USB_SendData(UsbOutBuffer,OutNumber);
-
-
-
- switch( UsbOutBuffer[0] )
- {
- case 'A': //
- //printf("從24C02讀出8個數\xfd據: \r\n");
- printf("從24C256讀出8個數據: \r\n");
- //-----------------------讀取數據-----------------------
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
-
- for( i=0;i<8;i++ )
- {
- printf( "%u\t",tmp[i] );
- /* 以十進制打印
- "%u\t" 是格式化字符串,其中:%u 是一個格式控制符,用于指定輸出一個無符號整數。
- \t 是一個轉義字符,表示輸出一個水平制表符。dat[i] 是要輸出的數據,它應該是一個無符號整數類型的數組元素。
- %u格式控制符用于將數字轉換為無符號整數格式。無符號整數是指不帶符號的整數,即只能表示零和正數的整數類型
- */
- }
- printf( "讀取結束\r\n");
-
- PlaySMG(tmp); //數碼管打印8個字節
- delay_ms(200);
-
- break;
- case 'B':
-
- printf( " B 把從24C256讀取8個數加1后寫入24C02:\r\n");
- //-----------------------寫入修改后的數據-----------------------
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
- for( i=0;i<8;i++ )
- {
- tmp[i] = (tmp[i] +1);
- }
- IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都加1后,原位置寫回去
-
- delay_ms(200);
- printf("加1后存儲完成再從24C256讀出8個數據: \r\n");
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
-
- for( i=0;i<8;i++ )
- {
- printf( "%u\t",tmp[i] );
- }
-
- PlaySMG(tmp); //數碼管打印8個字節
- delay_ms(200);
-
- printf("請比較差別,證實加1寫入成功\r\n");
- break;
- case 'C':
-
- printf( " C 把從24C256讀取8個數減1后寫入24C256:\r\n");
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
- for( i=0;i<8;i++ )
- {
- tmp[i] = (tmp[i] -1);
- }
- IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,讀取8個字節,都減1后,原位置寫回去
-
- delay_ms(200);
-
- printf("減1后存儲完成再從24C256讀出8個數據: \r\n");
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
-
- for( i=0;i<8;i++ )
- {
- printf( "%u\t",tmp[i] );
- }
- delay_ms(200);
-
- printf("請再次比較差別,證實減1寫入成功\r\n");
- PlaySMG(tmp); //數碼管打印8個字節
- break;
- case 'D':
- printf( " D 把24C256地址0x0000開始的8個數清零::\r\n");
-
- for( i=0;i<8;i++ )
- {
- tmp[i] = 0x00;
- }
- IIC_Write_NByte(0x00,0x08,tmp,8); //從地址 0x0008 開始,數組成員都變0后,原位置寫回去
-
- delay_ms(200);
-
- printf( " D 24C256地址0x0000開始的8個數已經變成::\r\n");
- IIC_Read_NGByte(0x00,0x08,tmp,8); // 從地址 0x0008 開始,讀取8個字節,存入tmp[8]中
-
- for( i=0;i<8;i++ )
- {
- printf( "%u\t",tmp[i] );
- }
- delay_ms(200);
-
- printf("請再次比較差別,證實清零成功\r\n");
- PlaySMG(tmp); //數碼管打印8個字節
- break;
-
- default:
-
- break;
- }
- usb_OUT_done();
-
- }
-
- //<<AICUBE_USER_MAIN_LOOP_END>>
- }
- }
- ////////////////////////////////////////
- // 系統初始化函數
- // 入口參數: 無
- // 函數返回: 無
- ////////////////////////////////////////
- void SYS_Init(void)
- {
- EnableAccessXFR(); //使能訪問擴展XFR
- AccessCodeFastest(); //設置最快速度訪問程序代碼
- AccessIXramFastest(); //設置最快速度訪問內部XDATA
- IAP_SetTimeBase(); //設置IAP等待參數,產生1us時基
- //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
- // 在此添加用戶預初始化代碼
- //<<AICUBE_USER_PREINITIAL_CODE_END>>
- P0M0 = 0x00; P0M1 = 0x00; //初始化P0口為準雙向口模式
- P1M0 = 0x00; P1M1 = 0x00; //初始化P1口為準雙向口模式
- P2M0 = 0x00; P2M1 = 0x00; //初始化P2口為準雙向口模式
- P3M0 = 0x00; P3M1 = 0x00; //初始化P3口為準雙向口模式
- P4M0 = 0x00; P4M1 = 0x00; //初始化P4口為準雙向口模式
- P5M0 = 0x00; P5M1 = 0x00; //初始化P5口為準雙向口模式
- P6M0 = 0x00; P6M1 = 0x00; //初始化P6口為準雙向口模式
- P7M0 = 0x00; P7M1 = 0x00; //初始化P7口為準雙向口模式
- I2C_Init(); //I2C初始化
- delay_ms(1);
- USBLIB_Init(); //USB庫初始化
- delay_ms(1);
- //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
- // 在此添加用戶初始化代碼
- //<<AICUBE_USER_INITIAL_CODE_END>>
- EnableGlobalInt(); //使能全局中斷
- USBLIB_WaitConfiged(); //等待USB完成配置
- }
- ////////////////////////////////////////
- // 微秒延時函數
- // 入口參數: us (設置延時的微秒值)
- // 函數返回: 無
- ////////////////////////////////////////
- void delay_us(uint16_t us)
- {
- do
- {
- NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6
- } while (--us);
- }
- ////////////////////////////////////////
- // 毫秒延時函數
- // 入口參數: ms (設置延時的毫秒值)
- // 函數返回: 無
- ////////////////////////////////////////
- void delay_ms(uint16_t ms)
- {
- uint16_t i;
- do
- {
- i = MAIN_Fosc / 6000;
- while (--i);
- } while (--ms);
- }
- //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
- // 在此添加用戶函數實現代碼
- ////////////////////////////////////////
- // MAX7219顯示函數
- // 入口參數: tmp_1[8]數組 (要顯示的8個數的數組)
- // 函數返回: 無
- ////////////////////////////////////////
- void PlaySMG(u8 tmp_1[8])
- {
- Write7219(8,tmp_1[0]); //數碼管左邊第1位,如果給15就是熄滅
- Write7219(7,tmp_1[1]); //數碼管左邊第2位
- Write7219(6,tmp_1[2]); //數碼管左邊第3位
- Write7219(5,tmp_1[3]); //數碼管左邊第4位
- Write7219(4,tmp_1[4]); //數碼管左邊第5位,如果給15就是熄滅
- Write7219(3,tmp_1[5]); //數碼管左邊第6位
- Write7219(2,tmp_1[6]); //數碼管左邊第7位
- Write7219(1,tmp_1[7]); //數碼管左邊第8位 99--3 100--4 101--5 102--6 103--7 104--8 105--9
- //Write7219(1,LEDcode[14]|0x80); //數碼管左邊第8位 106--"-" 107--E 108--H 109--L 91--E 92--H
- }
- //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
復制代碼
|