回答

收藏

【赚周年币】技术帖Week1-Day5——LPC824 Breakout之五、NOKIA5110 LCD

#线上活动 #线上活动 2665 人阅读 | 0 人回复 | 2017-01-05

本帖最后由 toofree 于 2017-1-17 23:40 编辑

        【赚周年币】技术帖Week1-Day5——LPC824 Breakout之五、NOKIA5110 LCD

        介于LPC824 Breakout板,没有集成板载调试器,仿真是不可能了。
        但是程序总得调试,还有两种方法辅助调试:一、串口打印;二、LCD或LED数码管显示。上一贴我们试了串口打印,那么这贴将开始LCD显示之旅。

        之前买PIC调试卡PTi9时,配有一块NOKIA5110,正好拿来用用。NOKIA5110 LCD几乎是最便宜实惠的LCD方案了,网上资料也是一大把。
        

        今天我们用到的板卡线缆资源有,LPC824 Breakout + NOKIA5110 LCD + USB线 + 杜邦线若干。全家福上图。
        


        为了接线方便,NOKIA5110 LCD小板的信号定义,已经打印好贴在板板背面。
        


        还以上一贴最后上传压缩包做主工程模板。参见贴子最末尾的附件。
        【赚周年币】技术帖Week1-Day4——LPC824 Breakout之四,串口printf
https://www.cirmall.com/bbs/forum ... 59498&fromuid=17147

      

        
        复制上一贴的“Example_My_Printf”工程,改名为“Example_GPIO_LCD5110”,其它文件及文件夹,也相应改名。方法及注意事项,参考上一贴。
        


        NOKIA5110 LCD程序参考“wudianjun2001”的帖子。
      【赚周年币】技术帖——Fireduino学习3:增加NOKIA5110显示
https://www.cirmall.com/bbs/forum ... 57764&fromuid=17147

        下载附件。
https://www.cirmall.com/bbs/forum ... 8MTcxNDd8NTc3NjQ%3D
        解压后有4个文件。
        


        “fire.ino”文件中就两个函数。
        

        Home_Init();完成IO及串口初始化;
        Main_Deal ();作为主循环

        “hfire.cpp”改名为“hfire1.c”,“hfire.h”改名为“hfire1.h”,“ascii.h”不变。将这三个文件放到“\user_bsp”文件夹下的“inc”和“src”文件夹中。
        将“hfire1.c”添加到应用工程中,并对文件作修改,改后的代码如下。
  1. //#include <Arduino.h>
  2. #include "hfire2.h"
  3. #include "ascii.h"
  4. #include "disp_code.h"


  5. volatile unsigned int TCount0 = 0;              //定时计数器0
  6. volatile unsigned int TCount1 = 0;              //定时计数器1
  7. volatile unsigned int TCount2 = 0;              //定时计数器2
  8. //volatile bool Second_Flag = FALSE;           //一秒时间到标志位
  9. //volatile bool Base_Flag = FALSE;             //基准海拔采集标志位
  10. //volatile bool Read_Flag = FALSE;             //读数据时间到标志位
  11. volatile unsigned char Second_Flag = FALSE;           //一秒时间到标志位
  12. volatile unsigned char Base_Flag = FALSE;             //基准海拔采集标志位
  13. volatile unsigned char Read_Flag = FALSE;             //读数据时间到标志位


  14. //发送一字节数据,显示内容的话,一列8位对应一字节,上面对应字节低位
  15. static void SPI_SendByte (uint8_t dat)
  16. //后面省略……若干行
复制代码
文件中间部分不用动。串口初始化部分不需要了,屏蔽掉。
  1. <blockquote>void Home_Init()
复制代码
将“hfire1.h”文件同样需要做修改,
  1. //#include <avr/pgmspace.h>
  2. #include <stdint.h>
  3. #include "lpc8xx_gpio.h"

  4. #ifndef TRUE
  5.         #define TRUE                  1
  6. #endif

  7. #ifndef FALSE
  8.         #define FALSE                 0
  9. #endif

  10. #ifndef HIGH
  11.         #define HIGH                  1
  12. #endif

  13. #ifndef LOW
  14.         #define LOW                 0
  15. #endif

  16. extern volatile unsigned int TCount0;              //定时计数器0
  17. extern volatile unsigned int TCount1;              //定时计数器1
  18. extern volatile unsigned int TCount2;              //定时计数器2
  19. //volatile bool Second_Flag = FALSE;           //一秒时间到标志位
  20. //volatile bool Base_Flag = FALSE;             //基准海拔采集标志位
  21. //volatile bool Read_Flag = FALSE;             //读数据时间到标志位
  22. extern volatile unsigned char Second_Flag;           //一秒时间到标志位
  23. extern volatile unsigned char Base_Flag;             //基准海拔采集标志位
  24. extern volatile unsigned char Read_Flag;             //读数据时间到标志位

  25. #define INPUT  0
  26. #define OUTPUT 1

  27. #define PORT0                        0

  28. /*************************** HAL define ***************************/
  29. <font color="#ff0000">#define   LCD_CS           24
  30. #define   LCD_RST   25
  31. #define   LCD_DC    26
  32. #define   LCD_DIN   27
  33. #define   LCD_CLK   28</font>

  34. #define NOKIA5110_CMD                   0
  35. #define NOKIA5110_DATA                  1
  36.                  
  37. #define LCD5110_WIDTH                   84
  38. #define LCD5110_HEIGHT                  5

  39. <font color="#ff0000">#define NOKIA5110_reset_clear()   GPIOSetBitValue(PORT0, LCD_RST, LOW)  //
  40. #define NOKIA5110_reset_set()     GPIOSetBitValue(PORT0, LCD_RST, HIGH)

  41. #define NOKIA5110_sel_data()      GPIOSetBitValue(PORT0, LCD_DC, HIGH)  //
  42. #define NOKIA5110_sel_cmd()      GPIOSetBitValue(PORT0, LCD_DC, LOW)  //

  43. #define NOKIA5110_cs_set()         GPIOSetBitValue(PORT0, LCD_CS, HIGH)  //
  44. #define NOKIA5110_cs_clear()      GPIOSetBitValue(PORT0, LCD_CS, LOW)  //
  45. #define NOKIA5110_din_set()       GPIOSetBitValue(PORT0, LCD_DIN, HIGH)  //
  46. #define NOKIA5110_din_clear()     GPIOSetBitValue(PORT0, LCD_DIN, LOW)  //
  47. #define NOKIA5110_clk_set()        GPIOSetBitValue(PORT0, LCD_CLK, HIGH)  //
  48. #define NOKIA5110_clk_clear()     GPIOSetBitValue(PORT0, LCD_CLK, LOW)  //</font>
复制代码
末尾两个函数申明也需要改一下,括号内加上“void”。
  1. void Home_Init(void);
  2. void Main_Deal(void);
复制代码
工程主程序,“Example_GPIO_LCD5110.c” 最终修改如下:
  1. #include <stdio.h>
  2. #include "LPC8xx.h"
  3. #include "lpc8xx_gpio.h"
  4. #include "lpc8xx_syscon.h"
  5. #include "utilities.h"
  6. #include "delay.h"
  7. #include "lpc8xx_swm.h"

  8. #include "string.h"
  9. #include "hfire1.h"

  10. extern void setup_debug_uart(void);
  11. void LEDs_Toggle0(uint32_t bits);

  12. unsigned char const DateStr[]=__DATE__;
  13. unsigned char const TimeStr[]=__TIME__;

  14. static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
  15. char s_month[5];
  16. int month, day, year;
  17. unsigned char NewDate[12];

  18. extern void setup_debug_uart(void);

  19. void LEDs_Toggle(uint32_t bits);


  20. /************************** main函数开始 ***********************************/
  21. int main(void) {

  22.   // Local variables
  23.   uint32_t number, temp;

  24.   // Configure the debug uart (see Serial.c)
  25.         setup_debug_uart();
  26.         
  27.   // Reset the GPIO module and enable its clock. See peripherals_lib
  28.   GPIOInit();

  29.   // Config. ports (red LED), (blue LED), (green LED) as outputs,
  30.   // with LEDs off ('1' = off). See utilities_lib
  31.   Config_LEDs(RED | BLUE | GREEN);

  32.   LEDs_On(RED);
  33.         LEDs_On(BLUE);
  34.         LEDs_On(GREEN);
  35.         
  36.         printf("Hello world! \r\n");
  37.         
  38.         Home_Init();
  39.         NOKIA5110_init();
  40.   NOKIA5110_clear_screen();
  41.         
  42.         NOKIA5110_display_1608_text (0, 0, "LPC824");
  43.         NOKIA5110_display_8x6_text (54, 1, "Board");

  44.         sscanf(DateStr, "%s %d %d", s_month, &day, &year);
  45.         month = (strstr(month_names, s_month)-month_names)/3 + 1;        
  46.         //printf("%04d-%02d-%02d\n",year,month,day);
  47.         sprintf(NewDate,"%04d-%02d-%02d",year,month,day);        
  48.         
  49.         NOKIA5110_display_8x6_text (0, 4, NewDate);        
  50.         //NOKIA5110_display_8x6_text (0, 4, DateStr);
  51.         NOKIA5110_display_8x6_text (0, 5, TimeStr);
  52.         
  53.         printf("%s\r\n",NewDate);
  54.         printf("%s\r\n",TimeStr);
  55.         
  56.         while (2) {
  57.                
  58.                 delay_ms(500);
  59.                 //delay_us(500000);
  60.                
  61.                 LEDs_On(RED);        
  62.                 LEDs_Toggle(BLUE);
  63.                
  64.                 delay_ms(500);
  65.                 //delay_us(500000);
  66.                
  67.                 LEDs_Off(RED);
  68.                 LEDs_Toggle(GREEN);               

  69.   }

  70. }
  71. /************************** main函数结束 ***********************************/


  72. void LEDs_Toggle(uint32_t bits)
  73. {
  74.         uint32_t regVal = 0;        

  75.         if ( LPC_GPIO_PORT->PIN0 & (bits) )
  76.         {
  77.                 regVal = 1;
  78.         }
  79.         
  80.         if (regVal == 0)
  81.         {
  82.                 LPC_GPIO_PORT->SET0  = bits;           // Write '1's to bits corresponding to requested LEDs
  83.         }
  84.         else
  85.         {
  86.                 LPC_GPIO_PORT->CLR0  = bits;           // Write '1's to bits corresponding to requested LEDs
  87.         }
  88. }        
复制代码
下载编译生成的“.HEX”到目标板。打开串口终端和LCD屏显示效果。
        

        


        5110中间空了一大片,不要着急。还没完,把汉字显示也加上。从“wudianjun2001”的帖子中下载来的程序是没有汉字显示这块的。
        在“fire1.c”中加一条函数,void NOKIA5110_display_1616_hanzi (unsigned char row, unsigned char page,unsigned char c);
  1. //显示单个16*16汉字,列,行,字符
  2. void NOKIA5110_display_1616_hanzi (unsigned char row, unsigned char page,unsigned char c)
  3. {           
  4.   unsigned char i;         
  5.         
  6.         NOKIA5110_set_XY(row*8, page);// 列,页
  7.         for(i=0; i<16;i++)
  8.         {
  9.                 NOKIA5110_write_byte(han[c*32+i],1);
  10.         }

  11.   NOKIA5110_set_XY(row*8, page+1);// 列,页
  12.         for(i=16; i<32;i++)
  13.         {
  14.                 NOKIA5110_write_byte(han[c*32+i],1);
  15.         }        
  16. }
复制代码
同时在“fire1.”中也加上函数申明。
         
        到目前为止,汉字字模还没有取呢。好吧,打开取模工具,输入汉字并取模。
        

        生成了汉字字模数组,创建一个“disp_code.h”文件,把数组复制进去。数组名称为“han[]”,要与我们定义汉字显示函数时用到的数组名称相同。并且把"disp_code.h"包含进“fire1.c”中。
  1. const unsigned char han[]=
  2. {
  3. /*--  文字:  汉  --*/
  4. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  5. 0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
  6. 0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,

  7. /*--  文字:  字  --*/
  8. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  9. 0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00,
  10. 0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,

  11. /*--  文字:  显  --*/
  12. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  13. 0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00,
  14. 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,

  15. /*--  文字:  示  --*/
  16. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  17. 0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
  18. 0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,

  19. /*--  文字:  测  --*/
  20. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  21. 0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
  22. 0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

  23. /*--  文字:  试  --*/
  24. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  25. 0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
  26. 0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,

  27. /*--  文字:  程  --*/
  28. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  29. 0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,
  30. 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,

  31. /*--  文字:  序  --*/
  32. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  33. 0x00,0x00,0xFC,0x04,0x04,0x14,0x14,0x35,0x56,0x94,0x54,0x34,0x14,0x04,0x04,0x00,
  34. 0x80,0x60,0x1F,0x00,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x03,0x01,0x00

  35. };
复制代码
主程序“Example_GPIO_LCD5110.c” 中增加4条,汉字显示代码
  1. NOKIA5110_display_1616_hanzi(1,2,0);
  2.         NOKIA5110_display_1616_hanzi(3,2,1);
  3.         NOKIA5110_display_1616_hanzi(5,2,2);
  4.         NOKIA5110_display_1616_hanzi(7,2,3);
复制代码
重新编译生成新的“.HEX”,并下载到到目标板。看看LCD屏显示效果。
        


        LCD最下面两行,显示的日期和时间是程序编译时,自动提取的当前系统时间。定义了下面两个数组
unsigned char const DateStr[]=__DATE__;
unsigned char const TimeStr[]=__TIME__;
日期在程序中已经做了转换,在串口终端和LCD上显示为2017-01-05的格式。
      
        好了,完美收工。关于基于LPC824 Breakout 的 NOKIA5110 LCD显示,就到这里了。
        依照惯例, 修改后工程文件打包附上。
        
LPC824_Example_Code_Bundle_Keil_r1.0.rar (1.53 MB, 下载次数: 15)

关注下面的标签,发现更多相似文章

评分

参与人数 2 +50 收起 理由
EEboard爱板网 + 15 3周发帖养成记 奖励
loveeeboard + 35

查看全部评分

分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条