📄 exp11.c
字号:
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "exp11.h"
/********************************************/
#define GASAL 0x00 //图形区地址低8位
#define GASAH 0x02 //图形区地址高8位
#define TASAL 0x00 //文本区地址低8位
#define TASAH 0x00 //文本区地址高8位
#define CGRAMSA 0x7800 //CGRAM起始地址
#define ZIFU_NUM 30 //一行显示的字符数
#define DL1 30
#define DL2 20
/********************************************************/
alt_u32 i;
alt_u8 X,Y;
/********************************************************/
/********************************************************/
void Delay(alt_u32 m_Delay)
{
while(m_Delay--);
}
/********************************************************/
void LCD_Write_Command(alt_u8 m_Command) //写命令
{
Delay(DL1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DB_BASE,0xff); //数据总线:输出
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CD_BASE,1); //选择命令
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0); //片选拉低
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,0); //写信号有效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_DB_BASE,m_Command);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1); //写信号无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1); //片选无效
}
void LCD_Write_Data(alt_u8 m_Data) //写数据
{
Delay(DL2);
IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DB_BASE,0xff); //数据总线:输出
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CD_BASE,0); //选择数据
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0); //片选拉低
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,0); //写信号有效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_DB_BASE,m_Data);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1); //写信号无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1); //片选无效
}
void LCD_Dual_Command(alt_u8 Data1,alt_u8 Data2,alt_u8 Command) //双字节参数操作函数
{
LCD_Write_Data(Data1);
LCD_Write_Data(Data2);
LCD_Write_Command(Command);
}
void LCD_Single_Command(alt_u8 Data,alt_u8 Command) //单字节参数操作函数
{
LCD_Write_Data(Data);
LCD_Write_Command(Command);
}
void LCD_None_Command(alt_u8 Command) //无参数字节操作函数
{
LCD_Write_Command(Command);
}
void Clear_Screen(alt_u32 Addr_Start,alt_u32 Len) //清屏函数
{
alt_u32 i;
LCD_Dual_Command(Addr_Start%256,Addr_Start/256,0x24); //将显示缓冲地址指针设置为0x0000
LCD_None_Command(0xb0); //数据自动写设置
for(i=0;i<Len;i++)
LCD_Write_Data(0);
LCD_None_Command(0xb2); //自动写结束
}
void Display_Graph(alt_u8 x,alt_u8 y,alt_u8 *Graph,alt_u32 w,alt_u32 h) //显示一屏图像
{
alt_u32 i,j;
alt_u32 m_Addr;
LCD_Dual_Command(TASAL,TASAH,0x24); //将显示缓冲地址指针设置为0x0000
LCD_None_Command(0xb0); //数据自动写设置
for(i=0;i<GASAH*256+GASAL;i++) //清空文本区
LCD_Write_Data(0);
LCD_None_Command(0xb2); //自动写结束
for(i=0;i<h;i++)
{
m_Addr=GASAH*256+GASAL+(y+i)*ZIFU_NUM+x;
LCD_Dual_Command(m_Addr&0xff,m_Addr/256,0x24); //设置地址
LCD_None_Command(0xb0); //数据自动写设置
for(j=0;j<w/8;j++)
LCD_Write_Data(Graph[i*w/8+j]);
LCD_None_Command(0xb2); //自动写结束
}
}
void Display_Line(alt_u8 y,alt_u8 m_Line) //在屏幕上显示一行黑线
{
alt_u32 m_Addr=GASAH*256+GASAL+y*ZIFU_NUM;
LCD_Dual_Command(m_Addr&0xff,m_Addr/256,0x24); //设置地址
LCD_None_Command(0xb0); //数据自动写设置
for(i=0;i<ZIFU_NUM;i++)
LCD_Write_Data(m_Line);
LCD_None_Command(0xb2); //自动写结束
}
void Display_Hanzi(alt_u8 x,alt_u8 y,alt_u8 *m_Font) //在(x,y)点显示汉字
{
alt_u32 m_Addr=GASAH*256+GASAL+y*ZIFU_NUM+x;
alt_u32 i;
for(i=0;i<32;)
{
LCD_Dual_Command(m_Addr&0xff,m_Addr/256,0x24); //设置地址
LCD_Single_Command(m_Font[i++],0xc0); //写一个字节,地址自动累加
LCD_Single_Command(m_Font[i++],0xc4); //写一个字节,地址不变
m_Addr+=ZIFU_NUM;
}
}
void Display_Char(alt_u8 x,alt_u8 y,alt_u8 m_Char) //在(x,y)点显示一个字符(m_Char为ASCII值)(在文本区显示)
{
alt_u32 m_Addr=TASAH*256+TASAL+y*ZIFU_NUM+x;
LCD_Dual_Command(m_Addr&0xff,m_Addr/256,0x24); //设置地址
LCD_Single_Command(m_Char-0x20,0xc0); //写一字符的ASCII码
}
void Display_String(alt_u8 x,alt_u8 y,alt_u8 *String,alt_u8 Len) //显示字符串
{
alt_u32 i;
for(i=0;i<Len;i++)
Display_Char(x+i,y,String[i]);
}
int main (void)
{
IOWR_ALTERA_AVALON_PIO_DATA(USB_CS_BASE,1); //USB模块无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1); //释放片选
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1); //读、写信号无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RD_BASE,1);
//初始化LCD
LCD_None_Command(0x9c); //LCD为图形兼文本方式
LCD_Dual_Command(TASAL,TASAH,0x40); //设置文本区首地址
LCD_Dual_Command(ZIFU_NUM,0,0x41); //文本区宽度:每行30个字节
LCD_Dual_Command(GASAL,GASAH,0x42); //设置图形区首地址
LCD_Dual_Command(ZIFU_NUM,0,0x43); //图形区宽度:每行30个字节
LCD_Dual_Command(CGRAMSA/2048,0x00,0x22); //设置CGRAM地址偏移
LCD_None_Command(0x81); //方式设置:选择CGROM,逻辑“异或”合成
Clear_Screen(0x0000,0x7fff); //清屏,从0x0000~0x7FFF
while(1)
{
Display_Graph(0,0,m_Graph1,240,128);
Delay(200);
Display_Graph(0,0,m_Graph2,240,128);
Delay(200);
Display_Graph(0,0,m_Graph3,240,128);
Delay(200);
Display_Graph(0,0,m_Graph4,240,128);
Delay(200);
/*
Display_Graph(0,0,m_Graph1,240,128);
Delay(20000);
Display_Graph(0,0,m_Graph2,240,128);
Delay(20000);
Clear_Screen(0x0000,0x200+30*128); //清屏:文本区和图形区
X=3;
Y=15;
Display_Hanzi(X,Y,bei);
X+=2;
Display_Hanzi(X,Y,jing);
X+=2;
Display_Hanzi(X,Y,bai);
X+=2;
Display_Hanzi(X,Y,ke);
X+=2;
Display_Hanzi(X,Y,rong);
X+=2;
Display_Hanzi(X,Y,chuang);
X+=2;
Display_Hanzi(X,Y,ke);
X+=2;
Display_Hanzi(X,Y,ji);
X+=2;
Display_Hanzi(X,Y,you);
X+=2;
Display_Hanzi(X,Y,xian);
X+=2;
Display_Hanzi(X,Y,gong);
X+=2;
Display_Hanzi(X,Y,si);
X=11;
Y=35;
Display_Hanzi(X,Y,huan);
X+=2;
Display_Hanzi(X,Y,ying);
X+=2;
Display_Hanzi(X,Y,nin);
X+=2;
Display_Hanzi(X,Y,tan_hao);
Display_Line(59,0x11);
Display_Line(60,0xff);
Display_Line(61,0x11);
Display_Line(62,0xff);
Display_Line(63,0x11);
X=5;
Y=72;
Display_Hanzi(X,Y,dian);
X+=2;
Display_Hanzi(X,Y,hua);
X+=2;
Display_String(X,Y/8,tel1,14);
Display_String(X,Y/8+1,tel2,14);
X=5;
Y=92;
Display_Hanzi(X,Y,chuan);
X+=2;
Display_Hanzi(X,Y,zhen);
X+=2;
Display_String(X,(Y+4)/8,fax,14);
X=5;
Y=108;
Display_Hanzi(X,Y,wang);
X+=2;
Display_Hanzi(X,Y,zhi);
X+=2;
Display_String(X,(Y+4)/8,net,18);
Delay(20000);
*/
}
//while(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -