📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: MMC存储卡测试
//-----------------------------------------------------------------
// 说明: 本例运行时,按下K1将向MMC卡第0块写入512个有序字节,按下K2时
// 将向第512块写入512个随机字节,按下K3与K4时将分别读取并通过
// 虚拟终端显示这些字节数据.
//
//-----------------------------------------------------------------
#define _XTAL_FREQ 4000000UL
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
//定义按键操作
#define K1_DOWN() (RB0 == 0)
#define K2_DOWN() (RB2 == 0)
#define K3_DOWN() (RB4 == 0)
#define K4_DOWN() (RB6 == 0)
//MMC相关函数
extern INT8U MMC_Initialise();
extern INT8U MMC_Read_Block(INT32U address);
extern INT8U MMC_Write_Block(INT32U address,INT8U *buffer);
//MMC块字节读写缓冲
INT8U Block_bytes[512];
//MMC卡操作错误标识(为1表示正常,为0表示出错)
INT8U ERROR_Flag = 1;
#define SPI_CS LATCbits.LATC2 //SPI片选定义为LATC2
//-----------------------------------------------------------------
// 以十六进制形式显示所读取的字节
//-----------------------------------------------------------------
void Show_Byte_by_HEX(INT8U *Buffer, INT32U Len)
{
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
INT32U i;
TRISB = 0xFF; RBPU = 0; //按键输入,内部弱上拉
//USART初始化
//调用PIC-C18串口初始化库函数
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_BRGH_HIGH,
_XTAL_FREQ/16/9600 - 1
);
//SPI初始化
putsUSART((char*)"Initialise MMC, Please Waiting.....");
TRISC2 = 0; //设置CS控制输出引脚
SPI_CS = 1; //使能MMC
//SPI主机模式,时钟 = FOSC/16,设置SPI总线模式0,0
OpenSPI(SPI_FOSC_16, MODE_00, SMPEND);
__delay_ms(100);
//初始化MMC
ERROR_Flag = MMC_Initialise();
if (ERROR_Flag) putsUSART((char*)"OK!\r\r"); else putsUSART((char*)"ERROR!\r\r");
//提示进行K1-K4操作
putsUSART((char*)"Plase Press K1,K2,K3 or K4 to Play MMC Test...\r\r");
//设置随机种子
srand(300);
while(1)
{
//未按键则等待----------------------------------------------
//如果上次MMC出错则重新初始化SPI接口与MMC卡
if (ERROR_Flag == 0) //------------------------------------
{
}
//根据按键操作代号分别进行操作,因为上述可能的重新初始化会耗费较多时间,
//如果在这里仍用K1~K4的DOWN判断时,按键可能已经释放,从而导致判断失效.
//因此这里使用的是提前获取的按键操作代号
if (K1_DOWN()) //------------------------------------------
{
}
else if (K2_DOWN()) //------------------------------------
{
}
else if (K3_DOWN()) //------------------------------------
{
}
else if (K4_DOWN()) //------------------------------------
{
}
//等待释放按键----------------------------------------------
next: while (K1_DOWN() || K2_DOWN() || K3_DOWN() || K4_DOWN());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -