📄 hello_led.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 + -