无字库12864液晶的驱动方法
12864液晶显示程序51驱动

#include <reg52.h>#include <intrins.h>sbit LCD_RS =P0^0; //L:COMMAND; H:DATA sbit LCD_RW =P0^1; //L:WRITE; H:READ sbit LCD_E =P0^2; //INPUT ENABLEsbit LCD_CS1 =P0^3; //L有效sbit LCD_RES =P0^4; //L有效#define data_bus P2#define control_bus P0#define uchar unsigned char#define uint unsigned int//=====延时N微秒==============void delay_nus(uint n){while(n--);return;}//=====延时N毫秒==============void delay_nms(uint n){int i;for(i=0;i<n;i++)delay_nus(123);}//=====忙检测=================void check_busy(void){uchar read_data=0xff;data_bus=0xff;LCD_RS=0;LCD_RW=1; //读命令LCD_CS1=0; //片使能while((read_data&0x80)==0x80){LCD_E=1;_nop_();_nop_();read_data=data_bus;LCD_E=0;}LCD_E=0;LCD_CS1=1; //片禁能}//=====写命令到寄存器========= void send_cmd(uchar cmd) small{check_busy();LCD_RS=0; //写的是命令LCD_RW=0; //写命令LCD_CS1=0; //片使能data_bus=cmd;LCD_E=1; //使能_nop_();_nop_();LCD_E=0;_nop_();_nop_();LCD_CS1=1; //片禁能}//=====写数据到DDRAM========= void send_dat(uchar dat) small{check_busy();LCD_RS=1; //写的是数据LCD_RW=0; //写数据LCD_CS1=0; //片使能data_bus=dat;LCD_E=1;_nop_();_nop_();LCD_E=0;_nop_();_nop_();LCD_CS1=1; //片禁能}//=======初始化============== void lcd_initial(void) small{LCD_RES=0;delay_nms(50);LCD_RES=1;LCD_E=0;delay_nms(50);send_cmd(0xA0);send_cmd(0xC8);send_cmd(0xA2);send_cmd(0x2C);send_cmd(0x2E);send_cmd(0x2F);send_cmd(0x25);send_cmd(0x81);send_cmd(0x14);send_cmd(0xAF);send_cmd(0xE0);send_cmd(0x40);}//=======写列地址==============void Set_Colume_Address(unsigned char dat){unsigned char tmp;tmp=dat>>4;send_cmd(0x10|tmp); //送列地址高三位tmp=0x0f&dat;send_cmd(tmp); //送列地址低四位}code unsigned char number[][16] = {/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, /*-- 文字: - --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}; code unsigned char Hz[][32] = {/*-- 文字: 中--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00, 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,/*-- 文字: 鼎--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x00,0x00,0x7E,0x52,0x66,0x4A,0x52,0x7E,0x00,0x00,0xF8,0x00,0x00, 0x00,0x84,0x65,0x1D,0x05,0x05,0xFF,0x00,0x00,0xFF,0x05,0x05,0x05,0xFD,0x00,0x00,/*-- 文字: 技--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00, 0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00,/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0x10,0x90,0x50,0xFF,0x50,0x90,0x12,0x14,0x10,0x10,0x10,0x00, 0x10,0x10,0x08,0x04,0x02,0x01,0x00,0x7F,0x00,0x00,0x01,0x06,0x0C,0x18,0x08,0x00 };/****显示汉字的程序****/void DisplayHz(unsigned int Page,unsigned int Col,unsigned char Hz[],unsigned int zilie) {unsigned int PageCnt,ColCnt;for(PageCnt = Page;PageCnt < Page+2;PageCnt ++){send_cmd(0xb0|PageCnt); //page addressSet_Colume_Address(Col);for(ColCnt = 0;ColCnt < zilie;ColCnt ++){send_dat(Hz[(PageCnt-Page)*zilie + ColCnt]);}}}//=====主程序===================void main (void){unsigned char month=0,nian=10,yue=1,tian=1,shi=0,fen=0,miao=0,i=0,j=0; unsigned char months[12]={31,28,31,30,31,30,31,31,30,31,30,31};lcd_initial();send_cmd(0xa6);for(i=0;i<8;i++) //清屏{send_cmd(0xb0|i);Set_Colume_Address(0);for(j=0;j<128;j++)send_dat(0);}while(1){if(++miao>59){miao=0;if(++fen>59){fen=0;if(++shi>23){shi=0;if(++tian>months[month]){tian=0;if(++yue>11){yue=1;nian++;}}}}}DisplayHz(0,0,number[nian/10],8);DisplayHz(0,16,number[nian%10],8);DisplayHz(0,32,number[11],8);DisplayHz(0,48,number[yue/10],8);DisplayHz(0,64,number[yue%10],8);DisplayHz(0,80,number[11],8);DisplayHz(0,96,number[tian/10],8);DisplayHz(0,112,number[tian%10],8);DisplayHz(3,0,number[shi/10],8);DisplayHz(3,16,number[shi%10],8);DisplayHz(3,32,number[10],8);DisplayHz(3,48,number[fen/10],8);DisplayHz(3,64,number[fen%10],8);DisplayHz(3,80,number[10],8);DisplayHz(3,96,number[miao/10],8);DisplayHz(3,112,number[miao%10],8);DisplayHz(6,14,Hz[0],16);DisplayHz(6,42,Hz[1],16);DisplayHz(6,70,Hz[2],16);DisplayHz(6,98,Hz[3],16);delay_nms(6000);}}。
液晶屏12864的FPGA驱动程序

//液晶屏12864驱动芯片型号为ST7920//芯片型号Altera CYCLONE II EP2C8Q208C8//板载时钟50MHzmodule LCD_test(clk,rst,lcd_e,lcd_rs,lcd_rw,data);input clk; //模块输入时钟50MHzinput rst; //复位信号输入output lcd_e; //使能端output lcd_rs; //数据指令选择output lcd_rw; //读写选择output [7:0] data;reg lcd_e; //这样定义是必须的reg lcd_rw;reg lcd_rs;reg [7:0] data;reg [21:0] clkcnt; //分频用计数寄存器reg clkdiv;reg double_div;reg flag; //初始化标志,复位后flag=0,表示未初始化reg [7:0] state;wire bz_clkcnt;parameter idle=8'b0000_0000; //状态0:用于初始化判断parameter setfunction=8'b0010_0000; //用于选择指令集(基本指令集或扩展指令集)parameter switchmode=8'b0000_1000; //显示状态开关parameter setmode=8'b0000_0100; //parameter clear=8'b0000_0001; //清屏,耗时最久的指令parameter setddram=8'b1000_0000; //设定DDRAM地址,即输入字符的位置parameter write1=8'b1111_0000; //输入字符的编码parameter write2=8'b1110_0000; //再次输入assign bz_clkcnt=(clkcnt[21]==1)?1:0;always@(posedge clk or negedge rst) //分频模块,将50MHz的系统时钟降下来beginif(rst==0)clkcnt=0;else if(clkcnt[21]==1)clkcnt=0;elseclkcnt=clkcnt+1;endalways@(posedge bz_clkcnt or negedge rst) //产生占空比50%的时钟信号beginif(rst==0)clkdiv=0;elseclkdiv=~clkdiv;endalways@(posedge clkdiv) //lcd时钟模块,产生用于lcd动作执行的时钟beginif(rst==0)double_div=0;elsedouble_div=~double_div;endalways@(negedge clkdiv) //lcd使能信号产生模块beginif(rst==0)lcd_e=0;elselcd_e=~lcd_e;endalways@(posedge double_div or negedge rst) //LCD初始化模块,状态机beginif(rst==0)beginflag=0;state=0;endelsebegincase(state)idle:beginif(flag==0) //判断初始化标志位flag==0则进入初始化流程beginflag=1; //开始初始化流程并将flag置1(保证只初始化一回)state=setfunction;endelse //若flag==1表示已经进行过初始化,则不进入初始化流程beginlcd_rw=1;endsetfunction:beginlcd_rw=0;lcd_rs=0;data=8'h30;state=switchmode; end switchmode:beginlcd_rw=0;lcd_rs=0;data=8'h0c;state=clear;endclear:beginlcd_rw=0;lcd_rs=0;data=8'h01;state=setmode; endsetmode:beginlcd_rw=0;lcd_rs=0;data=8'h06;state=setddram; endsetddram:beginlcd_rw=0;lcd_rs=0;data=8'h80;state=write1;endwrite1:beginlcd_rw=0;lcd_rs=1;data="a";state=write2;endwrite2:lcd_rw=0;lcd_rs=1;data="b";state=idle;endendcaseendend endmodule。
12864LCD驱动原理

12864LCD驱动原理
在初始化阶段,我们需要进行一系列的设置和配置以确保显示屏正常
工作。
这包括发送指令序列,设置显示模式、偏置电压、对比度和字符显
示等参数。
通过这些初始化设置,我们可以确保每个像素点的状态都能清
晰可见。
在数据写入阶段,我们可以向特定的位置写入数据以控制像素点的亮
灭状态。
通过选择特定的行和列,在给定的位置上点亮或熄灭单个像素点。
这通常通过提供特定格式的数据来实现,其中每个字节表示8个像素点的
状态。
1.硬件连接:液晶显示屏与控制器之间通过平行数据总线进行连接。
控制器提供行、列选择信号以及数据和控制信号。
还需要通过其他引脚来
提供电源和对比度调节信号。
2.初始化:在驱动液晶显示屏之前,我们需要发送一些特定的初始化
命令以设置液晶显示屏的参数。
这些命令包括清屏,设置显示模式、偏置
电压、对比度等。
3.数据写入:在初始化完成后,我们可以开始向液晶显示屏写入数据
以控制像素点的状态。
数据可以通过给定的坐标来确定,其中选择特定的
行和列。
写入数据时,需要同时提供数据信号以及行和列选择信号。
4.控制信号:除了数据信号外,还需要提供行和列选择信号以确定要
控制的像素点位置。
行选择信号(Y0~Y63)选择要操作的行,而列选择信
号(X0~X127)选择要操作的列。
SPI方式来驱动12864液晶

SPI⽅式来驱动12864液晶这是⽤SPI⽅式来驱动12864液晶的源程序,液晶屏的控制芯⽚为ST7565P经测试SPI的时钟可达到振荡频率的⼆分频。
⽐⽤普通IO⼝模拟串⾏的⽅式快多了。
下⾯贴出源代码,有详细注释。
本程序简单实⽤,可拿去作简单参考。
编译环境:GCC+AVR STUDIO单⽚机:ATMEGA 8515晶振: 3.6864M#include //包含头⽂件#include#define COMMAND 1#define DATA 0///////////////////////////////////////////数据线定义:// SI==========PB5 //// A0==========PC0// CS==========PC2// RES=========PC1// SCL=========PB7///////////////////////////////////////////unsigned char gushi[8][112]PROGMEM={{0x10,0x10,0x92,0x92,0x92,0xF2,0x9E,0x92,0x92,0x92,0x92,0x92,0xFE,0x10,0x10,0x00, //君问归期未有期0x00,0x00,0xF8,0x01,0x06,0xE0,0x22,0x22,0x22,0x22,0xE2,0x02,0x02,0xFE,0x00,0x00,0x00,0xF8,0x00,0x00,0xFF,0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00,0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x40,0x40,0x48,0x48,0x48,0x48,0xC8,0xFF,0x48,0x48,0x48,0x48,0x48,0x40,0x40,0x00,0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00},{0x40,0x20,0x10,0x0C,0xFE,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0xFD,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x03,0x02,0x02,0x02,0x02,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x87,0x40,0x30,0x0F,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,0x20,0x20,0x10,0x10,0x08,0x06,0x01,0xFF,0x01,0x02,0x04,0x08,0x18,0x30,0x10,0x00,0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x7F,0x00,0x00,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00},{0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00, //巴⼭夜⾬涨池0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x04,0x04,0x84,0xC4,0x3C,0x14,0x85,0x66,0xBC,0x24,0x24,0x24,0xE4,0x24,0x04,0x00,0x02,0x02,0xF2,0x32,0x52,0x92,0x12,0xFE,0x32,0x52,0x92,0x12,0xF2,0x02,0x02,0x00,0x10,0x61,0x86,0x60,0xF2,0x12,0x12,0x1E,0x80,0xFF,0xA0,0x90,0x88,0x86,0x80,0x00,0x24,0x24,0xE4,0xFC,0xA2,0x22,0x22,0x80,0x70,0x00,0xFF,0x40,0x20,0x18,0x00,0x00,0x10,0x60,0x02,0x8C,0x60,0x80,0xF8,0x40,0x40,0xFE,0x20,0x20,0x10,0xF0,0x00,0x00},{0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x20,0x00,0x00,0x20,0x7F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x02,0x01,0x00,0xFF,0x00,0x82,0x41,0x22,0x14,0x09,0x14,0x23,0x40,0xC0,0x40,0x00,0x00,0x00,0xFF,0x01,0x02,0x04,0x00,0x7F,0x01,0x02,0x44,0x80,0x7F,0x00,0x00,0x00,0x04,0xFC,0x03,0x00,0x01,0x41,0x81,0x7F,0x00,0xFF,0x42,0x0C,0x30,0x60,0x20,0x00,0x02,0x01,0x00,0xFF,0x00,0x83,0x40,0x20,0x18,0x07,0x01,0x06,0x18,0xE0,0x40,0x00,0x08,0x08,0x7C,0x03,0x00,0x00,0x3F,0x40,0x40,0x5F,0x40,0x42,0x44,0x43,0x70,0x00},{0x80,0x40,0xF0,0x1C,0x07,0xE2,0x24,0x24,0x24,0xE4,0x04,0x04,0xFC,0x04,0x04,0x00, //何当共剪西窗烛0x00,0x00,0x40,0x42,0x5C,0x48,0x40,0x40,0x7F,0x40,0x50,0x4E,0x44,0xC0,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00,0x00,0x00,0x04,0xF4,0x54,0x55,0x56,0x54,0xF4,0x04,0x04,0xE6,0x05,0x04,0xF4,0x04,0x00,0x02,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x02,0x00,0x00,0x4C,0x44,0xE4,0x54,0x44,0x64,0xD5,0x46,0x44,0x4C,0x54,0xD4,0x24,0x2C,0x00,0x80,0x60,0x00,0xFF,0x20,0x18,0xF0,0x10,0x10,0xFF,0x12,0x10,0xF0,0x10,0x00,0x00},{0x00,0x00,0x7F,0x00,0x00,0x07,0x02,0x02,0x02,0x07,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,0x02,0x02,0x82,0x42,0x32,0x1F,0x0A,0x02,0x02,0x06,0x0B,0x32,0xE2,0x42,0x02,0x00,0x00,0x08,0x8F,0x89,0x49,0x2B,0x1D,0x0B,0x08,0x08,0x08,0x4A,0x8C,0x7B,0x00,0x00,0x00,0x7F,0x28,0x24,0x22,0x21,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,0x00,0x00,0x00,0xFF,0x44,0x62,0x55,0x49,0x55,0x43,0x41,0x40,0xFF,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x04,0x28,0x63,0x21,0x21,0x3F,0x11,0x15,0x1B,0x30,0x00,0x00},{0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00, //却话巴⼭夜⾬时0x40,0x41,0x4E,0xC4,0x00,0x20,0x24,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x20,0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x04,0x04,0x84,0xC4,0x3C,0x14,0x85,0x66,0xBC,0x24,0x24,0x24,0xE4,0x24,0x04,0x00,0x02,0x02,0xF2,0x32,0x52,0x92,0x12,0xFE,0x32,0x52,0x92,0x12,0xF2,0x02,0x02,0x00,0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00},{0x00,0x10,0x3C,0x13,0x10,0x08,0x0A,0x1C,0x08,0xFF,0x00,0x08,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x7E,0x22,0x22,0x23,0x22,0x22,0x7E,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x20,0x00,0x00,0x20,0x7F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x02,0x01,0x00,0xFF,0x00,0x82,0x41,0x22,0x14,0x09,0x14,0x23,0x40,0xC0,0x40,0x00,0x00,0x00,0xFF,0x01,0x02,0x04,0x00,0x7F,0x01,0x02,0x44,0x80,0x7F,0x00,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00},};//////////////////////////////////发送⼀个字节到ST7565P并等待发送完毕//⼊⼝:要发送的字节//返回值:⽆////////////////////////////////void SPIByte(unsigned char byte){SPDR = byte; //写数据while(!(SPSR & (1<}//////////////////////////////////////////////////将⼀个字节发送的ST7565P的函数//⼊⼝参数:select ,data//select:根据此值确定发送给ST7565P的是数据还是命令//data: 要发送给ST7565的⼀个字节//返回值:⽆////////////////////////////////////////////////void LCD_SPISend(unsigned char select,unsigned char data){PORTC &= ~(1<<2); // CS=0 芯⽚使能信号if(select == COMMAND) //传输的是命令{PORTC &= ~(1<<0); // 根据ST7565P的数据⼿册,传输命令时A0应该是为低电平 SPIByte(data); PORTC |= 1<<0; // A0=1}else{SPIByte(data);}PORTC |= 1<<2; //CS= 恢复不使能}//////////////////////////////////////////////写坐标函数//⼊⼝参数:x y//y: 页⾯地址,此液晶将显⽰区域分为9个页⾯,y的值域0~8 //x: 列地址,值域:0~127//返回值:⽆////////////////////////////////////////////void LCD_XYSet(unsigned char x,unsigned char y){LCD_SPISend(COMMAND,0xB0|y); //y的值为0~8LCD_SPISend(COMMAND,0x10|(x>>4));}///////////////////////////////////////延时函数//⼊⼝:ms 当延时100毫秒时,ms的值为100即可//返回值:⽆/////////////////////////////////////void DelayMs(volatile unsigned int ms){volatile unsigned int i;volatile unsigned int j;for(i=0;i{j=280;while(j--);}}////////////////////////////////////////////////////////初始化SPI及液晶屏的函数//⼊⼝:⽆//返回值:⽆/////////////////////////////////////////////////////void LCD_Init(void){SPCR = 0x5C;SPSR |= 1<//SPI的功能设置解释:使能SPI;采⽤主机模式;SPI的传输模式为模式3;时钟频率为系统时钟的两分频,即 //3.6864/2M DelayMs(100);SPIByte(0xFF); //可发可不发,⽆意义PORTC &= ~(1<<1); //将复位脚拉低DelayMs(5); //延时5ms,等待电源稳定PORTC |= 1<<1; //将复位脚拉⾼DelayMs(5);LCD_SPISend(COMMAND,0xAE); //将液晶屏的显⽰关掉LCD_SPISend(COMMAND,0xA3); //设置偏压⽐LCD_SPISend(COMMAND,0xA0); //设置SEG 输出⽅向LCD_SPISend(COMMAND,0xC8); //设置公共端输出扫描⽅向LCD_SPISend(COMMAND,0x25); //调整(1 + Rb/Ra) ratio 值,调整此值影响很⼤LCD_SPISend(COMMAND,0x81); //开始设置α的命令LCD_SPISend(COMMAND,0x28); //设置α的值,值越⼤对⽐度越强,调整此值影响不太,是微调的DelayMs(5);LCD_SPISend(COMMAND,0x2F); //开启相关电压DelayMs(50);LCD_SPISend(COMMAND,0xF8);LCD_SPISend(COMMAND,0x01); //此两条命令是设置升压⽐的DelayMs(500); //不知此延时可否省去,不过了安全起见,初次调试保留为好。
12864(ST7565P)液晶驱动

12864(ST7565P)液晶驱动显示概念含有ST7565P 芯片的液晶,是没有文库支持的功能,但是没有就没有啦!液晶可以给我画画,那么它就是好东西了。
液晶的“显示”,液晶的“扫描次序”全部都与CGRAM分配有很大的关系。
我们先了解“扫描次序”吧。
宏观上一副液晶是“64高x 128宽”。
微观上由芯片ST7565P驱动的一副12864 液晶是由“8个8 高x 128宽的页”组成。
至于液晶的“扫描次序”就与4个命令有关系。
上图表示了,当命令为0xA0列扫描是“自左向右”,如果命令式0xA1列扫描是“自右向左”。
总归,这两个命令控制了“列扫描次序”除了控制列扫描的命令以外,当然还有控制“页扫描次序”的命令。
如上图,命令0xC0 控制页扫描是“从下至上”,然而命令0xc8 控制页扫描“又上至下”。
无论页扫描的次序是“从上至下”还是“从下至上”,然而每一页的列填充,都是“低位开始高位结束”关于列扫描就有列填充的问题。
我们知道每“一页”都是由“8 高x 128宽”组成。
换句话说,这里没有“行扫描”的概念,因为“一页”都是由“一个字节数据,列填充128次”成为一页。
如上图中所示。
假设“页扫描次序”是由上至下,填充的值是0x0f,那么经过128次的“列扫描”以后,一页的扫描结果会是如上图所示。
关于ST7565P 芯片,命令,和液晶扫描它们之间的关系而已,我们简单来总结一下:(一)CGRAM分布是由8页组成。
(二)每一页是由一个字节填充和128次列扫描组成。
(三)列扫描次序与命令0xA0 与0xA1有关。
(四)页扫描次序与命令0xC0 与0xC8 有关。
(五)列填充字节的高位低位关系与页扫描命令有关。
(六)不存在行扫描概念。
上图所示是“页扫描”由上至下,“列扫描”由左至右,列填充值是0x0f。
在CGRAM分布方面。
CGRAM 可以说是由8 bits x 1024 words,如果以“页”去分配,也就是说8 page x 8 bits x 128 words ,那么“页”的偏移量就是128。
点阵12864液晶操作

点阵LCD12864的显示原理(不带字库)在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。
而对于中文,常用却有6000以上,于是我们的D OS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。
而剩下的低128位则留给英文字符使用,即英文的内码。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:图1 “A”字模图而中文的“你”在字模中的记载却如图2所示:图2 “你”字模图12864点阵型LCD简介12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏)信号16 CS2 H/L H:选择芯片(左半屏)信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源表1:12864LCD的引脚说明在使用12864LCD前先必须了解以下功能器件才能进行编程。
液晶12864的驱动(带注释)

//写主函数的时候直接调用以下部分子函数就行了#include<reg51.h>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;sbit lcd_en=P2^7;sbit lcd_psb=P3^2; //串/并方式控制sbit lcd_rst=P3^7; //液晶复位端口void delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=120;j>0;j--);}void delay_nop(){_nop_();_nop_();_nop_();_nop_();}/* 以下是lcd忙碌检查函数,result为1时,忙;* result为0时,闲;可写指令与数据。
*/bit lcd_busy(){bit result;lcd_rs=0;lcd_rw=1;lcd_en=1;delay_nop();result=(bit)(P0&0x80);lcd_en=0;return(result);}/**** 以下是写指令函数**** */void lcd_wcmd(uchar cmd){while(lcd_busy());lcd_rs=0;lcd_rw=0;lcd_en=0;_nop_();_nop_();P0=cmd;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下是写数据函数**** */void lcd_wdat(uchar dat){while(lcd_busy());lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下lcd初始化函数**** */void lcd_init(){lcd_psb=1;lcd_rst=0;delay_ms(3);lcd_rst=1;delay_ms(3);lcd_wcmd(0x34);delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标delay_ms(5);lcd_wcmd(0x01); //清楚lcd显示的内容delay_ms(5);}/**** 以下是lcd清屏函数**** */void lcd_clr(){lcd_wcmd(0x01);delay_ms(5);}/* 以下是设定显示位置函数* 变量X表示行,Y表示列**/void lcd_pos(uchar x,uchar y){uchar pos;if(x==1) {x=0x80;}else if(x==2) {x=0x90;}else if(x==3) {x=0x88;}else if(x==4) {x=0x98;}pos=x+y;lcd_wcmd(pos);}/* 以下是设定显示位置函数* 变量i表闪烁次数*/void flash(uint i){delay_ms(1000);for(;i>0;i--){lcd_wcmd(0x08); //关闭显示delay_ms(500);lcd_wcmd(0x0c); //开显示delay_ms(500);}}。
12864驱动

LCD12864底层驱动#include<at89x52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define out0 P0 //定义out0为P0口sbit LCD_RST=P1^0;sbit LCD_CS2=P1^1;sbit LCD_CS1=P1^2;sbit LCD_E=P1^3;sbit LCD_WR=P1^4;sbit LCD_RS=P1^5;uchar code hanzi_ZM[][32]={/*-- 0 文字: 欢--*/0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08, 0x08,0x28,0x18,0x08,0x00,0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06, 0x18,0x30,0x60,0x20,0x00,};uchar code shuzi_ZM[][16]={/*-- 文字: 0 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10, 0x20,0x20,0x10,0x0F,0x00,};void delayms(uint x) //延时毫秒函数{uchar i;while(x--)for(i=0;i<123;i++);}void busy() //读忙信号{uchar mang; //忙变量LCD_E=0; //使能端无效LCD_RS=0; //指令LCD_WR=1; //读do{out0=0xff;LCD_E=1; //使能端有效_nop_(); //等待一段时间让信号稳定后再读mang=out0;LCD_E=0; //使能端无效}while(mang&0x90); //若不忙则退出循环}void writeData(uchar x) //写数据{busy(); //读忙out0=x; //将x写入TG12864中_nop_();LCD_RS=1; //数据LCD_WR=0; //写LCD_E=1; //使能端有效_nop_();LCD_E=0; //使能端无效LCD_WR=1;}void writeOrder(uchar x) //写指令{busy();out0=x;_nop_();LCD_RS=0; //指令LCD_WR=0; //写LCD_E=1; //使能端有效_nop_();LCD_E=0; //使能端无效LCD_WR=1;}void lcd_x(uchar x) //定位x坐标{writeOrder(0xb8|x); //设置页地址}void lcd_y(uchar y) //定位y坐标{writeOrder(0x40|y); //设置Y地址}void lcd_xy(uchar x,y) //定位{if(y<64) //若列小于64在左半屏显示{LCD_CS1=1; //左半屏片选有效LCD_CS2=0; //右半屏片选无效lcd_y(y); //写入y地址}else //若列大于64在右半屏显示{LCD_CS1=0; //左半屏片选无效LCD_CS2=1; //右半屏片选有效lcd_y(y-64); //写入y地址}lcd_x(x); //写入x地址}void qingpin() //清屏函数{uchar i,j;LCD_CS1=LCD_CS2=1; //片选有效for(i=0;i<8;i++) //写8页{lcd_y(0); //从第0列开始lcd_x(i); //从i页开始for(j=0;j<128;j++) //写128列{writeData(0x00); //输出数据0x00 }}LCD_CS1=LCD_CS2=0; //片选无效}void initTG12864() //初始化12864{LCD_RST=0; //TG12864复位delayms(15);LCD_RST=1;LCD_CS1=LCD_CS2=1;writeOrder(0x3e); //关显示writeOrder(0xb8); //页地址出初始化从0页开始writeOrder(0x40); //列地址出初始化从列开始writeOrder(0xc0); //显示开始线从第一行开始writeOrder(0x3f); //开显示LCD_CS1=LCD_CS2=0;}void writeHan(uchar x,y,z,uchar code *p)//写一个汉字16*16{uint t=0;uchar i,j;for(i=x;i<x+2;i++) //显示一个汉字占两页{for(j=y;j<y+16;j++) //显示一个汉字占16列{lcd_xy(i,j);//定位坐标位i页j列if(z==0) // 反白0;正常1writeData(p[t++]);//输出正常字模数据elsewriteData(~p[t++]); //输出反白字模数据}}LCD_CS1=LCD_CS2=0;}void writeAscii(uchar x,y,z,uchar code *p)//写一个字符8*16{uint t=0;uchar i,j;for(i=x;i<x+2;i++){for(j=y;j<y+8;j++) //显示一个字符占8列{lcd_xy(i,j);if(z==0)writeData(p[t++]);elsewriteData(~p[t++]);}}LCD_CS1=LCD_CS2=0;}void main() //主函数{initTG12864(); //初始化TG12864qingpin(); //清屏writeHan(2,32,0,hanzi_ZM[0]); //欢writeAscii(4,80,0,shuzi_ZM[0]);while(1);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无字库12864液晶的驱动方法在制作单片机系统时,一般都需要用显示器件来显示单片机的工作状态并显示输出结果,如LED、数码管和液晶显示器等。
LED最简单,但能给出的信息很少。
数码管能清晰地显示数字和部分字母,但是耗电较大,不适合使用电池供电的装置。
常见的液晶显示器有段式液晶、字符液晶和图形液晶等。
其中,段式液晶最省电,但对于通用显示使用起来不很方便,只能显示固定式数字或符号,而且需要专用驱动电路或特殊的单片机。
字符液晶(如1602)用得比较多,容易和单片机配合,但是一般都需要5V工作电压,虽然现在也有3V就可以工作的模块,但是体积还是较大,而且只能显示数字和西文字符,无法显示图形和汉字。
点阵液晶模块既可以显示ASCII字符,又可以显示汉字和图形,相对于前面几种,具有更大的灵活性,所以使用得越来越多。
不过常用的图形液晶因为显示面积增加,体积比字符液晶(如1602)更大,价格也更贵。
初学者要注意的是,12864图形点阵液晶随着厂家设计使用的驱动芯片不同,驱动程序有所区别,不像1602那样基本通用。
几种常见的12864图形点阵模块12864点阵液晶模块分为带汉字库和不带汉字库两大类,目前带汉字库的通常是ST7920驱动,它可以工作在汉字字符方式和图形点阵方式,很多制作都用它,如果需要显示较多汉字,用它最为方便。
在显示汉字数量很少的场合,我们可以使用更加廉价的、不带字库的点阵液晶模块,这正是本文重点介绍的。
它们的控制电路有KS0108和ST7565两种:KS0108很简单,一共只有7条指令,可是它没有串行接口;ST7565有20多条指令(最常用的也就几条),有串行接口,可选串行或并行工作。
KS0108和ST7565的指令和上述带字库的ST7920区别较大,所以初学者买液晶时一定要搞清楚是哪种驱动电路。
即使同样的驱动电路,不同厂家或者不同型号的产品,具体细节仍可能不同。
例如有的片选信号是高电平有效,有的却是低电平有效,有的把显示区分为左右两半分别选取,有的却不加区分。
所以使用前要仔细看厂家说明,如果没有,就要看液晶模块背面给出的具体型号,根据这个型号去查找使用手册。
笔者最近在淘宝网上搜寻到一款12864的图形点阵液晶,只有4cm宽、3.5cm高,显示面积为3.2cm宽、1.95cm高,非常小巧。
更加难能可贵的是它可以在3V低电压工作,很适合我们制作小型便携装置。
该液晶模块型号是SP12864FPD-12CSBE,由北京集粹电子设备公司出品,它的外形见图1。
图1 12864图形点阵液晶模块图2 小小日历钟(文字界面)图3 小小日历钟(图形界面)图2、图3所示为笔者用它制作的一个小小日历钟,它的特点是具有可以随意转换的文字和图形界面。
文字界面除了显示年月日时分秒,在右上角还有一个小鸡啄米的小动画,图形界面用指针在刻度上指示出时分秒,是不是有点新意呢?图4所示是调频收音机的显示屏,用进度条指示音量,用刻度尺显示信号强度,比1602只能显示数字和字母要生动多了。
没有字库用起来是否很麻烦?其实搞清了图形点阵的基本工作原理,用起来并不麻烦却更灵活,不带字库我们就按需要打造字符!图4 调频收音机图5 液晶模块采用“COG”封装图6 点阵液晶显示原理下面就谈谈这个液晶的驱动方法,以后将给出一些制作实例,以帮助初学者用它做出具有个性的东西。
液晶模块SO12864-12C简介此型号小液晶包括一系列子型号,详见/Soft/ShowSoftDown.asp?UrlID=1。
这次所用的SO12864FPD-12CSBE只是其中的一种,我们先来了解一下它的主要特性:◆ 逻辑或电源电压2.8~5.5V;◆ 蓝色背光,背光电压3V;◆ 串行接口,用 8个焊盘引出包括电源、背光、地和控制线数据线;◆ 不带字库,需要自己编辑外部字模数组;◆ 速度较快,用时钟1MHz的AVR单片机驱动,编程时无须附加脉冲额外延时;◆ 使用ST7565电路,命令代码一共23条。
显然,它十分适合低压小尺寸场合应用,串行接口最大限度减少了液晶和单片机的连线,虽说比并行慢一点,实际上如果不是频繁刷屏影响并不大。
要自己编制字库确实比较麻烦,但是只要显示的文字量少,制作小字模也不困难,反而可以自己打造个性化的字体,使得显示具有特色。
把液晶模块翻过来,如图5所示,发现电路板上没有通常液晶模块的黑胶封装集成电路,原来这个液晶采用的是“COG”封装,就是把集成电路直接绑定在液晶玻璃板上。
它的8个接口焊盘位于模块上方,定义如下:1. 片选CS:它为低电平才能进行操作,在加载数据后至少维持40ns低电平。
2. 复位RES:启动时至少维持1μs低电平以使液晶内部复位,然后升高,再过1μs完成复位,以后才能对液晶进行操作。
3. 命令数据选择A0:高电平为数据,低电平为命令。
4. 串行时钟SCL:顶底宽度至少25ns,低时A0和SI至少稳定20ns,然后在上升沿加载数据或命令。
5. 串行数据SI:同上,在SCL上升沿加载后至少还要保持10ns稳定。
6. 电源正VCC:最低2.8V,标准3V,最大5.5V。
7. 地VSS。
8. 背光LED+:蓝色背光最低2.8V,标准3V,最大3.2V,使用时要注意不要超过。
在串行模式时,一个命令或数据字节要分为8次加载,从最高位开始。
图形点阵的显示原理12864点阵液晶的图形显示原理都差不多。
液晶屏x方向(水平)具有128列像素从左到右为第0列……第127列,y方向(垂直)具有64行像素。
每8行组成1页,从上到下就是第0页……第7页。
这样以列号和页号为坐标,就可以指定交叉位置的8个像素。
例如第0、1、2、3列第1页的8个像素,如图6所示。
在液晶内部有一块显示缓存区,按照列号和页号就可以对显缓区的某个字节写数,该字节的8位二进制数就对应了液晶屏同样位置的像素的亮灭,如对第1列第1页的那个缓存单元写入0X80即0b10000000,那么液晶对应位置的最下面一点7亮(低位在上高位在下)其余都灭,如果第2列第1页写入0X0F即0b00001111,则该位置上方4个点0123亮,其余像素不亮,第3列第1页写0X33,则该处间隔2点亮。
这样就可以通过程序控制液晶屏的任意像素了。
不同的液晶屏指令代码可能不同(例如这个屏和常见的7920驱动不一样),屏幕划分也可能不同,例如有的是分为左右两半,每半边64列,有的是分为上下两半等。
液晶SO12864-12C的编程要点控制液晶最基本的工作就是往液晶的控制器写入命令码或往显缓区写入数据码,是命令还是数据由加到上述A0的电平高低决定:高,数据;低,命令。
因为现在是串行传送,所以只能由高到低一位位写。
串行只能写不能读。
以前要靠读来判定液晶是否忙,这个液晶速度较高,实际使用证明串行传输不用读忙。
编程就是用单片机的几根口线按照所需的时序发出高低电平,再往液晶里送入代码或数据。
控制脉冲和代码脉冲的时序关系如图7所示。
图7 控制脉冲和代码脉冲的时序关系最常用的几个命令1. 显示开/关:代码:0XAF(开),0XAE(关)启动复位后为“关”,必须在液晶初始化时置“开”。
2. 页地址定位:代码:0XB0……0XB7,对应第0页到第7页,复位后自动安置为第0页。
3. 列地址定位:列地址是0X00……0X7F,但不是直接用列地址而要转换为双字节代码。
方法是0X10加原高4位和0X00加原低4位。
例如第33列,本是0X21,现在应该转换为0X12和0X01,分2次写入。
4. 写显示数据:代码就是显示数据,控制脉冲A0为高。
5. 复位:代码0XE2,通过程序使得液晶恢复各种起始默认状态。
有了这几条命令就已经可以使液晶画出以像素点为基础的图形或字符了。
有些其他命令(如对比控制、亮度、偏压等)就取默认值,无需修改(初始化要用一下),还有些很有用的命令(如反向列页扫描、起始行、反白显示等),需要时再去查资料不迟。
有了上述命令代码,我们就可以通过汇编或C语言,按照控制时序编出子程序或函数,以便在程序中使用。
C语言因为易读性好、通用性好、移植性好所以用得较多,下面就给出一些C的函数,由它们就构成了液晶的驱动。
驱动液晶的基本C函数我们用C语言编程,在C语言里,用“函数”把单片机的一系列具体操作包装起来起个函数名,需要时直接按名调用即可,非常方便。
首先必须解决怎样对液晶串行写数据的问题,然后按照A0线的高低,我们就可以自行编出写数据函数和写命令函数。
一下只列出函数说明和用法举例,函数的具体内容可到《无线电》网站上下载C程序代码。
1. 串行传送1字节数据函数,参数为待传字节。
void LcdWriByte(unsigned char nn) //nn就是待写字节这个是最基本的函数,不过我们不直接用它而是把它放在其他写数据函数里调用。
2. 写命令。
参数为命令码。
void LcdWriCommand(unsigned char command);例如,打开显示:LcdWriCommand(0XAF);3. 写数据。
参数为待写的显示数据。
void LcdWriData(unsigned char data);例如,写显示一个点的数据: LcdWriData(0X01);4. 指定列、页地址。
参数为列地址x和页地址y。
void LcdSetxy(unsigned char x,unsigned chary);例如:LcdSetxy(68,2);//设置显示地址为第68列、第2页。
通常和上一个函数连用,见下一节函数应用举例。
在以上基本函数基础上我们还可以根据命令码推演出几个便于使用的功能函数。
5. 开显示。
void LcdOn(void );例:LcdOn( );6. 关显示。
void LcdOff(void );例:LcdOff( );7. 软复位。
用它可以在任何时刻使液晶屏回到起始状态而显示缓冲区内容不变。
void LcdReset(void );例:LcdReset( );8. 刷屏。
void LcdCls(unsigned char data );就是用数据data写满显示缓冲区,data如果为0,那全屏刷白(无像素显示),如果data为0XFF则全屏刷黑(像素全部亮)。
如果为0XAA 呢?感兴趣的读者不妨实验一下。
例:LcdCls(0 );最后给出该液晶的初始化函数,在系统启动后,MCU初始化以后就进行液晶初始化。
9. LCD初始化。
Void Lcd_ini();通常在程序开始阶段进行,对各种参数进行设置,具体初始化项目请参看函数内容和注解。
函数应用举例1. 在指定位置画1点先给定页和列坐标,就指定了1列8个像素点,1个点的位置从上到下对应数值为0X01、0X02、0X04、0X08、0X10、0X20、0X40、0X80。