表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 <io.h></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__ */</io.h></code>
最後面的那個</io.h>是釋出部落格的時候帶出來的,不屬于頭檔案。
從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&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 &= 0x03; </code><code>// row < 4</code>
<code> </code><code>col &= 0x07; </code><code>// col < 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<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>
呵呵,這個就不說明了,大家自己看。