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

📄 exp11.c

📁 本程序功能是在FPGA上nios处理器的lcd接口程序。
💻 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 + -