📄 main.c
字号:
#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>
#include "d12.h"
#include "main.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "sys/alt_irq.h"
#include "mydata.h"
#include "draw.h"
#define TEXT_START_ADDR (alt_u8 *)(0x40000 + SRAM_BASE)
#define TXT_START_XP 16
#define TXT_START_YP 50
/***********************************************/
static void Timer_ISR_Init(void); //定时器中断初始化
static void D12_ISR_Init(void); //D12中断初始化
void Start_Reading(void); //开始阅读
void Exit_Reading(void); //退出阅读
void Delete_Text(void); //删除所有文本
void Display_Text(void); //显示文本
/***********************************************/
alt_u8 KeyTab[]={ 0x4e,0x67,0x47,0x27,
0x6b,0x4b,0x2b,0x6d,
0x4d,0x2d,0x07,0x0b,
0x0d,0x0e,0x6e,0x2e };
alt_u8 KB_Scan_Tab[8] = {0x0e, 0xff, 0x0d, 0xff, 0x0b, 0xff, 0x07, 0xff};
alt_u8 KeyValue, mKey;
alt_u8 KeyScanNum, PressedKeyNum = 0, KeyPressedFlag;
/***********************************************/
alt_u32 Text;
alt_u32 Read_Flag;
alt_u32 Text_Len;
alt_u8 *pRead_Text;
alt_u8 *pWrite_Text;
/***********************************************/
alt_u8 Title[] = {"-==- USB 文本阅读器 -==-"};
alt_u8 Help[] = {"A:开始阅读 C:退出阅读 D:删除已下载文件 *:返回首页 #:下一页"};
alt_u8 NoContent[] = {"没有文件可阅读,请先通过USB下载!"};
/***********************************************/
int main(void)
{
printf("Exp25 - USB Text Reader!\n");
Timer_ISR_Init(); //初始化定时器和D12中断
D12_ISR_Init();
USB_Port_Init(); //初始化USB端口
//初始化显示界面和帮助信息
DrawFillRect(0, 0, 640, 480, COLOR_PURPLE);
DisplayAnyString(Title, 192, 16, COLOR_PURPLE, COLOR_YELLOW);
DisplayAnyString(Help, 40, 460, COLOR_RED, COLOR_YELLOW);
DrawFillRect(0, 450, 640, 2, COLOR_WHITE); //画按键说明分界线
DrawFillRect(0, 454, 640, 2, COLOR_WHITE);
Delete_Text();
while(1)
{
if(mKey<16)
{
if(mKey == 0xa && Text_Len && Read_Flag==FALSE) //A:开始阅读
{
Start_Reading();
Display_Text();
}
else if(mKey == 0xc && Read_Flag) //C:Exit
Exit_Reading();
else if(mKey == 0xd && Read_Flag) //D:Del All Text
Delete_Text();
else if(mKey == 0xe && Read_Flag) //*:Back Page
{
pRead_Text = TEXT_START_ADDR;
Display_Text();
}
else if(mKey == 0xf && Read_Flag) //#:Next Page
Display_Text();
mKey = 0xff;
}
usleep(50000);
}
return 0;
}
/***********************************************/
//Timer ISR
static void Timer_Irq_Handler(void *context, alt_u32 id)
{
alt_u8 i;
KeyScanNum = (KeyScanNum + 1) % 8;
//判断有无按键按下
IOWR_ALTERA_AVALON_PIO_DATA(KB_COL_BASE, KB_Scan_Tab[KeyScanNum]);
KeyValue = IORD_ALTERA_AVALON_PIO_DATA(KB_ROW_BASE) & 0x0f;
if(KeyValue != 0x0f && !KeyPressedFlag)
{
KeyPressedFlag = TRUE;
PressedKeyNum = KeyScanNum;
//转换键值
KeyValue |= KeyScanNum << 4;
for(i=0; i<16; i++)
{
if(KeyValue == KeyTab[i])
{
mKey = i;
break;
}
}
}
else if(PressedKeyNum == KeyScanNum && KeyValue == 0x0f && KeyPressedFlag)
KeyPressedFlag = FALSE;
//清除Timer中断标志寄存器
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);
}
//D12 ISR
static void D12_Irq_Handler(void *context, alt_u32 id)
{
alt_u16 Int_Flag;
Int_Flag=USB_Read_INT_Flag(); //读取中断标志
if(Int_Flag & 0x0001) //端点0 OUT中断
USB_EndPoint0_OUT();
if(Int_Flag & 0x0002) //端点0 IN 中断
USB_EndPoint0_IN();
if(Int_Flag & 0x0004) //端点1 OUT中断
USB_EndPoint1_OUT();
if(Int_Flag & 0x0008) //端点1 IN 中断
USB_EndPoint1_IN();
if(Int_Flag & 0x0010) //端点2 OUT中断
USB_EndPoint2_OUT();
if(Int_Flag & 0x0020) //端点2 IN 中断
USB_EndPoint2_IN();
//清除D12中断标志寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(D12_INT_BASE, 0);
}
/************************************************/
static void Timer_ISR_Init(void) //初始化Timer中断
{
//清除Timer中断标志寄存器
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);
//注册Timer中断
alt_irq_register(TIMER_IRQ, NULL, Timer_Irq_Handler);
//允许Timer中断
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 0x01);
}
/************************************************/
static void D12_ISR_Init(void) //初始化D12中断
{
//清除D12中断标志寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(D12_INT_BASE, 0);
//注册D12中断
alt_irq_register(D12_INT_IRQ, NULL, D12_Irq_Handler);
//允许D12中断
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(D12_INT_BASE, 0x01);
}
/***********************************************/
//端点2 OUT中断服务子程序
void USB_EndPoint2_OUT(void)
{
alt_u16 m_Status, Data_Len;
m_Status=USB_Read_LastStatus(ENDPOINT2_OUT);
Data_Len = USB_Read_EndPoint_Buff(ENDPOINT2_OUT, 64, pWrite_Text);
pWrite_Text += Data_Len;
Text_Len += Data_Len;
}
/********************************************************************/
void Start_Reading(void) //开始阅读
{
DrawFillRect(TXT_START_XP, TXT_START_YP, 608, 368, COLOR_PURPLE);
Read_Flag = TRUE;
}
void Exit_Reading(void) //退出阅读
{
//清零所有变量
Read_Flag = FALSE;
DrawFillRect(TXT_START_XP, TXT_START_YP, 608, 368, COLOR_PURPLE); //清屏
Display_Pic(248, 160, 144, 124, mBmp, COLOR_GREEN);
pRead_Text = TEXT_START_ADDR;
}
void Delete_Text(void) //删除所有文本
{
Text_Len = 0; //文件长度清零
Read_Flag = FALSE;
pWrite_Text = TEXT_START_ADDR;
pRead_Text = TEXT_START_ADDR;
DrawFillRect(TXT_START_XP, TXT_START_YP, 608, 368, COLOR_PURPLE); //清屏
Display_Pic(248, 160, 144, 124, mBmp, COLOR_GREEN);
DisplayAnyString(NoContent, 184, 350, COLOR_PURPLE, COLOR_GREEN);
}
/********************************************************************/
void Display_Text(void) //显示文本
{
alt_u16 row,col;
if(pRead_Text >= pWrite_Text)
return;
DrawFillRect(TXT_START_XP, TXT_START_YP, 608, 368, COLOR_PURPLE); //清屏
for(row=0; row<360; row+=16)
{
for(col=0; col<608; )
{
Text = *pRead_Text++;
if(Text < 0x20) //特殊字符
{
if(Text==0x0d && *pRead_Text==0x0a) //换行
{
pRead_Text++;
break;
}
}
else if(Text<0x80) //ASCII字符
{
DisplayChar(Text, TXT_START_XP + col, TXT_START_YP + row + 1, COLOR_PURPLE, COLOR_CYAN); //16*8
col += 8;
}
else //汉字
{
if(col<600)
{
Text = (Text<<8)+*pRead_Text++;
DisplayHanzi(Text, TXT_START_XP + col, TXT_START_YP + row, COLOR_PURPLE, COLOR_CYAN);
col += 16;
}
else
{
pRead_Text--;
break;
}
}
if(pRead_Text >= pWrite_Text)
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -