TA的每日心情 | 开心 2 小时前 |
---|
签到天数: 3947 天 连续签到: 18 天 [LV.Master]伴坛终老
|
本帖最后由 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”添加到应用工程中,并对文件作修改,改后的代码如下。- //#include <Arduino.h>
- #include "hfire2.h"
- #include "ascii.h"
- #include "disp_code.h"
- volatile unsigned int TCount0 = 0; //定时计数器0
- volatile unsigned int TCount1 = 0; //定时计数器1
- volatile unsigned int TCount2 = 0; //定时计数器2
- //volatile bool Second_Flag = FALSE; //一秒时间到标志位
- //volatile bool Base_Flag = FALSE; //基准海拔采集标志位
- //volatile bool Read_Flag = FALSE; //读数据时间到标志位
- volatile unsigned char Second_Flag = FALSE; //一秒时间到标志位
- volatile unsigned char Base_Flag = FALSE; //基准海拔采集标志位
- volatile unsigned char Read_Flag = FALSE; //读数据时间到标志位
- //发送一字节数据,显示内容的话,一列8位对应一字节,上面对应字节低位
- static void SPI_SendByte (uint8_t dat)
- //后面省略……若干行
复制代码 文件中间部分不用动。串口初始化部分不需要了,屏蔽掉。- <blockquote>void Home_Init()
复制代码 将“hfire1.h”文件同样需要做修改,- //#include <avr/pgmspace.h>
- #include <stdint.h>
- #include "lpc8xx_gpio.h"
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef HIGH
- #define HIGH 1
- #endif
- #ifndef LOW
- #define LOW 0
- #endif
- extern volatile unsigned int TCount0; //定时计数器0
- extern volatile unsigned int TCount1; //定时计数器1
- extern volatile unsigned int TCount2; //定时计数器2
- //volatile bool Second_Flag = FALSE; //一秒时间到标志位
- //volatile bool Base_Flag = FALSE; //基准海拔采集标志位
- //volatile bool Read_Flag = FALSE; //读数据时间到标志位
- extern volatile unsigned char Second_Flag; //一秒时间到标志位
- extern volatile unsigned char Base_Flag; //基准海拔采集标志位
- extern volatile unsigned char Read_Flag; //读数据时间到标志位
- #define INPUT 0
- #define OUTPUT 1
- #define PORT0 0
- /*************************** HAL define ***************************/
- <font color="#ff0000">#define LCD_CS 24
- #define LCD_RST 25
- #define LCD_DC 26
- #define LCD_DIN 27
- #define LCD_CLK 28</font>
- #define NOKIA5110_CMD 0
- #define NOKIA5110_DATA 1
-
- #define LCD5110_WIDTH 84
- #define LCD5110_HEIGHT 5
- <font color="#ff0000">#define NOKIA5110_reset_clear() GPIOSetBitValue(PORT0, LCD_RST, LOW) //
- #define NOKIA5110_reset_set() GPIOSetBitValue(PORT0, LCD_RST, HIGH)
- #define NOKIA5110_sel_data() GPIOSetBitValue(PORT0, LCD_DC, HIGH) //
- #define NOKIA5110_sel_cmd() GPIOSetBitValue(PORT0, LCD_DC, LOW) //
- #define NOKIA5110_cs_set() GPIOSetBitValue(PORT0, LCD_CS, HIGH) //
- #define NOKIA5110_cs_clear() GPIOSetBitValue(PORT0, LCD_CS, LOW) //
- #define NOKIA5110_din_set() GPIOSetBitValue(PORT0, LCD_DIN, HIGH) //
- #define NOKIA5110_din_clear() GPIOSetBitValue(PORT0, LCD_DIN, LOW) //
- #define NOKIA5110_clk_set() GPIOSetBitValue(PORT0, LCD_CLK, HIGH) //
- #define NOKIA5110_clk_clear() GPIOSetBitValue(PORT0, LCD_CLK, LOW) //</font>
复制代码 末尾两个函数申明也需要改一下,括号内加上“void”。- void Home_Init(void);
- void Main_Deal(void);
复制代码 工程主程序,“Example_GPIO_LCD5110.c” 最终修改如下:- #include <stdio.h>
- #include "LPC8xx.h"
- #include "lpc8xx_gpio.h"
- #include "lpc8xx_syscon.h"
- #include "utilities.h"
- #include "delay.h"
- #include "lpc8xx_swm.h"
- #include "string.h"
- #include "hfire1.h"
- extern void setup_debug_uart(void);
- void LEDs_Toggle0(uint32_t bits);
- unsigned char const DateStr[]=__DATE__;
- unsigned char const TimeStr[]=__TIME__;
- static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
- char s_month[5];
- int month, day, year;
- unsigned char NewDate[12];
- extern void setup_debug_uart(void);
- void LEDs_Toggle(uint32_t bits);
- /************************** main函数开始 ***********************************/
- int main(void) {
- // Local variables
- uint32_t number, temp;
- // Configure the debug uart (see Serial.c)
- setup_debug_uart();
-
- // Reset the GPIO module and enable its clock. See peripherals_lib
- GPIOInit();
- // Config. ports (red LED), (blue LED), (green LED) as outputs,
- // with LEDs off ('1' = off). See utilities_lib
- Config_LEDs(RED | BLUE | GREEN);
- LEDs_On(RED);
- LEDs_On(BLUE);
- LEDs_On(GREEN);
-
- printf("Hello world! \r\n");
-
- Home_Init();
- NOKIA5110_init();
- NOKIA5110_clear_screen();
-
- NOKIA5110_display_1608_text (0, 0, "LPC824");
- NOKIA5110_display_8x6_text (54, 1, "Board");
- sscanf(DateStr, "%s %d %d", s_month, &day, &year);
- month = (strstr(month_names, s_month)-month_names)/3 + 1;
- //printf("%04d-%02d-%02d\n",year,month,day);
- sprintf(NewDate,"%04d-%02d-%02d",year,month,day);
-
- NOKIA5110_display_8x6_text (0, 4, NewDate);
- //NOKIA5110_display_8x6_text (0, 4, DateStr);
- NOKIA5110_display_8x6_text (0, 5, TimeStr);
-
- printf("%s\r\n",NewDate);
- printf("%s\r\n",TimeStr);
-
- while (2) {
-
- delay_ms(500);
- //delay_us(500000);
-
- LEDs_On(RED);
- LEDs_Toggle(BLUE);
-
- delay_ms(500);
- //delay_us(500000);
-
- LEDs_Off(RED);
- LEDs_Toggle(GREEN);
- }
- }
- /************************** main函数结束 ***********************************/
- void LEDs_Toggle(uint32_t bits)
- {
- uint32_t regVal = 0;
- if ( LPC_GPIO_PORT->PIN0 & (bits) )
- {
- regVal = 1;
- }
-
- if (regVal == 0)
- {
- LPC_GPIO_PORT->SET0 = bits; // Write '1's to bits corresponding to requested LEDs
- }
- else
- {
- LPC_GPIO_PORT->CLR0 = bits; // Write '1's to bits corresponding to requested LEDs
- }
- }
复制代码 下载编译生成的“.HEX”到目标板。打开串口终端和LCD屏显示效果。
5110中间空了一大片,不要着急。还没完,把汉字显示也加上。从“wudianjun2001”的帖子中下载来的程序是没有汉字显示这块的。
在“fire1.c”中加一条函数,void NOKIA5110_display_1616_hanzi (unsigned char row, unsigned char page,unsigned char c);- //显示单个16*16汉字,列,行,字符
- void NOKIA5110_display_1616_hanzi (unsigned char row, unsigned char page,unsigned char c)
- {
- unsigned char i;
-
- NOKIA5110_set_XY(row*8, page);// 列,页
- for(i=0; i<16;i++)
- {
- NOKIA5110_write_byte(han[c*32+i],1);
- }
- NOKIA5110_set_XY(row*8, page+1);// 列,页
- for(i=16; i<32;i++)
- {
- NOKIA5110_write_byte(han[c*32+i],1);
- }
- }
复制代码 同时在“fire1.”中也加上函数申明。
到目前为止,汉字字模还没有取呢。好吧,打开取模工具,输入汉字并取模。
生成了汉字字模数组,创建一个“disp_code.h”文件,把数组复制进去。数组名称为“han[]”,要与我们定义汉字显示函数时用到的数组名称相同。并且把"disp_code.h"包含进“fire1.c”中。- const unsigned char han[]=
- {
- /*-- 文字: 汉 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
- /*-- 文字: 字 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00,
- 0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
- /*-- 文字: 显 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00,
- 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,
- /*-- 文字: 示 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
- 0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,
- /*-- 文字: 测 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
- 0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
- /*-- 文字: 试 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00,
- 0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00,
- /*-- 文字: 程 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,
- 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,
- /*-- 文字: 序 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFC,0x04,0x04,0x14,0x14,0x35,0x56,0x94,0x54,0x34,0x14,0x04,0x04,0x00,
- 0x80,0x60,0x1F,0x00,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x03,0x01,0x00
- };
复制代码 主程序“Example_GPIO_LCD5110.c” 中增加4条,汉字显示代码- NOKIA5110_display_1616_hanzi(1,2,0);
- NOKIA5110_display_1616_hanzi(3,2,1);
- NOKIA5110_display_1616_hanzi(5,2,2);
- 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)
|
评分
-
查看全部评分
|