每天进步一点点------SOPC的Avalon-MM IP核(三) LCD1602 IP定制

 注:Avalon信号类型命名参考图

 1  /*********************************************************************************
 2 * Company                    : 
 3 * Engineer                    : 空气微凉
 4 * 
 5 * Create Date                : 00:00:00 22/03/2013 
 6 * Design Name                : 
 7 * Module Name                :         
 8 * Project Name                :  
 9 * Target Devices            : 
10 * Tool versions                : 
11 * Description                :  
12 *                                   http://www.cnblogs.com/kongqiweiliang/             
13 * Dependencies                : 
14 *                                Avalon_MM_Slave_IP
15 * Revision                    : 
16 * Revision                    : 0.01 - File Created
17 * Additional Comments        : 
18 ********************************************************************************/
19 `timescale 1ns/1ps
20 `define    UD  #1
21 /*******************************************************************************/
22 module Avalon_MM_Slave_LCD1602
23 ( 
24     //clock input
25     input                                         icsi_clk            ,// 
26     input                                         ireset_n             ,// 
27     //Avalon_MM_Slave interface  
28     input                                         iavs_chipselect        ,//片选信号
29     input                            [1 :0]         iavs_address        ,//地址,译码后确定寄存器offset
30     input                                         iavs_write            ,//写使能信号
31     input                            [31:0]         iavs_writedata        ,//32位写数据值
32     //input                                         iavs_read            ,//读时能信号
33     //input                            [31:0]         iavs_readdata        ,//32位读数据值
34     //input                                         iavs_byteenable         //字节使能信号
35     //hardware interface(Conduit End)
36     output  reg                                 oLCD1602_RS            ,//
37     output  reg                                 oLCD1602_RW            ,//
38     output  reg                                 oLCD1602_EN            ,//
39     output  reg                     [7 :0]         oLCD1602_DAT         //                                
40 );  
41 //-------------------------------------------------------------------------------
42 wire            oLCD1602_RS_N    ;//
43 wire         oLCD1602_RW_N    ;//
44 wire          oLCD1602_EN_N    ;//
45 wire  [7:0]  oLCD1602_DAT_N    ;//    
46 
47 //LCD1602_RS
48 always@(posedge icsi_clk or negedge ireset_n)begin
49     if(!ireset_n)
50         oLCD1602_RS <= 1'h0;
51     else
52         oLCD1602_RS <= oLCD1602_RS_N    ;//
53 end
54 assign oLCD1602_RS_N = ((iavs_write && iavs_chipselect) && (iavs_address == 2'h0)) ? iavs_writedata[0] : oLCD1602_RS;
55 
56 //LCD1602_RW
57 always@(posedge icsi_clk or negedge ireset_n)begin
58     if(!ireset_n)
59         oLCD1602_RW <= 1'h0;
60     else
61         oLCD1602_RW <= oLCD1602_RW_N    ;//
62 end
63 assign oLCD1602_RW_N = ((iavs_write && iavs_chipselect) && (iavs_address == 2'h1)) ? iavs_writedata[0] : oLCD1602_RW;
64 
65 //LCD1602_EN
66 always@(posedge icsi_clk or negedge ireset_n)begin
67     if(!ireset_n)
68         oLCD1602_EN <= 1'h0;
69     else
70         oLCD1602_EN <= oLCD1602_EN_N    ;//
71 end
72 assign oLCD1602_EN_N = ((iavs_write && iavs_chipselect) && (iavs_address == 2'h2)) ? iavs_writedata[0] : oLCD1602_EN;
73 
74 //LCD1602_DAT
75 always@(posedge icsi_clk or negedge ireset_n)begin
76     if(!ireset_n)
77         oLCD1602_DAT <= 8'h0;
78     else
79         oLCD1602_DAT <= oLCD1602_DAT_N    ;//
80 end
81 assign oLCD1602_DAT_N = ((iavs_write && iavs_chipselect) && (iavs_address == 2'h3)) ? iavs_writedata[7:0] : oLCD1602_DAT;
82 //-------------------------------------------------------------------------------
83 endmodule 

 

 1 /*********************************************************************************
 2 * Company                   : 
 3 * Engineer                  : 空气微凉
 4 * 
 5 * Create Date               : 00:00:00 22/03/2013 
 6 * Design Name               : 
 7 * Module Name               :        
 8 * Project Name              :  
 9 * Target Devices            : 
10 * Tool versions             : 
11 * Description               :  
12 *                                   
13 * Dependencies              : 
14 *
15 * Revision                  : 
16 * Revision                  : 0.01 - File Created
17 * Additional Comments       : 
18 ********************************************************************************/
19 #include <stdio.h>
20 #include <string.h>
21 #include "system.h"
22 #include "altera_avalon_pio_regs.h"
23 #include "alt_types.h"
24 #include "unistd.h"
25 
26 #define LCD_RS(data)       IOWR(OLCD1602_BASE, 0, data)
27 #define LCD_RW(data)       IOWR(OLCD1602_BASE, 1, data)
28 #define LCD_EN(data)       IOWR(OLCD1602_BASE, 2, data)
29 #define LCD_DATA(data)     IOWR(OLCD1602_BASE, 3, data)
30 
31 //#define    LCD1602_ADDR    (OLCD1602_BASE | (1<<31))
32 //#define    LCD_RS          (*(volatile unsigned int*)(LCD1602_ADDR + 0x00))
33 //#define    LCD_RW          (*(volatile unsigned int*)(LCD1602_ADDR + 0x04))
34 //#define    LCD_EN          (*(volatile unsigned int*)(LCD1602_ADDR + 0x08))
35 //#define    LCD_DATA        (*(volatile unsigned int*)(LCD1602_ADDR + 0x0C))
36 
37 /*Write Command*/
38 void Write_Com(alt_u8 com)
39 {
40     LCD_RS(0);//LCD_RS = 0;
41     usleep(5000);
42     LCD_DATA(com);//LCD_DATA = com;
43     usleep(5000);
44     LCD_EN(1);//LCD_EN = 1;
45     usleep(5000);
46     LCD_EN(0);//LCD_EN = 0;
47     usleep(5000);
48 }
49 /*Write Data*/
50 void Write_Data(alt_u8 data)
51 {
52     LCD_RS(1);// LCD_RS = 1;
53     usleep(5000);
54     LCD_DATA(data);//LCD_DATA = data;
55     usleep(5000);
56     LCD_EN(1);//LCD_EN = 1;
57     usleep(5000);
58     LCD_EN(0);//LCD_EN = 0;
59     usleep(5000);
60 }
61 /*LCD 1602 Initialization*/
62 void LCD_Init(void)
63 {
64     LCD_EN(0);// LCD_EN = 0;
65     LCD_RW(0);//LCD_RW = 0;
66     usleep(5000);
67     Write_Com(0x38);
68     Write_Com(0x0C);
69     Write_Com(0x06);
70     Write_Com(0x01);
71     Write_Com(0x80);
72 }
73 void LCD_Display(alt_u8 row, alt_u8 col, alt_u8 *pCN)
74 {
75     alt_u8    i, addr;
76     if(row == 0)
77         addr = 0x80 + col;
78     else
79         addr = 0xC0 + col;
80     Write_Com(addr);
81     //while(*(pCN) != '\0')
82     for(i=0; i<strlen(pCN); i++)
83     {
84         Write_Data(*(pCN+i));
85     }
86 }
87 
88 int main(void)
89 {
90     LCD_Init();
91     LCD_Display(0,0,(alt_u8*)"Avalon-MM IP2012");
92     LCD_Display(1,0,(alt_u8*)" Made By Na Xia");
93     while(1)
94     {
95     
96     }
97 }

  

posted on 2013-08-09 11:37  空气微凉  阅读(514)  评论(0编辑  收藏  举报

导航