STM3212864显示驱动程序,,寄存器版
- 格式:doc
- 大小:58.00 KB
- 文档页数:8
//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。
#include "display12864.h"f/********** 以下是相关引脚定义。
**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。
#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。
*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。
12864的驱动程序(51汇编)推荐CS2 BIT P1.5CS1 BIT P1.4E BIT P1.2R_W BIT P1.1D_I BIT P1.0RST BIT P1.3COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器DENG BIT P1.6WAIT EQU 22H;中断循环次数(软件延时)ORG 0000HAJMP MAINORG 000BHAJMP TIME_ET0ORG 0050HMAIN:NOPMOV WAIT,#00H;清0MOV TMOD,#01H ;方式1,16位定时器MOV TH0,#00HMOV TL0,#00HMOV R5,#0C0H ;设置行命令,选中的行显示在第一行SETB ET0SETB EA ;开定时,但是还没有开T0定时.程序后面才开CLR RSTSETB RST ;给一个低电平脉冲信号来复位LCD; LCALL DELLY; CPL DENG; MOV COM,#3EH ;指令将显示设置开关关闭; LCALL PR1; LCALL DELLY ;延时一段时间MOV COM,#3FH ;指令将显示设置开关打开LCALL PR1LCALL DELLYCLR CS2 ;清屏(清右半边屏幕)SETB CS1LCALL QINGP;清屏子程序LCALL DELLYCLR CS1SETB CS2LCALL QINGP;清屏子程序LCALL DELLY;调延时子程序等待它反应,我们也可以读它的状态来判断.;SJMP $;---------左屏幕----------------;name1:;显示公司名称CLR CS2SETB CS1;选中左半边屏幕LCALL DELLYMOV DPTR,#ADDRJ;江MOV R3,#0B8H ;页地址MOV R4,#40H ;列地址LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRS ;苏MOV R3,#0B8H ;页地址MOV R4,#50H ;列地址LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRSH ;省MOV R3,#0B8H ;页地址MOV R4,#60H ;列地址LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRJI ;激MOV R3,#0B8H ;页地址MOV R4,#70H ;列地址LCALL HZSHOW;显示公司网址; CLR CS2; SETB CS1;选中左半边屏幕;LCALL DELLYMOV DPTR,#ADDW ;WMOV R3,#0BAHMOV R4,#48HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDW ;WMOV R3,#0BAHMOV R4,#50HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDW ;WMOV R3,#0BAHMOV R4,#58HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDD ;.MOV R3,#0BAHMOV R4,#60HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDJ ;JMOV R3,#0BAHMOV R4,#68HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDS ;SMOV R3,#0BAHMOV R4,#70HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDL ;LMOV R3,#0BAHMOV R4,#78HLCALL YWSHOW;LCALL DELLY;显示图象; CLR CS2; SETB CS1;选中左半边屏幕;LCALL DELLYMOV DPTR,#PIC1 ;图象的首地址MOV R3,#0BCH ;第三页MOV R4,#40H ;第0列LCALL PICSHOW ;图象显示子程序MOV DPTR,#PIC2 ;图象的首地址MOV R3,#0BDH ;第四页MOV R4,#40HLCALL PICSHOW;LCALL DELLYMOV DPTR,#PIC3 ;图象的首地址MOV R3,#0BEHMOV R4,#40HLCALL PICSHOWMOV DPTR,#PIC4 ;图象的首地址MOV R3,#0BFHMOV R4,#40HLCALL PICSHOW; LCALL DELLY ;调用延时子程序;-----------右屏幕-------------- ; LCALL DELLYCLR CS1SETB CS2;LCALL DELLYMOV DPTR,#ADDRG;光MOV R3,#0B8H ;页地址 MOV R4,#40H ;列地址 LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRY ;研 MOV R3,#0B8H ;页地址 MOV R4,#50H ;列地址 LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRJIU ;究 MOV R3,#0B8H ;页地址 MOV R4,#60H ;列地址 LCALL HZSHOW;LCALL DELLYMOV DPTR,#ADDRSUO ;所 MOV R3,#0B8H ;页地址 MOV R4,#70H ;列地址 LCALL HZSHOW;LCALL DELLY;sjmp name1;LCALL DELLYMOV DPTR,#ADDA ;AMOV R3,#0BAHMOV R4,#40HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDS ;SMOV R3,#0BAHMOV R4,#48HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDE ;EMOV R3,#0BAHMOV R4,#50HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDR ;RMOV R3,#0BAHMOV R4,#58HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDD ;.MOV R3,#0BAHMOV R4,#60HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDCC ;CMOV R3,#0BAHMOV R4,#68HLCALL YWSHOW;LCALL DELLYMOV DPTR,#ADDN ;NMOV R3,#0BAHMOV R4,#70HLCALL YWSHOW;LCALL DELLYSETB TR0 ;开定时器AJMP $ ;等待定时中断;中断子程序TIME_ET0:INC WAITMOV A,#0AH ;中断16次,CJNE A,WAIT,TT2; SJMP MOV_LINE ;相等则跳转,换行;ADD_WAIT:; MOV TH0,#00H; MOV TL0,#00H ;清空定时器; RETI;MOV_LINE:NOPMOV WAIT,#00H;清空软件记数单元CPL DENG ;猜想是用来指示换行的灯,没什么实际意义CLR CS2SETB CS1 ;选中左屏MOV COM,R5 ;R5当前的内容 #0C0H,该命令是用来设置显示起始行.所设置的行将在第一行显示,估计用来动态显示的.LCALL PR1 ;1100 0000 后六位对应0-63行,当前是将第一行显示CPL CS1CPL CS2 ;切换到右屏显示MOV COM,R5LCALL PR1CJNE R5,#0FFH,TT;MOV R5,#0C0H;重新开始显示下一个轮回的第一行AJMP TT2TT:INC R5;显示下面一行内容TT2:MOV TH0,#00HMOV TL0,#00H;清空定时器RETIQINGP:MOV R3,#0B8HMOV COM,R3 ;设置页地址为0LCALL PR1MOV COM,#40H;设置列地址0LCALL PR1MOV R1,#00HMOV R2,#00HLOOP_CLR:MOV DAT,#00H;输入数据为0则为清掉屏幕LCALL PR2INC R1CJNE R1,#40H,LOOP_CLR;看看是否到了64列了,如果没有满则继续刷新列MOV R1,#00HINC R2 ;用来控制页数的INC R3 ;下一页,设置地址为下一页MOV COM,R3MOV COM,#40H;重新设置列地址0LCALL PR1CJNE R2,#08H,LOOP_CLRRET;16*16汉字显示的子程序HZSHOW:MOV COM,R3 ;R3为页地址LCALL PR1MOV COM,R4 ;R4为列地址LCALL PR1MOV R2,#20H ;32MOV R1,#00H ;R1用来取字码的LOOP:CJNE R2,#10H,LOOP1;如果不相等则跳转,刚刚开始不相等的,如果相等了则换到下一页 INC R3 ;下一页MOV COM,R3LCALL PR1MOV COM,R4 ;R4为列地址LCALL PR1LOOP1:MOV A,R1MOVC A,@A+DPTRMOV DAT,A ;传送字符编码LCALL PR2INC R1DJNZ R2,LOOPRET;10*16英文显示的子程序YWSHOW:MOV COM,R3LCALL PR1MOV COM,R4LCALL PR1MOV R2,#10HMOV R1,#00HLOOP2:CJNE R2,#08H,LOOP22INC R3MOV COM,R3MOV COM,R4LCALL PR1LOOP22:MOV A,R1MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R1DJNZ R2,LOOP2RET;32*32图片1HANG显示的子程序PICSHOW:MOV COM,R3;页地址LCALL PR1MOV COM,R4;列地址LCALL PR1MOV R2,#20H;32*32的图片MOV R1,#00HLOOP3:MOV A,R1MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R1DJNZ R2,LOOP3RET;延时DELLY:MOV R7,#0A8HMS2:MOV R6,#0FFHMS1:DJNZ R6,MS1DJNZ R7,MS2RET;读BF和AC值PR0:PUSH ACCMOV P0,#0FFHSETB ESETB R_WMOV COM,P0CLR EPOP ACCRET;写指令子程序PR1:PUSH ACCSETB ECLR D_ICLR R_WMOV P0,COMCLR EPOP ACCRET;写数据子程序PR2:PUSH ACCSETB ESETB D_ICLR R_WMOV P0,DATCLR EPOP ACCRET; 江(0) 苏(1) 省(2) 激(3) 光(4) 研(5) 究(6) 所(7)ADDRJ:;-- 文字: 江 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 10H,60H,01H,0C6H,30H,00H,04H,04H,04H,0FCH,04H,04H,04H,04H,00H,00H;DB 04H,04H,7EH,01H,20H,20H,20H,20H,20H,3FH,20H,20H,20H,20H,20H,00H;"江",0 ADDRS:;-- 文字: 苏 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 04H,04H,44H,44H,44H,5FH,44H,0F4H,44H,5FH,44H,0C4H,04H,04H,04H,00H;DB 00H,40H,4CH,27H,10H,0CH,07H,01H,20H,40H,40H,3FH,00H,02H,0CH,00H;"苏",1 ADDRSH:;-- 文字: 省 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 00H,10H,90H,88H,86H,0C0H,0C0H,0BFH,0A0H,90H,90H,8AH,84H,18H,00H,00H;DB 01H,01H,00H,00H,0FFH,4AH,4AH,4AH,4AH,4AH,4AH,4AH,0FFH,00H,00H,00H;"省",2 ADDRJI:;-- 文字: 激 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 10H,21H,86H,60H,7CH,56H,0D5H,54H,7CH,20H,0F8H,17H,90H,70H,10H,00H;DB 04H,7CH,43H,21H,19H,07H,45H,85H,7DH,20H,13H,0CH,33H,60H,20H,00H;"激",3 ADDRG:;-- 文字: 光 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 00H,40H,42H,44H,5CH,0C8H,40H,7FH,40H,0C0H,50H,4EH,44H,60H,40H,00H;DB 00H,80H,40H,20H,18H,07H,00H,00H,00H,3FH,40H,40H,40H,40H,78H,00H;"光",4ADDRY:;-- 文字: 研 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 02H,0C2H,0F2H,4EH,0C2H,02H,40H,42H,0FEH,42H,42H,42H,0FEH,42H,42H,00H;DB 01H,00H,3FH,10H,9FH,40H,20H,18H,07H,00H,00H,00H,0FFH,00H,00H,00H;"研",5 ADDRJIU:;-- 文字: 究 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 00H,4CH,24H,94H,84H,84H,0F5H,86H,84H,84H,14H,24H,44H,0CH,04H,00H;DB 00H,00H,40H,20H,10H,0CH,03H,00H,00H,3FH,40H,40H,40H,40H,78H,00H;"究",6ADDRSUO:;-- 文字: 所 --;-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --DB 00H,0FEH,12H,12H,11H,0F1H,01H,00H,0FEH,22H,22H,21H,0E1H,21H,21H,00H;DB 40H,3FH,01H,01H,81H,41H,30H,0CH,03H,00H,00H,00H,0FFH,00H,00H,00H;"所",7;公司网址:w(0) w(1) w(2) .(3) j(4) s(5) l(6) a(7) s(8) e(9) r(10) .(11) c(12) n(13) ADDW:;-- 文字: w --DB 80H,80H,00H,80H,00H,80H,80H,80H,0FH,30H,0CH,03H,0CH,30H,0FH,00H;"w",0ADDD:;-- 文字: . --DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,30H,30H,00H,00H,00H,00H,00H;".",3ADDJ:;-- 文字: J --DB 00H,00H,00H,80H,98H,98H,00H,00H,00H,0C0H,80H,80H,80H,7FH,00H,00H;"j",4ADDS:;-- 文字: S --DB 00H,00H,80H,80H,80H,80H,80H,00H,00H,33H,24H,24H,24H,24H,19H,00H;"s",5ADDL:;-- 文字: L --DB 00H,08H,08H,0F8H,00H,00H,00H,00H,00H,20H,20H,3FH,20H,20H,00H,00H;"l",6 ADDA:;-- 文字: A --DB 00H,00H,80H,80H,80H,80H,00H,00H,00H,19H,24H,22H,22H,22H,3FH,20H;"a",7 ADDE:;-- 文字: E --DB 00H,00H,80H,80H,80H,80H,00H,00H,00H,1FH,22H,22H,22H,22H,13H,00H;"e",9 ADDR:;-- 文字: R --DB 80H,80H,80H,00H,80H,80H,80H,00H,20H,20H,3FH,21H,20H,00H,01H,00H;"r",10 ADDCC:;-- 文字: C --DB 00H,00H,00H,80H,80H,80H,00H,00H,00H,0EH,11H,20H,20H,20H,11H,00H;"c",12 ADDN:;-- 文字: N --DB 80H,80H,00H,80H,80H,80H,00H,00H,20H,3FH,21H,00H,00H,20H,3FH,20H;"n",13PIC1:;-- 调入了一幅图像;-- 宽度x高度=32x32 --DB 00H,7FH,09H,0FH,00H,7FH,40H,40H,00H,7FH,41H,41H,00H,00H,00H,00H;DB 00H,00H,00H,00H,7FH,41H,41H,41H,00H,4FH,4AH,4AH,7AH,00H,7FH,00H;PIC2:DB 00H,0FEH,82H,7EH,00H,0C4H,8AH,72H,00H,0FEH,12H,1EH,00H,00H,00H,00H; DB 00H,00H,0FCH,22H,0FCH,00H,0FEH,32H,5EH,80H,0FEH,04H,08H,04H,0FEH,00H; PIC3:DB 00H,00H,0FCH,1CH,0F4H,9CH,80H,80H,80H,00H,00H,00H,20H,0F0H,0B8H,0F8H; DB 0BCH,0F0H,20H,00H,00H,0E0H,0E0H,0E0H,00H,80H,9CH,0F4H,9CH,80H,00H,00H; PIC4:DB 00H,00H,7FH,04H,07H,06H,7EH,7EH,40H,00H,00H,00H,00H,33H,32H,7BH;DB 3AH,3BH,78H,38H,00H,00H,00H,01H,0F1H,11H,12H,0FFH,82H,83H,00H,00HEND。
STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00 ,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till pll used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。
//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。
#include "display12864.h"f/********** 以下是相关引脚定义。
**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。
#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。
*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。
基于STM32系列的12864显示/*-----------------------------------------------LCD初始化------------------------------------------------*/void CS_Set_H( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_13);}void CS_Set_L( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_13);}void SCLK_Set_H( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SCLK_Set_L( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SID_Set_H( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void SID_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void PSB_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_2);}/*--------------------------------按照液晶的串口通信协议,发送数据----------------------------------*/void LCD_SendByte(unsigned byte){unsigned i;for(i=0;i<8;i++){SCLK_Set_L();if(byte&0x80){SID_Set_H();}else{SID_Set_L();}LCD_Delay(1);SCLK_Set_H();byte<<=1;LCD_Delay(1);}}/*--------------------------------写串口命令,分三个字节完成----------------------------------*/void LCD_WriteCom(unsigned com){CS_Set_H(); //打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(com&0xf0);//第二字节LCD_SendByte((com<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------写数据,分三个字节完成----------------------------------*/void LCD_WriteData(unsigned date){CS_Set_H();//打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(date&0xf0);//第二字节LCD_SendByte((date<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------LCD初始化----------------------------------*/void LCD_Init(){LCD_Delay(50);PSB_Set_L(); //选择串口通信模式(该端口未定义)LCD_Delay(50);LCD_WriteCom(0x30);//基本指令集动作, 绘图不显示LCD_Delay(50);LCD_WriteCom(0x0c);//开显示,不显示游标和游标位置LCD_Delay(50);LCD_WriteCom(0x01);//清屏LCD_Delay(50);}/*--------------------------------清屏----------------------------------*/void LCD_Clear(){LCD_WriteCom(0x01);//清屏}/*--------------------------------设定显示位置----------------------------------*/void LCD_SetPos(unsigned x,unsigned y){unsigned pos;if(x == 0)x = 0x80;else if(x == 1)x = 0x90;else if(x == 2)x = 0x88;else if(x == 3)x = 0x98;pos = x + y;LCD_WriteCom(pos);//显示地址}/*-----------------------------------------------显示函数------------------------------------------------*/Display(unsigned x,unsigned y,unsigned date) {unsigned a;unsigned b;unsigned dat;a=x;b=y;dat=date;LCD_SetPos(a,b); LCD_WriteData(dat); }。
现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!本程序是有LCD12864该进的,液晶驱动为ST7920。
可以稍微改动即可用于12864一、以下是LCD19264头文件/////////////////////////////////////////////////////////////////////////////////******************************************************************** ************ 函数功能:STM32F103VET6 19264-1液晶显示,串---并口19264* 编写时间:2012.07.22* 作者:ZhouGanJin* 版本:V1.1* 液晶19264-1简介:并口不多说;串口引脚4根RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,* 通过预编译选择串并口方式********************************************************************* **********/#ifndef _LCD19264_H#define _LCD19264_H/* 端口定义---------------------------本程序只用了GPIOA-----------------------------------*//* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/#define LCD_RS_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0 #define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0#define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1)#define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)#define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2)#define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2)#define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3)#define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3)#define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define LCD_DATA_PORT GPIOD#define LCD_DATA GPIOD->BSRR //BSRR高十六位是复位,低十六位是置位void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令void Lcm_Rd_Status(u8 enable);//读忙状态void Lcm_Init(u8 enable); //液晶初始化void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串void Delay_ms(u32 m);//1ms延时void Lcm_Delay(void);/*function all ------函数定义-------------以下函数包含19264液晶的串并行方式----------------------------------------*/#define PSB_SERIAL 0#ifdef PSB_SERIAL// -------以下为串口函数-------- serial transmission------/////-----------传送8bits 数据----void Send_byte(u8 bbyte,u8 enable){u8 i;for(i=0;i<8;i++){LCD_E1_L; LCD_E2_L;if(0x80&bbyte) LCD_RW_H; //SID=1;else LCD_RW_L;if(!enable) //CLK = 01 ; 串行用下降沿{LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}bbyte<<=1;Lcm_Delay(); //?}}//-----------写指令函数----void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Delay();Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令Send_byte(0xf0&wcomd,enable); //high 4bitsSend_byte(0xf8&(wcomd<<4),enable); //low 4bits}//-----------写数据函数----void Lcm_Wr_Dat(u8 wdata,u8 enable){Lcm_Delay();Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据Send_byte(0xf0&wdata,enable); //high 4bitsSend_byte(0xf8&(wdata<<4),enable); //low 4bits}#else// -------以下为并口函数-------- parallel Transmission-------/// //---------读忙函数----------------void Lcm_Rd_Status(u8 enable){u16 getd;while(1){Lcm_Delay();LCD_RS_L; //命令LCD_RW_H; //读取Lcm_Delay();//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据, 写0x0000则与上相同Lcm_Delay();if(!enable){LCD_E1_L;Lcm_Delay();LCD_E1_H;getd=GPIO_ReadInputData(LCD_DATA_PORT);if((getd&0x0080)==0)break;}else{LCD_E2_L;Lcm_Delay();LCD_E2_H;if((getd&0x0080)==0)break;}}}//-----写指令----------------void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_L;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wcomd|(~wcomd<<16); //Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}// Lcm_Delay();}//------写数据----------------void Lcm_Wr_Dat(u8 wdata,u8 enable) {Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_H;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wdata|(~wdata<<16);Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}}#endif//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;Lcm_Wr_Com(addr,0);//设定DDRAM地址Lcm_Wr_Com(addr,1);//设定DDRAM地址}//---选定坐标,分屏选择------------void Lcm_SETXY(u8 pos_x,u8 pos_y,u8 enable){u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;if(enable==0)Lcm_Wr_Com(addr,0);//设定DDRAM地址elseLcm_Wr_Com(addr,1);//设定DDRAM地址}//----------初始化----------------void Lcm_Init(u8 enable){#ifdef PSB_SERIALLCD_PSB_L; //选择串口#elseLCD_PSB_H; //选择并口#endifLcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x0c,enable); //开显示及光标设置Delay_ms(2);Lcm_Wr_Com(0x01,enable); //显示清屏Delay_ms(3);Lcm_Wr_Com(0x06,enable); //显示光标移动设置Delay_ms(3);}/*--------- display function----------以下为各种显示函数---------------------------------------*/void Lcm_Disp_Char(u8 onechar,u8 enable)//显示单个字符{Lcm_Wr_Dat(onechar,enable);}void Lcm_Disp_Str(u8 *strings,u8 enable)//显示字符串{while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable) //指定坐标显示字符{Lcm_GotoXY(x, y);Lcm_Wr_Dat(ch,enable);}void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable)//指定坐标显示字符串{Lcm_GotoXY(x, y);while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}二、以下是STM32配置函数/* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void WWDG_Configuration(void);/********************************************************************** ************* 函数名称:RCC_Configuration(void)** 函数功能:时钟初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}}/********************************************************************** ************* 函数名称:GPIO_Configuration(void)** 函数功能:端口初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void GPIO_Configuration(void){//定义端口结构体GPIO_InitTypeDef GPIO_InitStructure;//将GPIOA端口使能有效RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | //GPIOAGPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口}/********************************************************************** ************* 函数名称:NVIC_Configuration(void)** 函数功能:中断初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Init(&NVIC_InitStructure);}/******************************************************************************** *函数功能:延时函数/*--- Delay function-----------------延时函数定义********************************************************************* ************///------1ms延时------------void Delay_ms(u32 m){u32 i;for(; m != 0; m--)for (i=0; i<25000; i++); //clk=50MHz ,25_000000 分频得1s,25000分频得1ms}//---------液晶延时----------void Lcm_Delay(void){u8 j,i=100;while(i--){for(j=0;j<100;j++){;}}}#endif/*************结束***************/。
自己参考大神们的程序改写的液晶驱动,希望对有需要的人能有帮助#include "stm32f10x.h"static __IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(__IO uint32_t nTime);#define Line1 0x80//液晶第一行#define Line2 0x90//液晶第二行#define Line3 0x88//液晶第三行#define Line4 0x98//液晶第四行#define LCD_IO GPIOE //我用的是E.2 E.3 E.4 E.5 E.6#define CS GPIO_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) //将对应管脚输出高电平#define RESET(n) GPIO_ResetBits(GPIOE,n)//输出低电平#define CMD (uint32_t)0xf8000000 //串行写入的是命令要先写入0xf8 #define DATE (uint32_t)0xfa000000 // 串行写入数据要先写入0xfavoid LCD_IOinit_OUT() //推挽输出模式,管脚配置,不多解释,库函数有{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_IO, &GPIO_InitStructure);}void LCD_Write(uint32_t cmd,uint8_t ddata)//LCD 写函数{uint32_t temp=cmd;uint32_t i;RESET(CS); //片选拉低temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);SET(CS); //片选拉高,开始传输数据for(i=0;i<24;i++){if(temp&0x80000000)SET(RW); //取出最高位,如果是1,那么RW就写1else RESET(RW); //如果是0 RW就写0SET(CLK);//向液晶写数据是在下降沿写入的Delay(2);//稍作延时RESET(CLK);//拉低产生下降沿,写入数据temp=temp<<1;//左移一位,写入下一位}RESET(CS); //拉低片选,写入数据完毕}void Display(uint8_t addr,uint8_t *hz){LCD_Write(CMD,addr);Delay(3);while(*hz!='\0'){LCD_Write(DA TE,*hz);hz++;Delay(3);}}void LCD_init()//液晶初始化{RESET(CS); //拉低片选RESET(PSB);//PSB拉低,表示是串行,拉高则是并行RESET(RST);//拉低RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);//8位数据传输Delay(40);LCD_Write(CMD,0x0c);//显示开,游标开Delay(40);LCD_Write(CMD,0x01);//清屏Delay(40);LCD_Write(CMD,0x06);//进入点设定AC+1Delay(40);}int main(){RCC_Configuration();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次LCD_IOinit_OUT();LCD_init();while(1){Display(Line1,"你妹");Display(Line2,"你妹");Display(Line3,"你妹妹");Display(Line4,"完事了,哈哈哈哈哈");}}void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);}void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/*temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);重点解释一下这里,从串行时序图中可以看出,发送一个指令需要三个字节,第一个是0xf8或者0xfa这个根据你要发送的是命令还是数据而定,然后发送下一个数据的高四位和第四位,但是数据都是在高四位上面,用51的话我们要分三次发送,但是32的话一个字节可以是32位的/所以我们一次就能完成,这也是为什么下面的i<24的原因因为最后的8位没有用,例如:我们发送指令0x35,则应该是这样0xf8然后0x30然后0x50,这个应该很好理解所以看一下上面的语句首先我们cmd的值应该为0xf8000000,这个宏定义有的,这是发送命令然后我们让cmd=temp;在把temp和后面的计算结果做按位或运算.首先看这个(uint32_t)(ddata&(uint8_t)0xf0)<<16)我们的ddtate是0x35他和0xf0按位与之后/变为0x30然后左移16位变成0x30 0000;再强制转换为32位,就把高位补零变为0x00 30 0000再看这句话(uint32_t)(ddata&(uint8_t)0x0f)<<12)我们的ddtate是0x35他和0x0f按位与/之后变为0x05,左移12位0x05 000 强制转换为32位高位补零0x000 05 000 /在和前面的相加就是0x00 30 0000+0x000 05 000=0x0030 5000然后在和前面的0xf8000000按位或变为0xf830 5000 液晶读这个数据的时候是八位八位的读取所以在液晶看来是分四次的0xf8 0x30 0x50 0x00显然后八位没用所以我们只取前面的24位//应该能看懂了把结合时序图还有延时一定要精确大家有看不懂的可以给我留言*/。
头文件#ifndef __12864_H_#define __12864_H_#include"sys.h"//管脚定义,移植修改区//***************************************************************************** *********************************************//#define LCD12864_GPIO GPIOB//#define GPIOCLK RCC_APB2Periph_GPIOB#define RS PBout(0)#define RW PBout(1)#define EN PBout(2)//#define PSB GPIO_Pin_4//#define RST GPIO_Pin_5//#define Busy GPIO_Pin_15//#define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15//#define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5//#define LCD_RS(x) x ? GPIO_SetBits(LCD12864_GPIO,RS): GPIO_ResetBits(LCD12864_GPIO,RS)//#define LCD_RW(x) x ? GPIO_SetBits(LCD12864_GPIO,RW): GPIO_ResetBits(LCD12864_GPIO,RW)//#define LCD_EN(x) x ? GPIO_SetBits(LCD12864_GPIO,EN): GPIO_ResetBits(LCD12864_GPIO,EN)//#define LCD_PSB(x) x ? GPIO_SetBits(LCD12864_GPIO,PSB): GPIO_ResetBits(LCD12864_GPIO,PSB)//#define LCD_RST(x) x ? GPIO_SetBits(LCD12864_GPIO,RST): GPIO_ResetBits(LCD12864_GPIO,RST)//#define Text_Busy GPIO_ReadInputDataBit(LCD12864_GPIO ,Busy) //PBin(7)#define LCD_WriteData(x) {GPIOC->BSRR = x & 0x00ff;GPIOC->BRR = ((~x)) & 0x00ff;} //高8位的数据//#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据void LCD12864_Init(void); //硬件端口初始化void LCD12864_InitPort(void); //硬件端口初始化void NOP(void); //延时函数u8 LCD12864_busy(void); //检测忙状态void LCD12684_Wcmd(u8 dat); //写指令void LCD12684_Wdat(u8 dat); //写数据void LCD12864_Init(void); //液晶初始化void LCD12864_Clr(void); // 清屏void LCD12864_Pos(u8 x,u8 y); //设置显示位置void LCD12864_PhotoDis(u8 *bmp); // 显示图片void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串void LCD_Shownum(u8 x,u8 y,u8 num);void LCD_Shownum1(u8 num);//***************************************************************************** *****************************************#endif//#include "stm32f10x.h"#include"12864.h"#include"delay.h"/****************************************************************************** ******************//FILE:液晶12864驱动程序//VERS:1.0//AUTHOR:福建师范大学林木泉//DATE:2012/07/11******************************************************************************* *****************//****************************************************************************** ******************@f_name: void LCD12864_InitPort(void)@brief: 初始化硬件端口配置@param: None@return: None******************************************************************************* *****************//*void LCD12864_InitPort(void){GPIO_InitTypeDef GPIO_InitStructure; //定义结构体RCC_APB2PeriphClockCmd(GPIOCLK|RCC_APB2Periph_AFIO, ENABLE); //使能功能复用IO时钟,不开启复用时钟不能显示GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把调试设置普通IO 口GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //IO口初始化函数(使能上述配置)GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure);//GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //初始化IO口配置GPIO_Write(LCD12864_GPIO ,0xffff);} *//****************************************************************************** *************///数据口:PB8~PB15; 命令口:PB0~PB2void LCD12864_InitPort(void){RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟RCC->APB2ENR|=1<<0; //开启辅助时钟GPIOC->CRL&=0X00000000;GPIOC->CRL|=0X33333333;GPIOB->CRL&=0XFFFFF000;GPIOB->CRL|=0X00000333;GPIOB->ODR|=0XFF07;}C文件/****************************************************************************** ******************@f_name: void NOP(void)@brief: 延时函数@param: None@return: None******************************************************************************* *****************/void NOP(void){ u8 i; for(i=0; i<100; i++); }/****************************************************************************** ******************@f_name: u8 LCD12864_busy(void)@brief: 检测忙状态@param: None@return: None******************************************************************************* *****************///u8 LCD12864_busy(void)//{// u8 x;// RS=0;// RW=1;// EN=1;// NOP();// NOP();// x=Text_Busy;// EN=1;// return x;//}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写指令@param: u8 dat 输入指令@return: None******************************************************************************* *****************/void LCD12684_Wcmd(u8 dat){//while(LCD12864_busy()); //忙检测RS=0;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;NOP();NOP();}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写数据@param: u8 dat 输入数据@return: None******************************************************************************* *****************/void LCD12684_Wdat(u8 dat){//while(LCD12864_busy()); //忙检测RS=1;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;}/****************************************************************************** ******************@f_name: void LCD12864_Init(void)@brief: 液晶初始化@param: None@return: None******************************************************************************* *****************/void LCD12864_Init(void){//LCD_PSB(1); //并口方式//LCD_RST(0); //液晶复位低电平有效//delay_ms(3);// LCD_RST(1); //置高电平等待复位//delay_ms(3);LCD12864_InitPort();LCD12684_Wcmd(0x34); //扩充指令操作delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x0c); //显示开,关光标delay_ms(5);LCD12684_Wcmd(0x01); //清除LCD的显示内容delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Clr(void)@brief: 清屏@param: None@return: None******************************************************************************* *****************/void LCD12864_Clr(void){LCD12684_Wcmd(0x34); //扩充指令操作“绘图”delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x01); //清屏delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Pos(u8 x,u8 y)@brief: 设置显示位置@param: u8 x:X轴u8 y:Y轴@return: None******************************************************************************* *****************/void LCD12864_Pos(u8 x,u8 y){u8 pos;if (x==0) {x=0x80;}else if (x==1) {x=0x90;}else if (x==2) {x=0x88;}else if (x==3) {x=0x98;}else x=0x80;pos = x+y ;LCD12684_Wcmd(pos); //显示地址}/****************************************************************************** ******************@f_name: void LCD12864_PhotoDis(u8 *bmp)@brief: 显示图形@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD12864_PhotoDis(u8 *bmp){u8 i,j;LCD12684_Wcmd(0x34); //关闭图形显示for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i); //先写入水平坐标值LCD12684_Wcmd(0x80); //写入垂直坐标值for(j=0;j<16;j++) //再写入两个8位元的数据LCD12684_Wdat(*bmp++);delay_ms(1);}for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i);LCD12684_Wcmd(0x88);for(j=0;j<16;j++)LCD12684_Wdat(*bmp++);delay_ms(1);}LCD12684_Wcmd(0x36); //写完数据,开图形显示}/****************************************************************************** ******************@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)@brief: 显示字符串@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD_ShowString(u8 x,u8 y,const u8 *p){u8 temp;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);temp=*p;while(temp!='\0'){LCD12684_Wdat(temp);temp=*(++p);}}void LCD_Shownum(u8 x,u8 y,u8 num){ u8 number;u8 shi;u8 ge;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}void LCD_Shownum1(u8 num){ u8 number;u8 shi;u8 ge;number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}。