📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: ATA硬盘数据访问程序设计
//-----------------------------------------------------------------
// 说明: 本例基于PIC18F452+ATA-HDD硬盘组件设计的仿真电路,设计了硬盘扇区
// 的数据访问程序,从指定扇区(本例指定为第0块)读取的数据通过虚拟
// 终端显示.
//
//-----------------------------------------------------------------
#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#define _XTAL_FREQ 20000000UL //20MHz
#include <htc.h>
#include <stdio.h>
#include "ATA.h"
#define IORDY RC5 //IO就绪位
#define DIOR LATE0 //读
#define DIOW LATE1 //写
//4字节LBA地址
INT8U ATA_A0 = 0x00, ATA_A1 = 0x00,
ATA_A2 = 0x00, ATA_A3 = 0x00 ;
//ATA数据传输缓冲相关变量
INT8U ATA_BUF[10] = { 1,2,3,4,5,6,7,8,9,10 };
char s[15];
//函数声明
void INIT();
void ATA_BLOCK_Write();
void ATA_BLOCK_Read();
void ATA_DRQ_Wait();
void ATA_RDY_Wait();
void ATA_BSY_Wait();
void ATA_Send_LBA();
void ATA_Reg8_Write(INT8U reg, INT8U dat);
void ATA_Reg16_Write(INT8U reg, INT16U dat);
INT8U ATA_Reg8_Read(INT8U reg);
INT16U ATA_Reg16_Read(INT8U reg);
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
OpenUSART( USART_TX_INT_OFF & //发送中断关
USART_RX_INT_OFF & //接收中断关
USART_ASYNCH_MODE & //异步模式
USART_EIGHT_BIT & //8位收发
USART_CONT_RX & //持续接收
USART_BRGH_HIGH, //高速模式(默认值,可省)
_XTAL_FREQ/9600/16-1); //波特率
}
//-----------------------------------------------------------------
// 初始化函数
//-----------------------------------------------------------------
void INIT()
{
}
//-----------------------------------------------------------------
// 从ATA驱动器读取一个块数据
//-----------------------------------------------------------------
void ATA_BLOCK_Read()
{
}
//-----------------------------------------------------------------
// 数据未请求等待(写扇区时必须等待DRQ置位)
//-----------------------------------------------------------------
void ATA_DRQ_Wait()
{
}
//-----------------------------------------------------------------
// 驱动器未就绪等待
//-----------------------------------------------------------------
void ATA_RDY_Wait()
{
}
//-----------------------------------------------------------------
// 驱动器忙等待
//-----------------------------------------------------------------
void ATA_BSY_Wait()
{
}
//-----------------------------------------------------------------
// 向驱动器发送LBA地址(逻辑块地址,0~27位)
//-----------------------------------------------------------------
void ATA_Send_LBA()
{
ATA_Reg8_Write(ATA_IO_CHS_SECTORCNT,1); //设置扇区数
ATA_Reg8_Write(ATA_IO_LBA_0_7, ATA_A0);//设置LBA 0- 7位
ATA_Reg8_Write(ATA_IO_LBA_8_15, ATA_A1);//设置LBA 8-15位
ATA_Reg8_Write(ATA_IO_LBA_16_23, ATA_A2);//设置LBA 16-23位
//设置LBA:23-27位,并将第6位置1,标明地址是LBA格式(非CHS)
ATA_Reg8_Write(ATA_IO_LBA_24_27, ATA_A3 | 0B01000000);
}
//-----------------------------------------------------------------
// 从寄存器读取一字节数据
//-----------------------------------------------------------------
INT8U ATA_Reg8_Read(INT8U reg)
{
}
//-----------------------------------------------------------------
// 向寄存器写入一字节数据
//-----------------------------------------------------------------
void ATA_Reg8_Write(INT8U reg, INT8U dat)
{
}
//-----------------------------------------------------------------
// 从指定寄存器读取16位数据(两字节)
//-----------------------------------------------------------------
INT16U ATA_Reg16_Read(INT8U reg)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -