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