4665|3

26

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【原创 重量级】Atmel XMEGA-B1 Xplained —— 段式LCD [复制链接]

本帖最后由 hejunpeng 于 2015-4-20 13:15 编辑

Atmel XMEGA-B1 Xplained —— 段式LCD
——基于Atmel Studio 6和Atmel软件框架(ASF)

Atmel XMEGA-B1 Xplained拿到手有段时间了,这篇文章主要是写XMEGA段式LCD是使用方法,由于XMEGA部分型号自带段式LCD驱动功能,这可以大大简化了段式LCD的驱动,使的段式LCD在XMEGA上使用起来更加方便、灵活。XMEGA-B1 Xplained我已经在论坛帖子里详细介绍了,详见以下连接:

【Atmel XMEGA-B1 Xplained —— 开箱、测试】


       文章主要是基于ASF LCD驱动库函数来介绍的,XMEGA-B1 Xplained板载一个4*40的段式LCD,ASF里面提供了一个LCD - Atmel YMCC24248AAAYDCL(component) 库函数,这个函数是专门针对XMEGA-B1 Xplained板载LCD来用的,使用起来极为方便。这篇文章着重介绍部分LCD使用原理,所以没有采用此库函数,使用的是LCD驱动函数。
       整个文章都是基于Atmel AVR XMEGA和Atmel Studio 6写的,先介绍了Atmel Studio 6新建工程项目,接着介绍添加ASF库函数,最后逐一介绍了段式LCD的是使用过程,并附上大量截图和代码,目的是为了大家能看的舒服、用的舒服,当然高手可以跃过此帖了。这篇文章主要分享给正在研究AVR XMEGA、段式LCD、Atmel Studio 6 以及Atmel ASF 的朋友。

        下面先附上XMEGA-B1 Xplained段式LCD演示视频http://v.youku.com/v_show/id_XODc2NDgzNzIw.html?firsttime=0



      进入正题
      要操作LCD,首先要知道怎样去操作MCU的IO端口,因为对MCU的IO操作是最简单的,它是控制一切外围设备的基础。新建工程、加入ASF库函数、IO操作,这些步骤我已经在论坛帖子里做了更详细的介绍,详见以下链接:

                                                                   https://bbs.eeworld.com.cn/thread-459702-1-1.html


       新建工程:文件 -> 新建 -> 项目
  

       新建项目类型:选择C/C++语言 -> 选择评估板ASF工程 -> 修改项目名称 -> 确定




       选择评估板:XMEGA-B1 Xplained - ATxmega128B1

   



   


到这里,工程就新建完成了,下面是添加ASF软件库。

      进入ASF向导:ASF Wizard





       添加段式LCD驱动:选择Drivers -> LCD Controller driver -> Add




        用同样的方法添加TC - Timer Counter 驱动。
        添加系统时钟服务:选择Services -> System Clock Control -> Add




      应用所有库函数。








       段式LCD驱动添加成功后,可以找到lcd.c和lcd.h两个文件。





        进入ASF Explorer 可以查看ASF的各种软件包使用方法和说明。如下图,选择展开 LCD controller driver,选择Quick Start Guide,将弹出使用说明的网页。








       到这里,所有准备工作就完成了,下面附上程序源代码,后面再详细介绍LCD驱动使用方法。
     【注】:代码在于液晶功能演示,没有实时性,使用了大量延时函数,实际应用中,应该去掉延时,引入实时操作特性。

     源代码

  1. 2./*********************************************************
  2. 3.工程名称:XMEGA-B1 LCD
  3. 4.硬件平台:Atmel XMEGA-B1 Xplained
  4. 5.软件平台:Atmel Studio6.2 SP1
  5. 6.创建作者:hejunpeng(Elec-fans)
  6. 7.创建时间:2015/1/19
  7. 8.*********************************************************/
  8. 9.
  9. 10.
  10. 11.
  11. 12.#define F_CPU 8000000L
  12. 13.#include <asf.h> //包含 Atmel软件库头文件
  13. 14.#include <util/delay.h> //包含延时头文件
  14. 15.
  15. 16.
  16. 17./*********************************************************
  17. 18.函数声明
  18. 19.*********************************************************/
  19. 20.void LCD_Init(void); //LCD初始化
  20. 21.void LCD_Display_Full(void); //LCD满屏显示
  21. 22.void LCD_Display_ElecFans(void); //LCD显示Elec-Fans
  22. 23.void LCD_Display_Atmel(void); //LCD显示Atmel
  23. 24.void LCD_Display_EEfcous(void); //LCD显示eefcous
  24. 25.void LCD_Display_AVRMCU(void); //LCD显示AVRMCU
  25. 26.void LCD_Display_XMEGA(void); //LCD显示XMEGA
  26. 27.
  27. 28.
  28. 29./*********************************************************
  29. 30.功能:主程序
  30. 31.参数:无
  31. 32.*********************************************************/
  32. 33.int main (void)
  33. 34.{
  34. 35.
  35. 36.
  36. 37.        // Insert system clock initialization code here (sysclk_init()).
  37. 38.    sysclk_init(); //初始化系统时钟
  38. 39.        board_init(); //初始化评估板
  39. 40.
  40. 41.
  41. 42.        // Insert application code here, after the board has been initialized.
  42. 43.        LCD_Init(); //LCD初始化
  43. 44.
  44. 45.
  45. 46.
  46. 47.        LCD_Display_Full(); //满屏演示
  47. 48.
  48. 49.        lcd_set_pixel(2, 0); //显示AVR logo
  49. 50.        lcd_set_pixel(1, 0); //显示USB logo
  50. 51.
  51. 52.        lcd_write_packet(LCD_TDG_7S_4C_gc, 8, "2015", 4, 1); //7段屏显示数字2015
  52. 53.        LCD_Display_ElecFans(); //滚动显示Elec-Fans
  53. 54.
  54. 55.        while(1)
  55. 56.        {
  56. 57.                if (ioport_get_pin_level(GPIO_PUSH_BUTTON_0)==0) //触摸按键CS0按下
  57. 58.                {
  58. 59.                        LCD_Display_Atmel(); //LCD显示Atmel
  59. 60.                }
  60. 61.                if (ioport_get_pin_level(GPIO_PUSH_BUTTON_1)==0) //触摸按键CS1按下
  61. 62.                {
  62. 63.                        LCD_Display_EEfcous(); //LCD显示eefcous
  63. 64.                }
  64. 65.                if (ioport_get_pin_level(GPIO_PUSH_BUTTON_2)==0) //触摸按键CS2按下
  65. 66.                {
  66. 67.                        LCD_Display_AVRMCU(); //LCD显示AVRMCU
  67. 68.                }
  68. 69.                if (ioport_get_pin_level(GPIO_PUSH_BUTTON_3)==0) //触摸按键CS3按下
  69. 70.                {
  70. 71.                        LCD_Display_XMEGA(); //LCD显示XMEGA
  71. 72.                }
  72. 73.
  73. 74.                PORTB.OUT = (~(PORTE.IN & 0x0f)<<4)&0xff; //将触摸按键键值映射到LED端口
  74. 75.
  75. 76.        }
  76. 77.}
  77. 78.
  78. 79./*********************************************************
  79. 80.功能:LCD初始化
  80. 81.参数:无
  81. 82.*********************************************************/
  82. 83.void LCD_Init(void)
  83. 84.{
  84. 85.        lcd_clk_init(); //设置LCD时钟源
  85. 86.        lcd_connection_init(false, false, 40, false); //配置LCD硬件连接类型
  86. 87.        lcd_timing_init(LCD_PRESC_16_gc, LCD_CLKDIV_DivBy4_gc,
  87. 88.                        LCD_LP_WAVE_ENABLE_gc, LCD_DUTY_1_4_gc); //配置LCD工作时序
  88. 89.        lcd_blinkrate_init(LCD_BLINKRATE_2Hz_gc); //设置LCD闪烁频率
  89. 90.        lcd_set_contrast(30); //设置LCD对比度
  90. 91.        lcd_enable(); //使能LCD
  91. 92.}
  92. 93.
  93. 94./*********************************************************
  94. 95.功能:LCD满屏演示
  95. 96.参数:无
  96. 97.*********************************************************/
  97. 98.void LCD_Display_Full(void)
  98. 99.{
  99. 100.
  100. 101.        /*** 4*40 段式LCD 刷满屏 ***/
  101. 102.        for (int i=0; i<4; i++)
  102. 103.        {
  103. 104.                for (int j=0; j<40; j++)
  104. 105.                {
  105. 106.                        lcd_set_pixel(i, j);
  106. 107.                        _delay_ms(5);
  107. 108.                }
  108. 109.                LED_On(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增点亮
  109. 110.        }
  110. 111.        _delay_ms(150);
  111. 112.        /*** 4*40 段式LCD 清满屏 ***/
  112. 113.        for (int i=3; i>=0; i--)
  113. 114.        {
  114. 115.                for (int j=39; j>=0; j--)
  115. 116.                {
  116. 117.                        lcd_clear_pixel(i, j);
  117. 118.                }
  118. 119.                LED_Off(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增熄灭
  119. 120.        }
  120. 121.        _delay_ms(150);
  121. 122.        /*** 4*40 段式LCD 刷满屏 ***/
  122. 123.        for (int i=0; i<4; i++)
  123. 124.        {
  124. 125.                for (int j=0; j<40; j++)
  125. 126.                {
  126. 127.                        lcd_set_pixel(i, j);
  127. 128.                }
  128. 129.                LED_On(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增点亮
  129. 130.        }
  130. 131.        _delay_ms(150);
  131. 132.        /*** 4*40 段式LCD 清满屏 ***/
  132. 133.        for (int i=3; i>=0; i--)
  133. 134.        {
  134. 135.                for (int j=39; j>=0; j--)
  135. 136.                {
  136. 137.                        lcd_clear_pixel(i, j);
  137. 138.                }
  138. 139.                LED_Off(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增熄灭
  139. 140.        }
  140. 141.        _delay_ms(150);
  141. 142.        /*** 4*40 段式LCD 刷满屏 ***/
  142. 143.        for (int i=0; i<4; i++)
  143. 144.        {
  144. 145.                for (int j=0; j<40; j++)
  145. 146.                {
  146. 147.                        lcd_set_pixel(i, j);
  147. 148.                }
  148. 149.                LED_On(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增点亮
  149. 150.        }
  150. 151.        _delay_ms(300);
  151. 152.        /*** 4*40 段式LCD 清满屏 ***/
  152. 153.        for (int i=3; i>=0; i--)
  153. 154.        {
  154. 155.                for (int j=39; j>=0; j--)
  155. 156.                {
  156. 157.                        lcd_clear_pixel(i, j);
  157. 158.                        _delay_ms(5);
  158. 159.                }
  159. 160.                LED_Off(IOPORT_CREATE_PIN(PORTB,7-i)); //LED0-3递增熄灭
  160. 161.        }
  161. 162.        _delay_ms(300);
  162. 163.}
  163. 164.
  164. 165./*********************************************************
  165. 166.功能:LCD显示Elec-Fans
  166. 167.参数:无
  167. 168.*********************************************************/
  168. 169.void LCD_Display_ElecFans(void)
  169. 170.{
  170. 171.        unsigned char ElecFans[] = "       Elec-fans       "; //定义 Elec-fans字符串
  171. 172.        unsigned char ElecFans_temp[] = ""; //定义 Elec-fans字符串缓存空间
  172. 173.        unsigned char j=0;
  173. 174.        while((ioport_get_pin_level(GPIO_PUSH_BUTTON_0))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_1))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_2))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_3)))
  174. 175.        {
  175. 176.                for (int i=0; i<9; i++)
  176. 177.                {
  177. 178.                        ElecFans_temp = *(ElecFans+j+i);
  178. 179.                }
  179. 180.                if (++j > 14)
  180. 181.                {
  181. 182.                        j=0;
  182. 183.                }
  183. 184.                for (int i=0; i<10; i++)
  184. 185.                {
  185. 186.                        _delay_ms(5);
  186. 187.                        if(!((ioport_get_pin_level(GPIO_PUSH_BUTTON_0))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_1))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_2))&&(ioport_get_pin_level(GPIO_PUSH_BUTTON_3))))
  187. 188.                        {
  188. 189.                                break;
  189. 190.                        }
  190. 191.                }
  191. 192.
  192. 193.                lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "       ", 7, 0); //清14段屏
  193. 194.                lcd_write_packet(LCD_TDG_14S_4C_gc, 16, ElecFans_temp, 7, 0); //显示 ElecFans_temp[]内容
  194. 195.
  195. 196.
  196. 197.
  197. 198.        }
  198. 199.
  199. 200.}
  200. 201.
  201. 202./*********************************************************
  202. 203.功能:LCD显示Atmel
  203. 204.参数:无
  204. 205.*********************************************************/
  205. 206.void LCD_Display_Atmel(void)
  206. 207.{
  207. 208.
  208. 209.        lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "       ", 7, 0); //清14段屏
  209. 210.
  210. 211.        /*** 显示Atmel的字母A斜体 ***/
  211. 212.        lcd_set_pixel(1, 16);
  212. 213.        lcd_set_pixel(1, 18);
  213. 214.        lcd_set_pixel(2, 16);
  214. 215.        lcd_set_pixel(2, 18);
  215. 216.        lcd_set_pixel(2, 19);
  216. 217.
  217. 218.        lcd_write_packet(LCD_TDG_14S_4C_gc, 20, "tmel", 4, 0); //在斜体A后面显示tmel
  218. 219.}
  219. 220.
  220. 221./*********************************************************
  221. 222.功能:LCD显示eefcous
  222. 223.参数:无
  223. 224.*********************************************************/
  224. 225.void LCD_Display_EEfcous(void)
  225. 226.{
  226. 227.        lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "       ", 7, 0); //清14段屏
  227. 228.        lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "eefocus", 7, 0); //14段屏显示字母eefocus
  228. 229.}
  229. 230.
  230. 231./*********************************************************
  231. 232.功能:LCD显示AVRMCU
  232. 233.参数:无
  233. 234.*********************************************************/
  234. 235.void LCD_Display_AVRMCU(void)
  235. 236.{
  236. 237.        lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "       ", 7, 0); //清14段屏
  237. 238.
  238. 239.        /*** 显示AVR的字母A斜体 ***/
  239. 240.        lcd_set_pixel(1, 12);
  240. 241.        lcd_set_pixel(1, 14);
  241. 242.        lcd_set_pixel(2, 12);
  242. 243.        lcd_set_pixel(2, 14);
  243. 244.        lcd_set_pixel(2, 15);
  244. 245.
  245. 246.        lcd_write_packet(LCD_TDG_14S_4C_gc, 16, "VR MCU",6, 0); //在斜体A后面显示VR
  246. 247.}
  247. 248.
  248. 249./*********************************************************
  249. 250.功能:LCD显示XMEGA
  250. 251.参数:无
  251. 252.*********************************************************/
  252. 253.void LCD_Display_XMEGA(void)
  253. 254.{
  254. 255.        lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "       ", 7, 0); //清14段屏
  255. 256.        lcd_write_packet(LCD_TDG_14S_4C_gc, 16, "xmega", 5, 0); //显示XMEGA
  256. 257.}
复制代码

面先展示一下XMEGA-B1 Xplained 板载段式LCD COM和SEG分布图。





使用段式LCD显示之前,需要对LCD进行初始化,在上面源代码中是 LCD_Init(void);需要以下准备流程:
        ①初始化系统时钟
        ②在conf_clock.h中配置RTC时钟源
        ③配置LCD时钟源
        ④配置LCD硬件连接类型
        ⑤配置LCD工作时序
        ⑥设置LCD闪烁频率
        ⑦设置LCD对比度
        ⑧使能LCD

由于使用的是XMEGA-B1 Xplained,所以还要在前面对评估板硬件进行初始化评估板,做好上面各个步骤之后,LCD就可以很轻松的用起来了,下面将逐一介绍每个步骤使用方法。

      ①初始化系统时钟
     void sysclk_init(void); //初始化系统时钟

      ②在conf_clock.h中配置RTC时钟源
      当CPU核心暂停,主振荡器停止时(节电模式),使用内部的32kHz振荡器,可以让LCD继续工作。配置方法是在conf_clock.h 中添加以下宏定义,如下图。
    #define CONFIG_RTC_SOURCE           SYSCLK_RTCSRC_ULP





③配置LCD时钟源
         void lcd_clk_init(void); //设置LCD时钟源

      ④配置LCD硬件连接类型
该功能允许一个外部电阻偏置电压,对COM和SEG交替,LCD端口屏蔽和使用(或没有)。这个函数还可以对LCD进行清除显示(所有像素“关”),并可以停用液晶。根据以下表格对不同的LCD进行不同的配置,下面是配置函数说明。
    void lcd_connection_init(com_swp, seg_swp, port_mask, x_bias); //配置LCD硬件连接类型

com_swp
COM 交替(false: 不交替,true: COM 交替)
seg_swp
SEG 交替(false: 不交替,true: SEG 交替)
port_mask
SEG使用数量
x_bias
外部偏置(false: 内部,true: 外部)

       由于XMEGA-B1 Xplained中LCD连接COM、SEG都没有交替,LCD为4*40,所以SEG数量为40,使用的是内部偏置,所以函数如下:
    lcd_connection_init(false, false, 40, false); //配置LCD硬件连接类型

      ⑤配置LCD工作时序
       不同的LCD具有不同的工作时序,配置好工作时序,这是 MCU和LCD中间的桥梁。下面是配置函数说明。
    void lcd_timing_init(lcd_pres, lcd_clkdiv, lcd_lp_wave, lcd_duty); //配置LCD工作时序

lcd_pres
预分频器的时钟源
lcd_clkdiv
预分频器的分频因子
lcd_lp_wave
波形类型,低功耗或默认波形
lcd_duty
占空比
  
       当LCD工作时钟时RTC时钟频率32.768KHz时,针对不同的LCD工作频率配置不同的LCD时序,见如下表格:

256 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy1_gc | LCD_DUTY_1_4_gc
128 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy2_gc | LCD_DUTY_1_4_gc
85.3 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy3_gc | LCD_DUTY_1_4_gc
64 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy4_gc | LCD_DUTY_1_4_gc
51.2 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy5_gc | LCD_DUTY_1_4_gc
42.7 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy6_gc | LCD_DUTY_1_4_gc
36.6 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy7_gc | LCD_DUTY_1_4_gc
32 Hz
LCD.CTRB = LCD_PRESC_16_gc | LCD_CLKDIV_DivBy8_gc | LCD_DUTY_1_4_gc

       XMEGA-B1 Xplained板载LCD时序如下图所示,其工作占空比为1/4,典型工作频率为64Hz。





根据以上数据,并开启低功耗,这里配置LCD时序如下函数。
    lcd_timing_init(LCD_PRESC_16_gc, LCD_CLKDIV_DivBy4_gc,
                           LCD_LP_WAVE_ENABLE_gc, LCD_DUTY_1_4_gc); //配置LCD工作时序

      ⑥设置LCD闪烁频率
      在LCD驱动库函数里面对LCD闪烁频率有0.5Hz、1Hz、2Hz、4Hz可以配置,这里配置为2Hz。函数如下:
    lcd_blinkrate_init(LCD_BLINKRATE_2Hz_gc); //设置LCD闪烁频率

0.5Hz
LCD_BLINKRATE_0Hz5_gc
1Hz
LCD_BLINKRATE_1Hz_gc
2Hz
LCD_BLINKRATE_2Hz_gc
4Hz
LCD_BLINKRATE_4Hz_gc

      ⑦设置LCD对比度
      此功能精确设置LCD的对比度。其电压转换式为:VLCD = 3.0 V + (fcont[5:0] * 0.016 V),设置LCD的对比度函数如下。
    void lcd_set_contrast(int8_t fcont);
      ⑧使能LCD
    void lcd_enable(); //使能LCD

       到这里,段式LCD所有初始化就介绍完了,有了上面这些准备工作,后面就可以将LCD的任意段点亮,下面将详细介绍使用方法。
       首先介绍一个概念,COM和SEG,如果大家用过数码管,COM就相当于是数码管的位码端,SEG就相当于数码管的段码端,XMEGA-B1 Xplained板载LCD 的COM=4,SEG=40。下面是LCD驱动库函数最常用的几个函数,使用好这几个函数后,就可以对LCD进行极为灵活的操作。
      ①void lcd_set_pixel(uint8_t pix_com, uint8_t pix_seg);
      ②void lcd_clear_pixel(uint8_t pix_com, uint8_t pix_seg);
      ③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,
                                     const uint8_t *data, size_t width, uint8_t dir);

       上面三个函数是最为常用的,函数①是将段式LCD的一个段SEG显示,函数②是将段式LCD的一个段SEG清除,函数③是对LCD写字符串。下面详细介绍这三个函数使用。要想理解和使用这些函数,首先看一个图片,如下图:


      图中,由于XMEGA-B1 Xplained板载LCD COM=4,SEG=40,所以COM0~COM3,SEG0~SEG39,我们看到屏幕左下方AVR的logo编号为E1,在图中的表格中对应COM2,SEG0,其显示和清除如下表格:

显示
函数①:lcd_set_pixel(2, 0);
清除
函数②:lcd_clear_pixel(2, 0);

同时显示AVR logo,显示效果如下:




      ③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,
                                     const uint8_t *data, size_t width, uint8_t dir);
      函数③相对于前面两个稍显复杂,主要用来显示ASCII字符串的,其中的传递参数功能如下表格:

lcd_tdg
LCD数码类型:73位、74位、144位、163
first_seg
第一个数据被写的SEG所在的位置数目
*data
字符串缓冲区
width
字符串数量
dir
写数据的方向 ==0:左->右,!=0:右->

其中lcd_tdg为数码类型,在LCD软件库中有明确的宏定义,如下表格:

7段3位
LCD_TDG_7S_3C_gc
7段4位
LCD_TDG_7S_4C_gc
14段4位
LCD_TDG_14S_4C_gc
16段3位
LCD_TDG_16S_3C_gc



      根据上图,如果要在14段码区写入eefocus,所以数码类型lcd_tdg =LCD_TDG_14S_4C_gc,eefocus总共7个字符,所以width=7,eefocus的起始字母e写在上图的A6位上,而A6位对应的SEG=12,所以first_seg=12,根据不同的液晶内部电路排版,写入方向有所不同,图中eefocus从左往右写,依次是A6->A5->A4->A3->A2->A1->A0,从图中表格对应的SEG来看,也是从左往右写入,所以写入方向dir=0有了这些信息之后,写入eefocus函数如下:
    lcd_write_packet(LCD_TDG_14S_4C_gc, 12, "eefocus", 7, 0);//14段屏显示字母eefocus

    当然知道了LCD的写入原理后,可以对函数作进一步的封装,使得操作更简单,显示效果如下:







      根据上图,如果要在7段码区写入“2015”(年),所以数码类型lcd_tdg =LCD_TDG_7S_4C_gc2015总共4个字符,所以width=4,“2015”的起始数字2写在上图的D3位上,而D3位对应的SEG=8,所以first_seg=8,根据不同的液晶内部电路排版,写入方向有所不同,图中“2015”从左往右写,依次是D3->D2>D1->D0,从图中表格对应的SEG来看,而是从右往左写入,所以写入方向dir=1有了这些信息之后,写入“2015”函数如下:
lcd_write_packet(LCD_TDG_7S_4C_gc, 8, "2015", 4, 1); //7段屏显示数字2015

       显示效果如下:




       段式LCD最常用的三个函数就介绍完了,下面来一张综合显示图:


       所用函数代码:
            lcd_set_pixel(2, 0); //显示AVR logo
            lcd_set_pixel(1, 0); //显示USB logo
            lcd_write_packet(LCD_TDG_7S_4C_gc, 8, "2015", 4, 1); //7段屏显示数字2015
            /*** 显示Atmel的字母A斜体 ***/
            lcd_set_pixel(1, 16);
            lcd_set_pixel(1, 18);
            lcd_set_pixel(2, 16);
            lcd_set_pixel(2, 18);
            lcd_set_pixel(2, 19);

            lcd_write_packet(LCD_TDG_14S_4C_gc, 20, "tmel", 4, 0); //在斜体A后面显示tmel

      显示效果如下图:


      到这里,XMEGA段式LCD是使用方法就结束了,下面介绍工程编译和程序烧写(下载)。编译和生成烧写文件如下图:


      生成成功后,用XMEGA所需的烧录工具进行烧写程序即可,如Atmel官方的Atmel-ICE、AVR Dragon、AVRISP MKII、AVR ONE!、JTAGICE3、JTAGICE MKII等等或者第三方的XMEGA烧录工具。
      下面附上一些显示效果图片:





最新回复

①void lcd_set_pixel(uint8_t pix_com, uint8_t pix_seg); ②void lcd_clear_pixel(uint8_t pix_com, uint8_t pix_seg); ③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,                                      const uint8_t *data, size_t width, uint8_t dir); 这三个函数具体怎么实现啊???求解  详情 回复 发表于 2016-3-25 00:25

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

24

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看不懂这个到底是什么东西~~~~~~~~~~~

点评

段式LCD  详情 回复 发表于 2015-5-27 09:04
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
咖啡分你一半 发表于 2015-5-9 14:06
看不懂这个到底是什么东西~~~~~~~~~~~

段式LCD
 
 
 

回复

7

帖子

2

TA的资源

一粒金砂(初级)

4
 
①void lcd_set_pixel(uint8_t pix_com, uint8_t pix_seg);
②void lcd_clear_pixel(uint8_t pix_com, uint8_t pix_seg);
③void lcd_write_packet(enum LCD_TDG_enum lcd_tdg, uint8_t first_seg,
                                     const uint8_t *data, size_t width, uint8_t dir);
这三个函数具体怎么实现啊???求解
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表