i.MX6ULL终结者LCD屏幕显示例程程序设计

本文档详细介绍了在i.MX6ULL嵌入式平台上进行LCD屏幕显示的例程设计,包括驱动文件的创建、LCD初始化、点阵数据的获取以及在LCD上显示字符和图形的方法。通过LCD驱动程序和应用接口实现画点、画线、画圆、显示字符串等功能,并使用PCtoLCD2002软件提取ASCII字符集的点阵数据。
摘要由CSDN通过智能技术生成

本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\14_lcd 目录下。我们在Ubuntu系统下使用命令“mkdir 14_lcd”建立“14_lcd”文件夹,如图1所示:
在这里插入图片描述

图 1

然后使用“cd 14_lcd”命令进入到14_lcd文件夹。

然后使用命令“cp -r …/13_printf/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“14_lcd”里面,如图 2所示:
在这里插入图片描述

图 2

然后在drivers目录下建立lcd文件夹,用来保存lcd的驱动文件,然后在“drivers/lcd”目录中新建lcd.h、lcd.c、lcdapi.c、lcdapi.h、font.h五个文件,lcd.h和lcd.c是LCD的驱动文件,lcdapi.h和lcdapi.c应用层接口实现画点,画线,画圆,显示字符串等一些列函数。我们打开lcd.h文件,输入下面的代码:

  1 #ifndef _BSP_LCD_H
  2 #define _BSP_LCD_H
  3 
  4 #include "imx6ul.h"
  5 
  6 
  7 /* 颜色 */
  8 #define LCD_BLUE                  0x000000FF
  9 #define LCD_GREEN                 0x0000FF00
 10 #define LCD_RED                   0x00FF0000
 11 #define LCD_CYAN                  0x0000FFFF
 12 #define LCD_MAGENTA       0x00FF00FF
 13 #define LCD_YELLOW                0x00FFFF00
 14 #define LCD_LIGHTBLUE     0x008080FF
 15 #define LCD_LIGHTGREEN    0x0080FF80
 16 #define LCD_LIGHTRED      0x00FF8080
 17 #define LCD_LIGHTCYAN     0x0080FFFF
 18 #define LCD_LIGHTMAGENTA  0x00FF80FF
 19 #define LCD_LIGHTYELLOW   0x00FFFF80
 20 #define LCD_DARKBLUE      0x00000080
 21 #define LCD_DARKGREEN     0x00008000
 22 #define LCD_DARKRED       0x00800000
 23 #define LCD_DARKCYAN      0x00008080
 24 #define LCD_DARKMAGENTA   0x00800080
 25 #define LCD_DARKYELLOW    0x00808000
 26 #define LCD_WHITE                 0x00FFFFFF
 27 #define LCD_LIGHTGRAY     0x00D3D3D3
 28 #define LCD_GRAY                  0x00808080
 29 #define LCD_DARKGRAY      0x00404040
 30 #define LCD_BLACK                 0x00000000
 31 #define LCD_BROWN                 0x00A52A2A
 32 #define LCD_ORANGE                0x00FFA500
 33 #define LCD_TRANSPARENT   0x00000000
 34 
 35 /* LCD显存地址 */
 36 #define LCD_FRAMEBUF_ADDR       (0x89000000)
 37 
 38 /* LCD控制参数结构体 */
 39 struct tftlcd_typedef{
   
 40         unsigned short height;          /* LCD屏幕高度 */
 41         unsigned short width;           /* LCD屏幕宽度 */
 42         unsigned char pixsize;          /* LCD每个像素所占字节大小 */
 43         unsigned short vspw;
 44         unsigned short vbpd;
 45         unsigned short vfpd;
 46         unsigned short hspw;
 47         unsigned short hbpd;
 48         unsigned short hfpd;
 49         unsigned int framebuffer;       /* LCD显存首地址          */
 50         unsigned int forecolor;         /* 前景色 */
 51         unsigned int backcolor;         /* 背景色 */
 52 };
 53 
 54 extern struct tftlcd_typedef tftlcd_dev;
 55 
 56 
 57 /* 函数声明 */
 58 void lcd_init(void);
 59 void lcdgpio_init(void);
 60 void lcdclk_init(unsigned char loopDiv, unsigned char prediv, unsigned char div);
 61 void lcd_reset(void);
 62 void lcd_noreset(void);
 63 void lcd_enable(void);
 64 void video_pllinit(unsigned char loopdivi, unsigned char postdivi);
 65 
 66 inline void lcd_drawpoint(unsigned short x,unsigned short y,unsigned int color);
 67 inline unsigned int lcd_readpoint(unsigned short x,unsigned short y);
 68 void lcd_clear(unsigned int color);
 69 void lcd_fill(unsigned    short x0, unsigned short y0, unsigned short x1, unsigned short y1, unsigned int color);
 70 #endif

我们在lcd.h里面定义了些宏表示不同的颜色。第36行的LCD_FRAMEBUF_ADDR是显存的地址,我们将显存的地址放在了内存的0X89000000地址处,前面我们介绍了,本例程用到的屏幕分辨率是1024x600,所以占用的内存是1024x600x4,大约是2.4MB大小。I.MX6 ULL终结者开发板配置的内存有256MB和512MB两种。内存的地址范围范别是:0x80000000-0x90000000和0x80000000-0xA0000000,所以我们设置显存的地址是0x89000000,不管是256MB还是512MB的内存都在有效范围内,所以都可以使用。第39行的tftlcd_typedef结构体,里面保存的是LCD的一些配置参数。第58行到第69行是一些函数的声明。
然后我们打开lcd.c文件,在里面输入下面的代码:

1 #include "lcd.h"
  2 #include "gpio.h"
  3 #include "delay.h"
  4 #include "stdio.h"
  5 
  6 /* 液晶屏参数结构体 */
  7 struct tftlcd_typedef tftlcd_dev;
  8 
  9 /*
 10  * @description : 始化LCD
 11  * @param               : 无
 12  * @return              : 无
 13  */
 14 void lcd_init(void)
 15 {
   
 16         lcdgpio_init();                 /* 初始化IO                     */
 17         lcdclk_init(32, 3, 5);  /* 初始化LCD时钟                */
 18 
 19         lcd_reset();                    /* 复位LCD                      */
 20         delayms(10);                    /* 延时10ms                     */
 21         lcd_noreset();                  /* 结束复位                     */
 22 
 23         /* TFTLCD参数结构体初始化 */
 24         tftlcd_dev.height = 600;
 25         tftlcd_dev.width = 1024;
 26         tftlcd_dev.pixsize = 4; /* ARGB8888模式,每个像素4字节 */
 27         tftlcd_dev.vspw = 3;
 28         tftlcd_dev.vbpd = 20;
 29         tftlcd_dev.vfpd = 12;
 30         tftlcd_dev.hspw = 20;
 31         tftlcd_dev.hbpd = 140;
 32         tftlcd_dev.hfpd = 160;
 33         tftlcd_dev.framebuffer = LCD_FRAMEBUF_ADDR;
 34         tftlcd_dev.backcolor = LCD_WHITE;/* 背景色为白色 */
 35         tftlcd_dev.forecolor = LCD_BLACK;/* 前景色为黑色 */
 36 
 37         /* 初始化ELCDIF的CTRL寄存器
 38      * bit [31] 0 : 停止复位
 39      * bit [19] 1 : 旁路计数器模式
 40      * bit [17] 1 : LCD工作在dotclk模式
 41      * bit [15:14] 00 : 输入数据不交换
 42      * bit [13:12] 00 : CSC不交换
 43      * bit [11:10] 11 : 24位总线宽度
 44      * bit [9:8]   11 : 24位数据宽度,也就是RGB888
 45      * bit [5]     1  : elcdif工作在主模式
 46      * bit [1]     0  : 所有的24位均有效
 47          */
 48          LCDIF->CTRL |= (1 << 19) | (1 << 17) | (0 << 14) | (0 << 12) |
 49                         (3 << 10) | (3 << 8) | (1 << 5) | (0 << 1);
 50         /*
 51      * 初始化ELCDIF的寄存器CTRL1
 52      * bit [19:16]  : 0X7 ARGB模式下,传输24位数据,A通道不用传输
 53          */
 54          LCDIF->CTRL1 = 0X7 << 16;
 55 
 56          /*
 57       * 初始化ELCDIF的寄存器TRANSFER_COUNT寄存器
 58       * bit [31:16]  : 高度
 59       * bit [15:0]   : 宽度
 60           */
 61         LCDIF->TRANSFER_COUNT  = (tftlcd_dev.height << 16)
 62                                 | (tftlcd_dev.width << 0);
 63 
 64         /*
 65      * 初始化ELCDIF的VDCTRL0寄存器
 66      * bit [29] 0 : VSYNC输出
 67      * bit [28] 1 : 使能ENABLE输出
 68      * bit [27] 0 : VSYNC低电平有效
 69      * bit [26] 0 : HSYNC低电平有效
 70      * bit [25] 0 : DOTCLK上升沿有效
 71      * bit [24] 1 : ENABLE信号高电平有效
 72      * bit [21] 1 : DOTCLK模式下设置为1
 73      * bit [20] 1 : DOTCLK模式下设置为1
 74      * bit [17:0] : vsw参数
 75          */
 76         LCDIF->VDCTRL0 = 0;     //先清零
 77         LCDIF->VDCTRL0 = (0 << 29) | (1 << 28) | (0 << 27) |
 78                                          (0 << 26) | (0 << 25) | (1 << 24) |
 79                         (1 << 21) | (1 << 20) | (tftlcd_dev.vspw << 0);
 80         /*
 81          * 初始化ELCDIF的VDCTRL1寄存器
 82          * 设置VSYNC总周期
 83          */
 84         LCDIF->VDCTRL1 = tftlcd_dev.height + tftlcd_dev.vspw
 85                         + tftlcd_dev.vfpd + tftlcd_dev.vbpd;
 86 
 87          /*
 88           * 初始化ELCDIF的VDCTRL2寄存器
 89           * 设置HSYNC周期
 90           * bit[31:18] :hsw
 91           * bit[17:0]  : HSYNC总周期
 92           */
 93         LCDIF->VDCTRL2 = (tftlcd_dev.hspw << 18)
 94                         | (tftlcd_dev.width
 95                                 + tftlcd_dev.hspw
 96                                 + tftlcd_dev.hfpd
 97                                 + tftlcd_dev.hbpd);
 98 
 99         /*
100          * 初始化ELCDIF的VDCTRL3寄存器
101          * 设置HSYNC周期
102          * bit[27:16] :水平等待时钟数
103          * bit[15:0]  : 垂直等待时钟数
104          */
105         LCDIF->VDCTRL3 = ((tftlcd_dev.hbpd + tftlcd_dev.hspw) << 16) | (tftlcd_dev.vbpd + tftlcd_dev.vspw);
106 
107         /*
108          * 初始化ELCDIF的VDCTRL4寄存器
109          * 设置HSYNC周期
110          * bit[18] 1 : 当使用VSHYNC、HSYNC、DOTCLK的话此为置1
111          * bit[17:0]  : 宽度
112          */
113 
114         LCDIF->VDCTRL4 = (1<<18) | (tftlcd_dev.width);
115 
116         /*
117      * 初始化ELCDIF的CUR_BUF和NEXT_BUF寄存器
118      * 设置当前显存地址和下一帧的显存地址
119          */
120         LCDIF->CUR_BUF = (unsigned int)tftlcd_dev.framebuffer;
121         LCDIF->NEXT_BUF = (unsigned int)tftlcd_dev.framebuffer;
122 
123 
124         lcd_enable();   
#include //包含头文件 #include //包含固有函数 #define uint unsigned int //定义一下方便使用 #define uchar unsigned char //定义一下方便使用 #define DATA P0 //LCD12864数据线 sbit RS=P2^2; // 数据\指令 D、I 选择 sbit RW=P2^1; // 读\写 选择 R、W sbit EN=P2^0; // 读\写使能 sbit cs1=P2^4; // 片选1 sbit cs2=P2^3; // 片选2 /********************************/ /* 定义图形字库 */ uchar code Hzk[]={ //左屏幕第1页 0xFF,0xFF,0xFF,0xFF,0x7F,0xBF,0x3F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, //左屏幕第2页 0xFF,0xFF,0xFF,0xAB,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, //左屏幕第3页 0xFF,0xFF,0xFF,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0xE0,0xEA,0xE0,0xEA, 0xE0,0xEA,0xE0,0xEA,0xE0,0xEA,0xC0,0xAA,0x00,0xAA,0xE0,0xEA,0xE0,0xEA,0xE0,0xEA, 0xE0,0xEA,0xE0,0xEA,0xE0,0xEA,0x80,0xAA,0x00,0xAA,0x00,0xAA,0xC0,0xEA,0xE0,0xEA, 0xE0,0xEA,0xE0,0xEA,0xC0,0xEA,0x80,0xAA,0x00,0xAA,0xE0,0xEA,0xE0,0xEA,0xE0,0xEA, //左屏幕第4页 0xFF,0xFF,0xFF,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0xFF,0xFF,0xFF,0xFF, 0x38,0xBA,0x38,0xBF,0x3F,0xBF,0x1F,0xAF,0x00,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xBA, 0x78,0xFA,0xFD,0xFF,0xDF,0xBF,0x0F,0xAA,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0x01,0xAA, 0x00,0xAA,0x01,0xEF,0xFF,0xFF,0xFF,0xFE,0x00,0xAA,0x00,0xAA,0x00,0xAA,0xFF,0xFF, //左屏幕第5页 0xFF,0xFF,0xFF,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x0F,0xAF,0x0F,0xAF, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x0F,0xAF,0x0F,0xAF,0x0F,0xAA, 0x00,0xAA,0x03,0xAF,0x0F,0xAF,0x0F,0xAE,0x00,0xAA,0x01,0xAB,0x07,0xAF,0x0F,0xAE, 0x0E,0xAE,0x0F,0xAF,0x07,0xAF,0x03,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x0F,0xAF, //左屏幕第6页 0xFF,0xFF,0xFF,0xEA,0x80,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, //左屏幕第7页 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, //左屏幕第8页 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, //右屏幕第1页 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF, 0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x1F,0xBF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第2页 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x01,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第3页 0xE0,0xEA,0xE0,0xEA,0xE0,0xEA,0xE0,0xAA,0x00,0xEA,0xE0,0xEA,0xE0,0xEA,0xE0,0xEA, 0xE0,0xEA,0xE0,0xEA,0xE0,0xAA,0x00,0xAA,0xE0,0xEA,0xE0,0xEA,0x00,0xAA,0x00,0xAA, 0x00,0xEA,0xE0,0xEA,0xE0,0xAA,0x00,0xAA,0x80,0xEA,0xC0,0xEA,0xE0,0xEA,0xE0,0xEA, 0xE0,0xEA,0x80,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第4页 0xFF,0xFF,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xFF,0xFF,0xFF,0xFF,0xBA,0x38,0xBA, 0x38,0xBA,0x38,0xBA,0x00,0xAA,0x00,0xAA,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0x00,0xAA, 0x00,0xFF,0xFF,0xFF,0xFF,0xAA,0x00,0xAA,0x8F,0xAF,0x9F,0xBF,0x3C,0xBE,0x38,0xFB, 0xFB,0xFB,0xF3,0xEB,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第5页 0x0F,0xAF,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAF,0x0F,0xAF,0x0F,0xAE,0x0E,0xAE, 0x0E,0xAE,0x0E,0xAE,0x0E,0xAA,0x00,0xAA,0x03,0xAF,0x07,0xAF,0x0F,0xAE,0x0E,0xAE, 0x0F,0xAF,0x07,0xAB,0x01,0xAA,0x00,0xAB,0x03,0xAF,0x07,0xAF,0x0E,0xAE,0x0E,0xAF, 0x0F,0xAF,0x07,0xAB,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第6页 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA, 0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0xE0,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第7页 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, //右屏幕第8页 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00, }; /*状态检查,LCD是否忙*/ void CheckState() { uchar dat;//状态信息(判断是否忙) RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据 RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0 do{ DATA=0x00; EN=1; //EN下降源 _nop_(); //一个时钟延时 dat=DATA; EN=0; dat=dat>>7; //仅当第7位为0时才可操作(判别busy信号) }while(!(dat==0x00)); } /*写命令到LCD中*/ SendCommandToLCD(uchar com) { CheckState();//状态检查,LCD是否忙 RS=0; //向LCD发送命令。RS=0写指令,RS=1写数据 RW=0;//R/W=“L” ,E=“H→L”数据被写到 IR 或 DR DATA=com; //com :命令 EN=1;//EN下降源 _nop_(); _nop_(); EN=0; } /*设置页 0xb8是页的首地址*/ void SetLine(uchar page) { page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页 SendCommandToLCD(page); } /*设定显示开始行,0xc0是行的首地址*/ void SetStartLine(uchar startline) { startline=0xc0|startline; //1100 0000 SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示 } /*设定列地址--Y 0-63 ,0x40是列的首地址*/ void SetColumn(uchar column) { column=column &0x3f; //column最大值为64,越出 0=<column<=63 column= 0x40|column; //01xx xxxx SendCommandToLCD(column); } /*开关显示,0x3f是开显示,0x3e是关显示*/ void SetOnOff(uchar onoff) { onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1 SendCommandToLCD(onoff); } /*写显示数据 */ void WriteByte(uchar dat) { CheckState();//状态检查,LCD是否忙 RS=1; //RS=0写指令,RS=1写数据 RW=0;////R/W=“L” ,E=“H→L”数据被写到 IR 或 DR DATA=dat;//dat:显示数据 EN=1; //EN下降源 _nop_(); _nop_(); EN=0; } /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ void SelectScreen(uchar screen) { switch(screen) { case 0: cs1=0;//全屏 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; case 1: cs1=0;//左屏 _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); break; case 2: cs1=1;//右屏 _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; } } /*清屏screen: 0-全屏,1-左屏,2-右*/ void ClearScreen(uchar screen) { uchar i,j; SelectScreen(screen); for(i=0;i<8;i++) //控制页数0-7,共8页 { SetLine(i); SetColumn(0); for(j=0;j<64;j++) //控制列数0-63,共64列 { WriteByte(0x00); //写点内容,列地址自动加1 } } } /*延时程序*/ void delay(uint z) { uint i,j; for(i=0; i<z; i++) for(j = 0; j < 110; j++); } /*向上滚屏*//*这里用做滚动显示*/ void lcd_rol() { uint i; for(i = 0; i < 64; i++) { cs1=0; // 片选1 SendCommandToLCD(0xc0+i); cs1=1; cs2=0;// 片选2 //SendCommandToLCD(0xc0+62-i); SendCommandToLCD(0xc0+i); cs2=1; // 片选2 delay(100);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值