先看主程序:
- //<<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>>
复制代码
|