⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 NIOS II 的几个源代码
💻 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 + -