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

📄 hello_led.c

📁 这是一款基于NIOSII的小游戏
💻 C
字号:
#include "alt_types.h"
#include <stdio.h>
#include <unistd.h>
#include "system.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
#include "zlg_avalon_ps2keyboard.h"
#include "altera_avalon_lcd_16207.h"
#include "altera_avalon_lcd_16207_regs.h"
#include "altera_avalon_timer_regs.h"

//#include "sys/alt_alarm.h"

//#define lcd_display 0x01001030
//static alt_alarm myalarm;
//unsigned char timeout = 0;
alt_u32 time_count = 0;
unsigned char speed_level = 0;
enum /* Write to character RAM */
{
  LCD_CMD_WRITE_DATA    = 0x80
  /* Bits 6:0 hold character RAM address */
};

enum /* Write to character generator RAM */
{
  LCD_CMD_WRITE_CGR     = 0x40
  /* Bits 5:0 hold character generator RAM address */
};

enum /* Function Set command */
{
  LCD_CMD_FUNCTION_SET  = 0x20,
  LCD_CMD_8BIT          = 0x10,  //8 bit bus
  LCD_CMD_TWO_LINE      = 0x08,  //two line dis
  LCD_CMD_BIGFONT       = 0x04   //5*10 dis
};

enum /* Shift command */
{
  LCD_CMD_SHIFT         = 0x10,    //
  LCD_CMD_SHIFT_DISPLAY = 0x08,    //shift word 
  LCD_CMD_SHIFT_RIGHT   = 0x04     //
};

enum /* On/Off command */
{
  LCD_CMD_ONOFF         = 0x08,   //
  LCD_CMD_ENABLE_DISP   = 0x04,   //
  LCD_CMD_ENABLE_CURSOR = 0x02,
  LCD_CMD_ENABLE_BLINK  = 0x01    //shanshuo
};

enum /* Entry Mode command */
{
  LCD_CMD_MODES         = 0x04,
  LCD_CMD_MODE_INC      = 0x02,  //cursor shift right
  LCD_CMD_MODE_SHIFT    = 0x01   //
};

enum /* Home command */
{
  LCD_CMD_HOME          = 0x02  //reset cursor
};

enum /* Clear command */
{
  LCD_CMD_CLEAR         = 0x01  //clear the screen
};



/*alt_u32 my_alarm_callback(void * context)
{
    timeout = 1;
    return 100;//alt_ticks_per_second();
} */

void lcd_write_command(unsigned int base, unsigned char command)
{
  int i = 1000000;
  while (IORD_ALTERA_AVALON_LCD_16207_STATUS(base) & ALTERA_AVALON_LCD_16207_STATUS_BUSY_MSK)
    if (--i == 0)
    {
      return;
    }
  usleep(100);
  IOWR_ALTERA_AVALON_LCD_16207_COMMAND(base, command);
}


void lcd_write_data(unsigned int base, unsigned char data)
{
  int i = 1000000;
  while (IORD_ALTERA_AVALON_LCD_16207_STATUS(base) & ALTERA_AVALON_LCD_16207_STATUS_BUSY_MSK)
    if (--i == 0)
    {
      return;
    }
  usleep(100);

  IOWR_ALTERA_AVALON_LCD_16207_DATA(base, data);
}

void altera_avalon_lcd_16207_init0(unsigned int base)
{
  usleep(15000); //15ms
  IOWR_ALTERA_AVALON_LCD_16207_COMMAND(base, LCD_CMD_FUNCTION_SET | LCD_CMD_8BIT);
  usleep(4100);  
  IOWR_ALTERA_AVALON_LCD_16207_COMMAND(base, LCD_CMD_FUNCTION_SET | LCD_CMD_8BIT);
  usleep(1000);
  IOWR_ALTERA_AVALON_LCD_16207_COMMAND(base, LCD_CMD_FUNCTION_SET | LCD_CMD_8BIT);
  /* Setup interface parameters: 8 bit bus, 2 rows, 5x7 font */
  lcd_write_command(base, LCD_CMD_FUNCTION_SET | LCD_CMD_8BIT | LCD_CMD_TWO_LINE);
  /* Turn display off */
  lcd_write_command(base, LCD_CMD_ONOFF);
  /* Clear display */
  lcd_write_command(base, LCD_CMD_CLEAR);
  /* Set mode: increment after writing, don't shift display */
  lcd_write_command(base, LCD_CMD_MODES | LCD_CMD_MODE_INC);
  
  /* Turn display on */
  lcd_write_command(base, LCD_CMD_ONOFF | LCD_CMD_ENABLE_DISP);
}

void altera_avalon_lcd_16207_goto(unsigned int base,unsigned char i,unsigned char j)  //i行号,j列号(从零开始)
{
    unsigned char temp;
    if(i == 0)  temp = 0x80+j;
    else temp = 0x80+0x40+j;
    lcd_write_command(base,temp);
}
int main()              //40H,第二行的第一个地址
{
    alt_u16 keydata;
    alt_u32 delay_time;
    alt_u16 snapl_reg = 0x0000;
    unsigned char first= 0;
    unsigned char flag = 0,num = 0,stat = 0;
    unsigned char my_lib[] = {'a','b','c','d','e','f','g',
                                'h','i','j','k','l','m','n',
                                'o','p','q','r','s','t','u',
                                'v','w','x','y','z'};
    KeyboardInit();                        //注册键盘中断服务子程序
    altera_avalon_lcd_16207_init0(LCD_BASE);
    
    
    while(1)
  {
    
        if(!speed_level)
        {
            lcd_write_command(LCD_BASE, LCD_CMD_CLEAR);
            lcd_write_data(LCD_BASE,'S');
            lcd_write_data(LCD_BASE,'e');
            lcd_write_data(LCD_BASE,'l');
            lcd_write_data(LCD_BASE,'e');
            lcd_write_data(LCD_BASE,'c');
            lcd_write_data(LCD_BASE,'t');
            lcd_write_data(LCD_BASE,' ');
            lcd_write_data(LCD_BASE,'S');
            lcd_write_data(LCD_BASE,'p');
            lcd_write_data(LCD_BASE,'e');
            lcd_write_data(LCD_BASE,'e');
            lcd_write_data(LCD_BASE,'d');
            lcd_write_data(LCD_BASE,':');
            altera_avalon_lcd_16207_goto(LCD_BASE,1,0);
            lcd_write_data(LCD_BASE,'H');
            lcd_write_data(LCD_BASE,' ');
            lcd_write_data(LCD_BASE,' ');
            lcd_write_data(LCD_BASE,'M');
            lcd_write_data(LCD_BASE,' ');
            lcd_write_data(LCD_BASE,' ');
            lcd_write_data(LCD_BASE,'L');            
        }
        else
        {
            altera_avalon_lcd_16207_goto(LCD_BASE,0,15+num);
            IOWR_ALTERA_AVALON_TIMER_SNAPL(TIMER_1_BASE,0x0002);
            snapl_reg = IORD_ALTERA_AVALON_TIMER_SNAPL(TIMER_1_BASE);
            lcd_write_data(LCD_BASE,my_lib[snapl_reg%26]);
            num++;
            altera_avalon_lcd_16207_goto(LCD_BASE,1,(14+num));
            flag = 0;
        }
        //usleep(1000000);
        //alt_alarm_start(&myalarm,100,my_alarm_callback,NULL);
        while(1)
        {
            if(!speed_level)
            {
               
                if(keydone != 0)             //有键按下
            {
                // 中断事件减1 
                keydone--;
                keydata = KeyboardData & 0x000000ff;          //读取ASCII码
                if((KeyboardData & 0x40000)!=0x40000)         //判断输入为通码
                {
                    if(  ((keydata >= 0x20) && (keydata < 0x7f))//判断输入为ASCII码字符                 
                     && (((KeyboardData & 0x20000)!=0x20000)  //SHIFT键按下时
                            ||(keydata != 0x2e))                //若无字符键按下不操作
                        )
                    {
                        if(keydata == 'h')  {delay_time = 166666;speed_level = 1;first = 1;break;}
                        if(keydata == 'm')  {delay_time = 260000;speed_level = 1;first = 1;break;}
                        if(keydata == 'l')  {delay_time = 360000;speed_level = 1;first = 1;break;}
                     } 
                    }        
                 }
             
                }
            
            else
            {
            if(time_count++ == delay_time) break;   //166666 == 1s
            if(keydone != 0)             //有键按下
            {
                // 中断事件减1 
                keydone--;
                keydata = KeyboardData & 0x000000ff;          //读取ASCII码
                if((KeyboardData & 0x40000)!=0x40000)         //判断输入为通码
                {
                    if(  ((keydata >= 0x20) && (keydata < 0x7f))//判断输入为ASCII码字符                 
                     && (((KeyboardData & 0x20000)!=0x20000)  //SHIFT键按下时
                            ||(keydata != 0x2e))                //若无字符键按下不操作
                        )
                    {
                     if(!flag)
                     {
                        lcd_write_data(LCD_BASE,keydata);
                        if(keydata == my_lib[snapl_reg%26]){ stat++;break;}
                        flag = 1;
                        //break;
                     } 
                    }        
                 }
            } 
            }
        }
        time_count = 0;
       // alt_alarm_stop(&myalarm);
        //timeout = 0;
        if(!first)lcd_write_command(LCD_BASE, LCD_CMD_SHIFT | LCD_CMD_SHIFT_DISPLAY );
        else {lcd_write_command(LCD_BASE, LCD_CMD_CLEAR );first = 0;}
        
        if(num == 20)
        {
            lcd_write_command(LCD_BASE, LCD_CMD_CLEAR);
            altera_avalon_lcd_16207_goto(LCD_BASE,0,0);
            lcd_write_data(LCD_BASE,'A');
            lcd_write_data(LCD_BASE,'c');
            lcd_write_data(LCD_BASE,'c');
            lcd_write_data(LCD_BASE,'u');
            lcd_write_data(LCD_BASE,'r');
            lcd_write_data(LCD_BASE,'a');
            lcd_write_data(LCD_BASE,'c');
            lcd_write_data(LCD_BASE,'y');
            lcd_write_data(LCD_BASE,':');
            lcd_write_data(LCD_BASE,' ');
            if(stat == 20)
            {
                lcd_write_data(LCD_BASE,'1');
                lcd_write_data(LCD_BASE,'0');
                lcd_write_data(LCD_BASE,'0');
                lcd_write_data(LCD_BASE,'%');
            }
            else 
            {
                lcd_write_data(LCD_BASE,' ');
                lcd_write_data(LCD_BASE,(stat*5/10+48));
                lcd_write_data(LCD_BASE,((stat*5)%10+48));
                lcd_write_data(LCD_BASE,'%');
            }
            usleep(1000000); 
            lcd_write_command(LCD_BASE, LCD_CMD_CLEAR);
            altera_avalon_lcd_16207_goto(LCD_BASE,0,0);
            lcd_write_data(LCD_BASE,'C');
            lcd_write_data(LCD_BASE,'o');
            lcd_write_data(LCD_BASE,'n');
            lcd_write_data(LCD_BASE,'t');
            lcd_write_data(LCD_BASE,'i');
            lcd_write_data(LCD_BASE,'n');
            lcd_write_data(LCD_BASE,'u');
            lcd_write_data(LCD_BASE,'e');
            lcd_write_data(LCD_BASE,'?');
            altera_avalon_lcd_16207_goto(LCD_BASE,1,7);
            lcd_write_data(LCD_BASE,'Y');
            lcd_write_data(LCD_BASE,'/');
            lcd_write_data(LCD_BASE,'N');
            while(1)
            {
                if(keydone != 0)             //有键按下
            {
                // 中断事件减1 
                keydone--;
                keydata = KeyboardData & 0x000000ff;          //读取ASCII码
                if((KeyboardData & 0x40000)!=0x40000)         //判断输入为通码
                {
                    if(  ((keydata >= 0x20) && (keydata < 0x7f))//判断输入为ASCII码字符                 
                     && (((KeyboardData & 0x20000)!=0x20000)  //SHIFT键按下时
                            ||(keydata != 0x2e))                //若无字符键按下不操作
                        )
                    {
                        if(keydata == 'y')  {speed_level = 1;first = 1;num = 0;speed_level = 0;stat = 0;break;}
                        if(keydata == 'n')  
                        {
                            lcd_write_command(LCD_BASE, LCD_CMD_CLEAR);
                            altera_avalon_lcd_16207_goto(LCD_BASE,0,0);
                            lcd_write_data(LCD_BASE,'G');
                            lcd_write_data(LCD_BASE,'a');
                            lcd_write_data(LCD_BASE,'m');
                            lcd_write_data(LCD_BASE,'e');
                            lcd_write_data(LCD_BASE,' ');
                            lcd_write_data(LCD_BASE,'O');
                            lcd_write_data(LCD_BASE,'v');
                            lcd_write_data(LCD_BASE,'e');
                            lcd_write_data(LCD_BASE,'r');
                            lcd_write_data(LCD_BASE,'!');
                            return;
                        }
                     } 
                    }        
                 } 
            }

        }
        
    
  }   
    return 0;
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -