1、/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 Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_
2、Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPI O_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 RWGPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。*/#define x1 0x80#define x2 0x88#define y 0x
3、80GPIO_InitTypeDef GPIOStru; /定义用于定义所以引脚为输出的变量。/* 函数名 : IOInitOut* 函数描述 : 把所有端口初始化为推挽输出模式的函数* 输入参数 : 无* 输出结果 : 无* 返回值 : 无*/void IOInitOut(void)/IO 组GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; / 定 义 所 有 的 引 脚 为 推挽输出的变量初始化。GPIOStru.GPIO_Speed = GPIO_Speed_50MHz; GPIOStru.GPIO_Pin = Data | EN;RCC_APB2Periph
4、ClockCmd(DisClkIO,ENABLE); GPIO_Init(DisIO,/IO 组GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; / 定 义 所 有 的 引 脚 为 推挽输出的变量初始化。GPIOStru.GPIO_Speed = GPIO_Speed_50MHz; GPIOStru.GPIO_Pin = RS|RW;RCC_APB2PeriphClockCmd(DisClkIO,ENABLE); GPIO_Init(DisIO,/* 函数名 : IOInitIn* 函数描述 : 把数据引脚初始化为浮空输入的函* 输入参数 : 无* 输出结果 : 无
5、* 返回值 : 无*/void IOInitIn(void)GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING; / 定 义 数 据 引 脚 为 浮 空 输 入的变量初始化。GPIOStru.GPIO_Speed = GPIO_Speed_50MHz; GPIOStru.GPIO_Pin = Data;RCC_APB2PeriphClockCmd(DisClkIO,ENABLE); / 把 所 有 端 口 初 始 化 为输出模式的函数。GPIO_Init(DisIO,/* 函数名 : WaitBusy* 函数描述 : 等待 12864 的忙状态结束的函数* 输
6、入参数 : 无* 输出结果 : 无* 返回值 : 无*/void WaitBusy(void)IOInitIn(); / 把 数据引脚定义为浮空输入GPIO_ResetBits(DisIOIO,RS); /RS = 0GPIO_SetBits(DisIOIO,RW); /RW = 1.GPIO_SetBits(DisIO,EN); /EN = 1.while(GPIO_ReadInputData(DisIO) /只要位 7 的值,位 7 是忙标志位GPIO_ResetBits(DisIO,EN); /EN = 0;IOInitOut(); /把所有引脚定义为输出。/* 函数名 : WriteC
7、md* 函数描述 : 写命令函数* 输入参数 : 8 位命令* 输出结果 : 无* 返回值 : 无*/void WriteCmd(uint8_t cmd)WaitBusy();GPIO_ResetBits(DisIOIO,RS); /RS = 0. GPIO_ResetBits(DisIOIO,RW); /RW = 0.GPIO_SetBits(DisIO,EN); /EN = 1.DisIO-ODR=(DisIO-ODR /此处,只有直接操作寄存器才能/达到,只改变输出数据寄存器 ODR 的低 8 位,其它位/不变的目的。因为,只有低 8 位是数据引脚,/其它位可能是控制引脚,不能改变。de
8、lay_us(2);GPIO_ResetBits(DisIO,EN); /EN = 0;delay_us(2);/* 函数名 : WriteData* 函数描述 : 写数据函数* 输入参数 : 8 位命令* 输出结果 : 无* 返回值 : 无*/void WriteData(uint8_t data)WaitBusy();GPIO_SetBits(DisIOIO,RS); /RS = 1.GPIO_ResetBits(DisIOIO,RW); /RW = 0. GPIO_SetBits(DisIO,EN); /EN = 1.DisIO-ODR=(DisIO-ODR /同上。delay_us(2
9、);GPIO_ResetBits(DisIO,EN); /EN = 0;delay_us(2);/* 函数名 : ReadData* 函数描述 : 读 IO 口状态* 输入参数 : 无* 输出结果 : 无* 返回值 : 8 位数据*/uint8_t ReadData(void)uint8_t uc_Content; WaitBusy();IOInitIn();delay_ms(10); /注意:用 BCDE 组 IO 口必须这个延时!GPIO_SetBits(DisIOIO,RW); /RW = 1; 读模式GPIO_SetBits(DisIOIO,RS); /RS = 1; 数据GPIO_S
10、etBits(DisIO,EN); /EN = 1. 使能delay_us(2); /延时很重要/ uc_Content = (DisIO-IDR) uc_Content = GPIO_ReadInputData(DisIO);GPIO_ResetBits(DisIO,EN); /EN = 0.delay_us(2); /延时很重要IOInitOut();return uc_Content;/* 函数名 : InitDis* 函数描述 : 初始化 12864 和要用到的 STM 32 的引脚* 输入参数 : 无* 输出结果 : 无* 返回值 : 无*/void InitDis(void)IOI
11、nitOut();delay_init(8); /初始化延时函数的微妙计数基数。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);/*
12、 函数名 : DisStr* 函数描述 : 显示字符串的函数* 输入参数 : 字符串地址* 输出结果 : 无* 返回值 : 无*/void DisStr(uint8_t *s)while(*s != 0)WriteData(*s); s+;delay_ms(2);/* 函数名 : DisInt* 函数描述 : 显示整型变量的函数,最多显示 16 位的整数 (只能显示正数)* 输入参数 : 16 位二进制无符号整型数据* 输出结果 : 无* 返回值 : 无*/void DisInt(uint16_t num)数倍,uint8_t temp17; uint8_t str17; int i=0,j=
13、0;while(num != 0) /这 里 不 能 用 num%10 != 0, 如 果 num 是 10 的 整/例如, 100,这样就会出错,根本就不能进入循环体。tempi = (num%10) + 0x30; num /= 10;i+;i-; /因为 i 在 退 出 循 环 之 前 还 自 加 了 一 次 , 此 时 ,/ 指 向 最 后 一 个 存 储 有 用值的元素的后一个位置。while(i != -1) /因为 i=0 时,temp0还是有用值。strj = tempi; j+;i-;strj = 0; /因为 i 在退出循环之前还自加了一次,此时,/ 指 向 最 后 一 个
14、 存 储 有 用值的元素的后一个位置。DisStr(str);/* 函数名 : DisFloat* 函数描述 : 显示有 n 位小数的浮点数,总位数不超过 16 位* 输入参数 : 16 位数据* 输出结果 : 无* 返回值 : 无*/void DisFloat(int n,float fnum)long int num = fnum*10; uint8_t temp17; uint8_t str17;int i=0,j=0; while(num != 0)tempi = (num%10)+0x30; num/=10;i+;if(i = n) /4 位小数处理完后,加入小数点。 i-;temp
15、i = .; i+;while(i != -1)strj = tempi; j+;i-;strj=0; DisStr(str);/* 函数名 : Locate16* 函数描述 : 光标定位函数, 第一个参数为行坐标, 第二个为列坐标,起 始 坐 标 是 1 行 1 列, 只 能 以 16 个 点 的 宽 度 为 单 位 移动* 输入参数 : row - 行, col - 列* 输出结果 : 无* 返回值 : 无*/void Locate16(int row, int col)switch(row)case 1: WriteCmd(0x80+col-1); break; case 2: Writ
16、eCmd(0x90+col-1); break; case 3: WriteCmd(0x88+col-1); break; case 4: WriteCmd(0x98+col-1); break;/显示绘图 全屏/* 函数名 : DisInt* 函数描述 : 显示有 1 位小数的浮点数,总位数不超过 16 位* 输入参数 : 数据* 输出结果 : 无* 返回值 : 无*/void ImageWhole(uint8_t *img)uint8_t i,j; for(j=0;j xx1)temp = xx0; xx0 = xx1; xx1 = temp;for(xx0=xx0; xx0yy1)tem
17、p=yy0; yy0=yy1; yy1=temp;for(yy0=yy0;yy0=xx1* 输出结果 : 无* 返回值 : 无*/void DrawLine(uint8_t xx1,uint8_t yy1,uint8_t xx2,uint8_t yy2)uint8_t x_add,y_add,y_temp,Line_K;xx1xx2 /去掉 128 倍yy1yy2 /去掉 64 倍if(xx2xx1)if( yy2yy1 | yy2=yy1 )Line_K=(yy2-yy1)/(xx2-xx1); for(x_add=0;x_add 31 | r = 0 ) /圆大于液晶屏或者没半径则返回 r
18、eturn;a = 0;b = r;di = 3 - 2 * r;/判断下个点位置的标志while(a = b)DrawPoint( x0 - b , y0 - a); /3DrawPoint( x0 + b , y0 - a); /0DrawPoint( x0 - a , y0 + b); /1DrawPoint( x0 - b , y0 - a); /7DrawPoint( x0 - a , y0 - b); /2DrawPoint( x0 + b , y0 + a); /4DrawPoint( x0 + a , y0 - b); /5DrawPoint( x0 + a , y0 + b); /6 DrawPoint( x0 - b , y0 + a);a +;/使用 bresenham 算法画圆if(di 0)di += 4 * a + 6;elsedi += 10 + 4 * (a - b); b -;DrawPoint( x0 + a , y0 + b);