完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
12864应该是宽电压 3.3v应该能够驱动 为什么我的上电没有显示 #include"12864.h" #include"delay.h" #define u16 unsigned short //为了可移植性好,对这两个 STM 32 已经定义过的变量,再定义一次。 #define u8 unsigned char /********** 以下是相关引脚定义。**************/ #define DisIO GPIOC //定义12864要使用的I/O端口。 #define DisClk RCC_APB2Periph_GPIOC //定义12864要使用的I/O端口的时钟。 #define Data GPIO_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 RS GPIO_Pin_9 #define RW GPIO_Pin_10 #define EN GPIO_Pin_11 //定义使能端使用的引脚。 #define PSB GPIO_Pin_12 //定义并,串行数据模式的选择端口使用的引脚。 GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。 void IOInitOut(void) //把所有端口初始化为推挽输出模式的函数。 { GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。 GPIOStru.GPIO_Speed = GPIO_Speed_50MHz; GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB; RCC_APB2PeriphClockCmd(DisClk,ENABLE); GPIO_Init(DisIO,&GPIOStru); } void IOInitin(void) //把数据引脚初始化为浮空输入的函数。 { GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。 GPIOStru.GPIO_Speed = GPIO_Speed_50MHz; GPIOStru.GPIO_Pin = Data; RCC_APB2PeriphClockCmd(DisClk,ENABLE); //把所有端口初始化为输出模式的函数。 GPIO_Init(DisIO,&GPIOStru); } void WaitBusy(void) //等待12864的忙状态结束的函数。 { IOInitIn(); //把数据引脚定义为浮空输入; GPIO_ResetBits(DisIO,RS); //RS = 0. GPIO_SetBits(DisIO,RW); //RW = 1. GPIO_SetBits(DisIO,EN); //EN = 1. while(GPIO_ReadInputData(DisIO) & 0x0080); //只要位7的值,位7是忙标志位。 GPIO_ResetBits(DisIO,EN); //EN = 0; IOInitOut(); //把所有引脚定义为输出。 } void WriteCmd(u8 cmd) //写命令函数。 { // WaitBusy(); GPIO_ResetBits(DisIO,RS); //RS = 0. GPIO_ResetBits(DisIO,RW); //RW = 0. GPIO_ResetBits(DisIO,EN); //EN = 0. DisIO->ODR=((DisIO->ODR & 0xff00)|cmd); //此处,只有直接操作寄存器才能 //达到,只改变输出数据寄存器ODR的低8位,其它位 //不变的目的。因为,只有低8位是数据引脚, //其它位可能是控制引脚,不能改变。 delay_init(8); delay_ms(2); GPIO_SetBits(DisIO,EN); //EN = 1. delay_ms(2); GPIO_ResetBits(DisIO,EN); delay_ms(2); } void WriteData(u8 data) //写数据函数。 { // WaitBusy(); GPIO_SetBits(DisIO,RS); //RS = 1. GPIO_ResetBits(DisIO,RW); //RW = 0. GPIO_ResetBits(DisIO,EN); //EN = 0. DisIO->ODR=((DisIO->ODR & 0xff00)|data); //同上。 delay_init(8); delay_ms(2); GPIO_SetBits(DisIO,EN); //EN = 1. delay_ms(2); GPIO_ResetBits(DisIO,EN); delay_ms(2); } void InitDis(void) //初始化 12864 和要用到的 STM 32 的引脚。 { IOInitOut(); delay_init(8); //初始化延时函数的微妙计数基数。 GPIO_SetBits(DisIO,PSB); //令PSB=1,设置为并行数据模式。 delay_ms(2); WriteCmd(0x30); //选择基本指令集,和,8位数据模式。 delay_ms(2); WriteCmd(0x0c); //开显示,无游标,不反白. delay_ms(2); /* WriteCmd(0x01); //清除显示,并将 DDRAM 的地址计数器 AC 设为 00H. delay_ms(2); WriteCmd(0x06); //设置,外部读写数据后,地址记数器 AC 会自动加 1。 delay_ms(2); WriteCmd(0x80); //将 DDRAM 地址计数器 AC 设为 0. delay_ms(2); */ } /*以下是光标定位函数,第一个参数为行坐标,第二个为列坐标,起始坐标是1行1列。 只能以16个点的宽度为单位移动。*/ void locate16(int row, int col) { switch(row) { case 1: WriteCmd(0x80+col-1); break; case 2: WriteCmd(0x90+col-1); break; case 3: WriteCmd(0x88+col-1); break; case 4: WriteCmd(0x98+col-1); break; } } /*光标定位函数定义结束。*/ void DisStr(u8 *s) //显示字符串的函数。 { while(*s != ' |