标题:
STM32F107_ST7756驱动程序
[打印本页]
作者:
sky___
时间:
2021-4-23 10:46
标题:
STM32F107_ST7756驱动程序
实验成功能够显示字符,程序源码如下
单片机源程序如下:
#include <stm32f10x.h>
#include "stm_systick.h"
#include "hem12864.h"
#include "stm_gpio_init.h"
#include "FONT.H"
//#define HEM12864_RS PDout(10)
//#define HEM12864_RST PDout(9)
//#define HEM12864_CS PDout(8)
//u8 charA[] ={0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00};/*"B",0*/
//u8 chartemp[] = {0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00};/*"?",0*/
void hem12864_gpio_init(void)
{
RCC->APB2ENR |= 1 << 5;//开GPIOD时钟
GPIOD->CRH &= 0xFFFF0000;
GPIOD->CRH |= 0x00002222;//GPIOD0~11推挽输出
GPIOD->ODR |= 0x7 << 8;
GPIOD->ODR &= 0 << 11;
RCC->APB2ENR |= 1 << 3;//开GPIOB时钟
GPIOB->CRH &= 0x0F0FFFFF;
GPIOB->CRH |= 0x20200000;//PB13/PB15推挽输出
GPIOB->ODR |= 1 << 13;//PB13上拉
GPIOB->ODR |= 1 << 15;//PB15上拉
}
/*
void HEM12864_SPI_Init(void)
{
RCC->APB2ENR |= 1 << 3;//开GPIOB时钟
RCC->APB1ENR |= 1 << 14;//开SPI2时钟
GPIOB->CRH &= 0x0F0FFFFF;
GPIOB->CRH |= 0xB0B00000;//PB13/PB15复用
GPIOB->ODR |= 1 << 13;//PB13上拉
GPIOB->ODR |= 1 << 15;//PB15上拉
SPI2->CR1 |= 0 << 10;//全双工模式
SPI2->CR1 |= 1 << 9;//软件NSS管理
SPI2->CR1 |= 1 << 8;
SPI2->CR1 |= 1 << 2;//SPI主机
SPI2->CR1 |= 0 << 11;//8Bit数据格式
SPI2->CR1 |= 1 << 1;//空闲模式下SCK为1 CPOL=1
SPI2->CR1 |= 1 << 0 ;//数据采样从第二个时钟边沿开始,CPHA=1
//对SPI2属于APB1的外设,时钟频率最大为36M。
SPI2->CR1 |= 4 << 3; //FSCK = Fpclk1/32
SPI2->CR1 |= 0 << 7;//MSB first
SPI2->CR1 |= 1 << 6;//SPI设备使能
}
u8 SPI2_ReadWriteByte(u8 TxData)
{
u16 retry=0;
while((SPI2->SR&1<<1)==0) //等待发送区空
{
retry++;
if(retry>=0XFFFE)return 0; //超时退出
}
SPI2->DR=TxData; //发送一个Byte
retry=0;
}
*/
/*
void HEM12864_Init(void)
{
HEM12864_RST = 0;
Delay_us(40000);
HEM12864_RST = 1;
HEM12864_CS = 0;
HEM12864_RS = 0;
SPI2_ReadWriteByte(0x30);
Delay_us(120);
SPI2_ReadWriteByte(0X30);
Delay_us(40);
SPI2_ReadWriteByte(0X0F);
Delay_us(120);
SPI2_ReadWriteByte(0X01);
Delay_us(10000);
SPI2_ReadWriteByte(0X06);
}
*/
//=========================LCD??????======================
#define LCDA0 PDout(10)
#define LCDRS PDout(9)
#define HEM12864_CS PDout(8)
#define LCDSK PBout(13)
#define LCDSI PBout(15)
/*
sbit LCDA0=P2^5; //????
sbit LCDSK=P2^6; //????
sbit LCDSI=P2^7; //????
sbit LCDRS=P2^4; //????
*/
//=========================????=============================
void LCDInit(); //?????
void LCDWritecom(char com); //??????,????/????(0??,1??)
void LCDShiftWrite(char dat); //???????
void LCDSetXY(char x, char y); //??????
//void LCDcls(char); //????,????????value
//***************************????*******************************
/*
extern unsigned char code hzcode[][128]; //
extern unsigned char code gbcode[][32]; //
extern unsigned char code asc816code[][16]; //
extern unsigned char code asc1832code[][64]; //
extern unsigned char code arrow[]; //
*/
void lcd12864_display_on(void) //显示开
{
LCDWritecom(0xaf);
}
void lcd12864_display_off(void)//显示关
{
LCDWritecom(0xae);
}
void lcd12864_display_normal(void) //正常显示
{
LCDWritecom(0xa6);
}
void lcd12864_display_reverse(void) //反白显示
{
LCDWritecom(0xa7);
}
void lcd12864_display_all_point_off(void) //全屏正常显示
{
LCDWritecom(0xa4);
}
void lcd12864_display_all_point_on(void) //全屏点亮
{
LCDWritecom(0xa5);
}
void lcd12864_rst(void)
{
LCDRS=0; //LCD 复位有效(L)
Delay_us(1000); // 延时1ms , Datasheet 要求至少大于1us
LCDRS = 1; //LCD 复位无效(H)
Delay_us(1000); //硬件复位
LCDWritecom(0xe2); //寄存器复位
Delay_us(1000);
}
//========================?????????=================================
void LCDInit()
{
HEM12864_CS = 0;
LCDRS=0; //LCD 复位有效(L)
Delay_us(1000); // 延时1ms , Datasheet 要求至少大于1us
LCDRS = 1; //LCD 复位无效(H)
Delay_us(1000); //硬件复位
LCDWritecom(0xe2); //寄存器复位
Delay_us(1000);
// 电源管理初始
lcd12864_display_on(); //0xaf显示器开,0xae显示器关
LCDWritecom(0x2f); ///0x2f升压电路,电压管理电路,
//电压跟随电路均开(0x28-0x2f为设置上电控制模式)
LCDWritecom(0x25); //0x20-0x27为V5电压内部电阻调整设置
LCDWritecom(0x81); //电量设置模式
LCDWritecom(0x0f); //0x01-0x3f电量寄存器设置模式
// 根据屏的方向初始化安装方向(复位后默认下面配置)
LCDWritecom(0xa0); //0xa0为Segment正向,0xa1 为Segment反向
//(0xa0-0xa1为ADC方向选择)
LCDWritecom(0xc8); //0xc0正向扫描,0xc8反射扫描
// 显示管理初始(复位后默认下面配置)
lcd12864_display_normal(); //0xa6正向显示,0xa7反向显示
lcd12864_display_all_point_off(); //0xa4正常显示,0xa5全屏点亮
// 指示器设置
LCDWritecom(0xac); //
LCDWritecom(0x00); //
//背压比设置
LCDWritecom(0xf8); //
LCDWritecom(0x00); //
// LCDcls(0); //????????,????0
}
//========================?????(???????)=============================
void LCDWritecom(char com)
{
// LCDCS = 0; //CS=0.?:??????CS,???????.
LCDA0 = 0; //A0=0,????
LCDShiftWrite(com);
}
void LCDWritedata(char data)
{
LCDA0 = 1; //A0=1,????
LCDShiftWrite(data);
// LCDCS = 1; //CS=1.?:??????CS,???????.
}
//===========================??(??)??????================================
void LCDShiftWrite(char dat)
{
unsigned char i; //??????
unsigned char Series,Temp; //??????
LCDSK = 0; //SCL=0
Series = dat;
for(i=0; i<8; i++)
{
LCDSK = 0; //SCL=0
Temp=Series & 0x80; //???7?
if(Temp) //??Temp=1,??SI=1.??Temp+0,??SI=0
{
LCDSI = 1; //SI=1
}
else
{
LCDSI = 0; //SI=0
}
LCDSK = 1; //SCL=1????
Series = Series << 1; //??1?
}
}
void LCD12864_Pos(u8 x,u8 y)
{
u8 pos;
if (x==1) {x=0x80;}
else if (x==2) {x=0x90;}
else if (x==3) {x=0x88;}
else if (x==4) {x=0x98;}
else x=0x80;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
(5.12 KB, 下载次数: 54)
下载附件
2021-4-29 23:18 上传
所有资料51hei提供下载:
ST7567.zip
(3.6 KB, 下载次数: 4)
2021-4-23 10:45 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1