查看: 285|回复: 0

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

[复制链接]

24

主题

0

好友

4487

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1342 天

    连续签到: 52 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2017-1-5 00:35:32 |显示全部楼层
    本帖最后由 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线 + 杜邦线若干。全家福上图。
             IMG_20170104_233726.jpg


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


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

           傲游截图20170104235235.jpg

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


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

            下载附件。
    http://www.eeboard.com/bbs/forum ... 8MTcxNDd8NTc3NjQ%3D
            解压后有4个文件。
             傲游截图20170105001942.jpg


            “fire.ino”文件中就两个函数。
             傲游截图20170105005332.jpg

            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屏显示效果。
             傲游截图20170105014205.jpg

             IMG_20170105_014305.jpg


            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.”中也加上函数申明。
             
            到目前为止,汉字字模还没有取呢。好吧,打开取模工具,输入汉字并取模。
             傲游截图20170105020705.jpg

            生成了汉字字模数组,创建一个“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屏显示效果。
             IMG_20170105_021321.jpg


            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, 下载次数: 4)
    已有 2 人评分 收起 理由
    EEboard爱板网 + 15 3周发帖养成记 奖励
    loveeeboard + 35

    总评分:  + 50   查看全部评分

    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-7-28 08:29 , Processed in 0.204904 second(s), 15 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部