天天看點

怎樣制作一個簡單ip,以友善在Quartus II和Nios II中使用?.[Nios II][中]

表2.1 amy_s_lcd12864 ip的c源代碼子產品介紹

檔案名稱

功能描述

amy_s_lcd12864.h

amy_s_lcd12864 的c頭檔案

amy_s_lcd12864.c

amy_s_lcd12864 的c源檔案

<code>01</code>

<code>/*-----版權聲明-----</code>

<code>02</code>

<code> </code><code>*     艾米電子工作室——讓開發變得更簡單</code>

<code>03</code>

<code> </code><code>*     網站:http://www.amy-studio.com</code>

<code>04</code>

<code> </code><code>*     淘寶:http://amy-studio.taobao.com</code>

<code>05</code>

<code> </code><code>*     qq(郵箱):[email protected]</code>

<code>06</code>

<code> </code><code>*-----檔案資訊-----</code>

<code>07</code>

<code> </code><code>*     檔案名稱:amy_s_lcd12864.h</code>

<code>08</code>

<code> </code><code>*     最後修改日期:3.20, 2009</code>

<code>09</code>

<code> </code><code>*     描述:lcd12864驅動宏檔案</code>

<code>10</code>

<code> </code><code>*------------------</code>

<code>11</code>

<code> </code><code>*     建立者:張亞峰</code>

<code>12</code>

<code> </code><code>*     建立日期:3.20, 2009</code>

<code>13</code>

<code> </code><code>*     版本:1.0</code>

<code>14</code>

<code> </code><code>*     描述:原始版本</code>

<code>15</code>

<code>16</code>

<code> </code><code>*     修改者:</code>

<code>17</code>

<code> </code><code>*     修改日期:</code>

<code>18</code>

<code> </code><code>*     版本:</code>

<code>19</code>

<code> </code><code>*     描述:</code>

<code>20</code>

<code> </code><code>*-------------------</code>

<code>21</code>

<code> </code><code>*/</code>

<code>22</code>

<code>23</code>

<code>24</code>

<code>#ifndef __amy_s_lcd12864_h__</code>

<code>25</code>

<code>#define __amy_s_lcd12864_h__</code>

<code>26</code>

<code>27</code>

<code>28</code>

<code>//++++++++++++++++++++++++++++++++++++++</code>

<code>29</code>

<code>// 基位址 開始</code>

<code>30</code>

<code>// 根據sopc builder設定編寫</code>

<code>31</code>

<code>32</code>

<code>#include "system.h"</code>

<code>33</code>

<code>34</code>

<code>#define lcd12864_addr lcd12864_base</code>

<code>35</code>

<code>//--------------------------------------</code>

<code>36</code>

<code>37</code>

<code>38</code>

<code>39</code>

<code>40</code>

<code>41</code>

<code>// 寄存器映射 開始</code>

<code>42</code>

<code>// 根據hdl編寫</code>

<code>43</code>

<code>44</code>

<code>#include &lt;io.h&gt;</code>

<code>45</code>

<code>46</code>

<code>#define iowr_lcd12864_e(base, data)     iowr(base, 0, data)</code>

<code>47</code>

<code>#define iowr_lcd12864_rw(base, data)    iowr(base, 1, data)</code>

<code>48</code>

<code>#define iowr_lcd12864_rs(base, data)    iowr(base, 2, data)</code>

<code>49</code>

<code>#define iowr_lcd12864_data(base, data)  iowr(base, 3, data)</code>

<code>50</code>

<code>#define iord_lcd12864_data(base)        iord(base, 3)</code>

<code>51</code>

<code>52</code>

<code>// 寄存器映射 結束</code>

<code>53</code>

<code>54</code>

<code>55</code>

<code>56</code>

<code>57</code>

<code>// 管腳操作 開始</code>

<code>58</code>

<code>59</code>

<code>#define set_e         iowr_lcd12864_e(lcd12864_addr, 1)</code>

<code>60</code>

<code>#define clr_e         iowr_lcd12864_e(lcd12864_addr, 0)</code>

<code>61</code>

<code>#define set_rw        iowr_lcd12864_rw(lcd12864_addr, 1)</code>

<code>62</code>

<code>#define clr_rw        iowr_lcd12864_rw(lcd12864_addr, 0)</code>

<code>63</code>

<code>#define set_rs        iowr_lcd12864_rs(lcd12864_addr, 1)</code>

<code>64</code>

<code>#define clr_rs        iowr_lcd12864_rs(lcd12864_addr, 0)</code>

<code>65</code>

<code>#define wr_data(data) iowr_lcd12864_data(lcd12864_addr, data)</code>

<code>66</code>

<code>#define rd_data       iord_lcd12864_data(lcd12864_addr)</code>

<code>67</code>

<code>68</code>

<code>// 管腳操作 結束</code>

<code>69</code>

<code>70</code>

<code>71</code>

<code>72</code>

<code>73</code>

<code>// 函數聲明 開始</code>

<code>74</code>

<code>75</code>

<code>extern</code> <code>void</code> <code>lcd12864_checkbusy(</code><code>void</code><code>);</code>

<code>76</code>

<code>extern</code> <code>void</code> <code>lcd12864_wrcmd(alt_u8 cmd);</code>

<code>77</code>

<code>extern</code> <code>void</code> <code>lcd12864_wrdata(alt_u8 data);</code>

<code>78</code>

<code>extern</code> <code>void</code> <code>lcd12864_init(</code><code>void</code><code>);</code>

<code>79</code>

<code>extern</code> <code>void</code> <code>lcd12864_wrchar(alt_u8 row, alt_u8 col, alt_u8 *pcn, alt_u8 n);</code>

<code>80</code>

<code>81</code>

<code>// 函數聲明 結束</code>

<code>82</code>

<code>83</code>

<code>84</code>

<code>85</code>

<code>#endif /* __amy_s_lcd12864_h__ */&lt;/io.h&gt;</code>

最後面的那個&lt;/io.h&gt;是釋出部落格的時候帶出來的,不屬于頭檔案。

從28行到37行,是根據sopc builder設定編寫的lcd12864的基位址,需要system.h的支援。注:system.h就是和sopc builder設定一一對應的;當在nii中建立工程時,system.h就根據sopcinfo(nios ii  9.1 software build tools for eclipse使用,不是nios ii 9.1 ide)檔案自動生産。

第40行到第53行,是自己編寫的一些宏,這個叫register map(寄存器映射),以前都是單獨放在一個頭檔案裡(如xxx_regs.h)。由于nii 9.1貌似不支援hal的自動初始化(我研究的結果是不行,不知道altera公司有沒有相關的變動聲明),是以就沒有向8.1那樣書寫hal。注意,0、1~3是offset(偏移位址),請參考hdl代碼編寫。

從56行到69行,是一些管腳操作的宏,這樣寫,主要是友善移植。大家也可以不寫寄存器映射,直接寫管腳操作的宏也行,注意替換喲。

實際上大家也可以使用arm方式的寄存器通路方式,譬如

<code>1</code>

<code>#define cs  *(volatile unsigned *) cs_base  // 片選信号 --低有效</code>

這種貌似更好操作。由于我沒有深入研究這種寄存器通路方式,這裡就不多說了。

下面的幾行和各種mcu大同小異。

view

source

print?

<code> </code><code>*     檔案名稱:amy_s_lcd12864.c</code>

<code> </code><code>*     描述:lcd12864驅動源檔案</code>

<code>#include "amy_s_lcd12864.h"</code>

<code>#include "alt_types.h"</code>

<code>#include "unistd.h"</code>

<code>void</code> <code>lcd12864_checkbusy(</code><code>void</code><code>)</code>

<code>{</code>

<code>  </code><code>clr_rs;                               </code><code>// 指令</code>

<code>  </code><code>set_rw;                               </code><code>// 讀</code>

<code>  </code><code>set_e;</code>

<code>  </code><code>while</code><code>((rd_data&amp;0x80) == 0x80);        </code><code>// 檢測busy flag</code>

<code>  </code><code>clr_e;</code>

<code>  </code><code>usleep(72);                           </code><code>// 72us</code>

<code>}</code>

<code>void</code> <code>lcd12864_wrcmd(alt_u8 cmd)</code>

<code>  </code><code>lcd12864_checkbusy();</code>

<code>  </code><code>clr_rw;                               </code><code>// 寫</code>

<code>  </code><code>wr_data(cmd);</code>

<code>void</code> <code>lcd12864_wrdata(alt_u8 data)</code>

<code>  </code><code>set_rs;                               </code><code>// 資料</code>

<code>  </code><code>wr_data(data);</code>

<code>void</code> <code>lcd12864_init(</code><code>void</code><code>)</code>

<code>  </code><code>usleep(40*1000);</code>

<code>  </code><code>lcd12864_wrcmd(0x30);                 </code><code>// 8bit</code>

<code>  </code><code>usleep(100);</code>

<code>  </code><code>lcd12864_wrcmd(0x30);                 </code><code>// basic function</code>

<code>  </code><code>usleep(37);</code>

<code>  </code><code>lcd12864_wrcmd(0x0f);                 </code><code>// 整體顯示開 遊标開 反白</code>

<code>  </code><code>lcd12864_wrcmd(0x10);                 </code><code>// 遊标左移</code>

<code>  </code><code>lcd12864_wrcmd(0x01);</code>

<code>  </code><code>usleep(10*1000);</code>

<code>  </code><code>lcd12864_wrcmd(0x06);                 </code><code>// 畫面整體右移</code>

<code>void</code> <code>lcd12864_wrchar(alt_u8 row, alt_u8 col, alt_u8 *pcn, alt_u8 n)</code>

<code>  </code><code>alt_u8 i, addr;</code>

<code>  </code><code>row &amp;= 0x03;                          </code><code>// row &lt; 4</code>

<code>  </code><code>col &amp;= 0x07;                          </code><code>// col &lt; 8</code>

<code>  </code><code>switch</code><code>(row)</code>

<code>  </code><code>{</code>

<code>    </code><code>case</code> <code>0: addr = 0x80; </code><code>break</code><code>;</code>

<code>    </code><code>case</code> <code>1: addr = 0x90; </code><code>break</code><code>;</code>

<code>    </code><code>case</code> <code>2: addr = 0x88; </code><code>break</code><code>;</code>

<code>    </code><code>case</code> <code>3: addr = 0x98; </code><code>break</code><code>;</code>

<code>86</code>

<code>  </code><code>}</code>

<code>87</code>

<code>  </code><code>addr += col;</code>

<code>88</code>

<code>  </code><code>lcd12864_wrcmd(addr);</code>

<code>89</code>

<code>  </code><code>for</code><code>(i=0; i&lt;2*n; i++)</code>

<code>90</code>

<code>91</code>

<code>    </code><code>lcd12864_wrdata(pcn[i]);            </code><code>// 寫字元資料</code>

<code>92</code>

<code>93</code>

呵呵,這個就不說明了,大家自己看。