基于STM32的LCD12864显示TM7705电压电路MCU
- 格式:pdf
- 大小:369.51 KB
- 文档页数:1
TM1642是一种带键盘扫描接口的恒流LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。
本产品性能优良,质量可靠。
主要应用于段码LED产品的恒流显示屏驱动。
采用SOP28的封装形式。
功能特点•采用功率CMOS 工艺•多种显示模式(10段×7位~13段×4位)•SEG 恒流驱动最大电压值:VDD-1V •通道差最大+/-3%芯片间最大+/-6%•键扫描(8×2)•辉度调节电路(软件8级恒流可调)•串行接口(CLK,STB,DIN)•振荡方式:内置RC 振荡(450KHz+5%)•内置上电复位电路•封装形式:SOP28管脚信息123456789101112131415161718192021222324TM1642NCDINCLK STB K1K2VDDSEG1/KS1SEG2/KS2SEG3/KS3SEG4/KS4SEG5/KS5SEG6/KS6SEG7/KS7SEG8/KS8SEG9SEG10GRID1GRID2GRID3GRID4SEG14/GRID5SEG13/GRID SEG12/GRID VDD GND GND GND 25262728TOP VIEWSOP28深圳市富瑞世嘉科技有限公司13530167943天微专营为高时,CLK 被忽略输入该脚的数据在显示周期结束后被锁存段恒流输出(也用作键扫描),p管开漏输出16~17段恒流输出,P管开漏输出27、2624、23位输出,N管开漏输出输出(段/位)18~20段/位复用输出,只能选段或位输出逻辑电源7、215V±10%逻辑地22、25、28接系统地▲注意:DIN口输出数据时为N管开漏输出,在读键的时候需要外接1K-10K的上拉电阻,如图(1)所示。
本公司推荐10K的上拉电阻。
DOUT在时钟的下降沿控制N管的动作,此时读数不稳定,可以参考图(4),在时钟的上升沿时读数才稳定。
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驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。
/*********spi_tm7705.h**************/#ifndef __SPI_TM7705_H#define __SPI_TM7705_H#include "stm32f10x.h"#include "SysTick.h"/* 片选信号,拉低为选中*/#define CS1_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define CS1_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4)#define CS2_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_0)#define CS2_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_0)#define CS3_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_1)#define CS3_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_1)#define CS4_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_5)#define CS4_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_5)/* DRDY拉低为可以读取*/#define DRDY1_LOW()GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) #define DRDY2_LOW()GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) #define DRDY3_LOW()GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) #define DRDY4_LOW()GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)void SPI_TM7705_Init(void);u8 SPI1_ReadWriteByte(u8 TxData);void TM7705_Init(void);void ReadAD(void);#endif /* __SPI_TM7705_H *//*********spi_tm7705.h**************//***********spi_tm7705.c***************//******************** ********************* 文件名:spi_tm7705.c* 描述:spi_tm7705底层应用函数库* 实验平台:* 硬件连接----------------------------** PA5-SPI1-SCK : CLK* PA6-SPI1-MISO : DOUT* PA7-SPI1-MOSI : DIN**PA4:CS1* PB0 : CS2* PB1 : CS3* PB5 : CS4** PB12 : DRDY1* PB13 : DRDY2* PB14 : DRDY3* PB15 : DRDY4* ----------------------------* 库版本:ST3.0.0******************************************************************************** ***/#include "spi_tm7705.h"u16 ADResult[4];//存储AD结果的数组/****************************************************************************** *初始化SPI1与tm7705的接口******************************************************************************* /void SPI_TM7705_Init(void){SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIOA_InitStructure;GPIO_InitTypeDef GPIOB_InitStructure;/* 配置外设时钟*//*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIOand SPI_FLASH_SPI_SCK_GPIO Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);/*!< Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/*!< AFIO Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);/*!< Configure SCK */GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIOA_InitStructure);// /*!< Configure MISO */// GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_6;// GPIO_Init(GPIOA, &GPIOA_InitStructure);//// /*!< Configure MOSI */// GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_7;// GPIO_Init(GPIOA, &GPIOA_InitStructure);/*!< Configure CS1 */GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_4 ;GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ GPIO_Init(GPIOA, &GPIOB_InitStructure);/*!< Configure CS2,3,4 */GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5;GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ GPIO_Init(GPIOB, &GPIOB_InitStructure);/*!< Configure DRDY1,2,3,4*/GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ GPIO_Init(GPIOB, &GPIOB_InitStructure);/* 将片选信号全部拉高*/CS1_HIGH();CS2_HIGH();CS3_HIGH();CS4_HIGH();/* SPI1 configuration *///设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//选择了串行时钟的稳态:时钟悬空高SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//数据捕获于第二个时钟沿SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //flash读写中这里是4//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//CRC值计算的多项式SPI_InitStructure.SPI_CRCPolynomial = 7;//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1 */SPI_Cmd(SPI1, ENABLE); //使能SPI外设}/**************************************SPIx 读写一个字节TxData:要写入的字节返回值:读取到的字节*****************************************/u8 SPI1_ReadWriteByte(u8 TxData){while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位/* Send byte through the SPI1 peripheral */SPI_I2S_SendData(SPI1, TxData); //通过外设SPI1发送一个数据/* Wait to receive a byte */while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志/* Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据}/********tm7705初始化函数***********/void TM7705_Init(void){unsigned char i ;CS1_LOW();Delay_us(10);for(i = 0; i < 100; i++){SPI1_ReadWriteByte(0xFF); //持续DIN高电平写操作,恢复tm7705接口}SPI1_ReadWriteByte(0x20) ; //通道1 ,下一个写时钟寄存器/********2016.1.21实地测试通过**********SPI1_ReadWriteByte(0x08) ; //写时钟寄存器设置更新速率为60Hz,使用内部时钟**************************************/SPI1_ReadWriteByte(0x08) ;SPI1_ReadWriteByte(0x10) ; //通道1 ,下一个写设置寄存器/********2016.1.21实地测试通过**********SPI1_ReadWriteByte(0x70) ; //写设置寄存器,设置成双极性、无缓冲、增益为2、滤波器不工作、自校准**************************************/SPI1_ReadWriteByte(0x70);Delay_us(10);CS1_HIGH();CS2_LOW();Delay_us(10);for(i = 0; i < 100; i++){SPI1_ReadWriteByte(0xFF); //持续DIN高电平写操作,恢复tm7705接口1415}//SPI1_ReadWriteByte(0x20) ; //通道1 ,下一个写时钟寄存器//SPI1_ReadWriteByte(0x09) ; //写时钟寄存器设置更新速率为60Hz,使用内部时钟//SPI1_ReadWriteByte(0x10) ; //通道1 ,下一个写设置寄存器//SPI1_ReadWriteByte(0x78) ; //写设置寄存器,设置成双极性、无缓冲、增益为0、滤波器不工作、自校准SPI1_ReadWriteByte(0x20) ; //通道1 ,下一个写时钟寄存器SPI1_ReadWriteByte(0x08) ; //写时钟寄存器设置更新速率为60Hz,使用内部时钟SPI1_ReadWriteByte(0x10) ; //通道1 ,下一个写设置寄存器SPI1_ReadWriteByte(0x70) ;Delay_us(10);CS2_HIGH();CS3_LOW();Delay_us(10);for(i = 0; i < 100; i++){SPI1_ReadWriteByte(0xFF); //持续DIN高电平写操作,恢复tm7705接口}SPI1_ReadWriteByte(0x20) ; //通道1 ,下一个写时钟寄存器SPI1_ReadWriteByte(0x08) ; //写时钟寄存器设置更新速率为60Hz,使用内部时钟SPI1_ReadWriteByte(0x10) ; //通道1 ,下一个写设置寄存器SPI1_ReadWriteByte(0x70) ; //写设置寄存器,设置成双极性、无缓冲、增益为0、滤波器不工作、自校准Delay_us(10);CS3_HIGH();CS4_LOW();Delay_us(10);for(i = 0; i < 100; i++){SPI1_ReadWriteByte(0xFF); //持续DIN高电平写操作,恢复tm7705接口}SPI1_ReadWriteByte(0x20) ; //通道1 ,下一个写时钟寄存器SPI1_ReadWriteByte(0x08) ; //写时钟寄存器设置更新速率为60Hz,使用内部时钟SPI1_ReadWriteByte(0x10) ; //通道1 ,下一个写设置寄存器SPI1_ReadWriteByte(0x70) ; //写设置寄存器,设置成双极性、无缓冲、增益为0、滤波器不工作、自校准Delay_us(10);CS4_HIGH();}/*******读数*****************/void ReadAD(void){//char DataNotReady = 0x80;char highByte;char lowByte;u16 adcValue;float adcValue1;int ret;int i=0;//TM7705_Init();Delay_us(10);//ad1while(DRDY1_LOW()==1){i+=1;Delay_ms(50);if (i>2)break;}i=0;if(DRDY1_LOW()==0){CS1_LOW();Delay_us(10);SPI1_ReadWriteByte(0x38);//command for the comm to read data register for channel 1 (dec 56)//read 16bit of data ADChighByte = SPI1_ReadWriteByte(0xFF);lowByte = SPI1_ReadWriteByte(0xFF);adcValue = highByte << 8;adcValue = adcValue | lowByte;/****2016.1.21实地测试通过*****adcValue1=(float)adcValue/65535*1.225;*ret=(int)(adcValue1*1000);*****************************/adcValue1=(float)adcValue/3;ret=(int)(adcValue1);ADResult[0]=ret;Delay_us(10);CS1_HIGH();}//ad2while(DRDY2_LOW()==1){i+=1;Delay_ms(50);if (i>2)break;}i=0;if(DRDY2_LOW()==0){CS2_LOW();Delay_us(10);SPI1_ReadWriteByte(0x38);//command for the comm to read data register for channel 1 (dec 56)//read 16bit of data ADChighByte = SPI1_ReadWriteByte(0xFF);lowByte = SPI1_ReadWriteByte(0xFF);adcValue = highByte << 8;adcValue = adcValue | lowByte;adcValue1=(float)adcValue/3;ret=(int)(adcValue1);ADResult[1]=ret;Delay_us(10);CS2_HIGH();}//ad3while(DRDY3_LOW()==1){i+=1;Delay_ms(50);if (i>2)break;}i=0;if(DRDY3_LOW()==0){CS3_LOW();Delay_us(10);SPI1_ReadWriteByte(0x38);//command for the comm to read data register for channel 1 (dec 56)//read 16bit of data ADChighByte = SPI1_ReadWriteByte(0xFF);lowByte = SPI1_ReadWriteByte(0xFF);adcValue = highByte << 8;adcValue = adcValue | lowByte;adcValue1=(float)adcValue/3;ret=(int)(adcValue1);ADResult[2]=ret;Delay_us(10);CS3_HIGH();}//ad4while(DRDY4_LOW()==1){i+=1;Delay_ms(50);if (i>2)break;}i=0;if(DRDY4_LOW()==0){CS4_LOW();Delay_us(10);SPI1_ReadWriteByte(0x38);//command for the comm to read data register for channel 1 (dec 56)//read 16bit of data ADChighByte = SPI1_ReadWriteByte(0xFF);lowByte = SPI1_ReadWriteByte(0xFF);adcValue = highByte << 8;adcValue = adcValue | lowByte;adcValue1=(float)adcValue/3;ret=(int)(adcValue1);ADResult[3]=ret;Delay_us(10);CS4_HIGH();}}/***********spi_tm7705.c***************/。
stm32lcd液晶屏电路设计原理下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!STM32 LCD 液晶屏电路设计原理1. 概述在嵌入式系统中,LCD(Liquid Crystal Display)液晶屏是一种常见的显示设备。
本文针对LCD12864 特性,完成了数字示波器显示必须的绘图驱动程序设计,这个教程定位给初学者使用,我立足从简单到复杂一步一步介绍设计过程,甚至是调试的过程,还包括一些经验总结,特别是提供了完整的keil 工程附件。
希望读者立足示波器项目,学到更多软硬件设计经验技巧。
一、简易数字示波器原理数字示波器基本原理可以简单理解为:数据采集+ 图形显示,该过程循环进行,如图1 所示。
图1 简易数字示波器流程图LCD 图形显示需要根据LCD 特性设计,不同LCD驱动程序不同,本篇将结合不带字库的LCD12864 设计显示程序。
二、图形液晶LCD12864绘图驱动设计基础关于LCD 的硬件接口电路,在其他教程中有详细介绍,涉及单片机总线知识和CPLD 内部电路,需要认真学习,这里借助现成的驱动函数,重点讲解LCD绘图程序设计。
LCD12864 的电路接口在头文件中定义:#define LCD_LCW XBY te[0xf4ea]// 左屏命令写入#define LCD_LDW XBYTE[0xf5ea]// 左屏数据写入#define LCD_LCR XBYTE[0xf6ea]// 左屏命令读出#define LCD_LDR XBYTE[0xf7ea]// 左屏数据读出#define LCD_RCW XBYTE[0xf8ea]// 右屏命令写入#define LCD_RDW XBYTE[0xf9ea]// 右屏数据写入#define LCD_RCR XBYTE[0xfaea]// 右屏命令读出#define LCD_RDR XBYTE[0xfbea]// 右屏数据读出后面所有对LCD 的编程操作都是基于以上接口定义进行的各种读写操作。
首先来看LCD12864 的点阵结构图,如图2 所示。
图2 LCD点阵分布结构图此LCD 屏由水平128 列,垂直64 行组成。
水平128 列分左右各64 列两个半屏构成。
垂直64 行又分8 页,每页8 行(1 列8 点刚好1 字节)。
/*驱动IC:TM7705MCU:STC12C5620AD晶振11.0592MHz功能:读写IC寄存器程序,仅供参考*/#include "reg51.h"#include "intrins.h"sbit SCLK = P2^7;sbit DIN = P2^6;//对应TM7705的DIN sbit DOUT = P2^5;//对应TM7705的DOUT sbit DRDY = P2^4;void TM7705_write(unsigned char dd) {unsigned char i;SCLK=1;for(i=8;i>0;i--){SCLK=0;_nop_();if(dd&0x80)DIN=1;elseDIN=0;_nop_();SCLK=1;_nop_();dd<<=1;}DIN=1;SCLK=1;}unsigned char TM7705_read(void){unsigned char dd=0,i;SCLK=1;for(i=0;i<8;i++){SCLK=0;_nop_();dd=dd<<1;if(DOUT)dd=dd+1;SCLK=1;_nop_();}SCLK=1;return dd;}void main(){unsigned char i,temp1,temp2;unsigned char gain,freq;unsigned char num;DRDY=1;//设置DRDY为输入DOUT=1;//设置DOUT为输入//TM7705初始化DIN=1;for(i=0;i<40;i++)//DIN口高电平持续至少32个时钟后芯片复位{SCLK=0;_nop_();SCLK=1;_nop_();}//设置TM7705TM7705_write(0x22);//写通信寄存器,选择下一步写时钟寄存器TM7705_write(0x04|freq);//选择输出更新率分别为50(0x00),60(0x01),250(0x02),50 TM7705_write(0x12);//写通信寄存器,选择下一步写设置寄存器TM7705_write(0x42|(gain<<3)); //双极性,自校准//增益1(0x00),2(0x08),4(0x10),8(0x18),16(0x20), /*计数值500,待数据稳定*/num=0xff;while(num--){while(DRDY);TM7705_write(0x3A); //写通信寄存器,选择下一步读通道0temp1 = TM7705_read();//读数据16位temp2 = TM7705_read();while(!DRDY);}/*读取数据*/num=0;while(1){while(DRDY);TM7705_write(0x3A); //写通信寄存器,选择下一步读通道0 temp1 = TM7705_read();//读数据16位temp2 = TM7705_read();//add you codewhile(!DRDY);}}。
基于STM32的多路电压测量设计方案本设计提出一种基于STM32芯片的多路电压测量设计方案,测量范围在0-10V 之间。
把STM32内置A/D对多路电压值进行采样,得到相应的数字量。
然后按照数字量和模拟量的比例关系得到对应的模拟电压值,通过TFTLCD显示设备显示出来,同时将多路采集的数据存储到SD卡中。
1.引言近年来,数据采集及其应用受到了人们越来越广泛的关注,数据采集系统也有了迅速的发展,它可以广泛的应用于各种领域。
数据采集技术是信息科学的重要分支之一,数据采集也是从一个或多个信号获取对象信息的过程。
数据采集是工业控制等系统中的重要环节,通常采用一些功能相对独立的单片机系统来实现,作为测控系统不可缺少的部分,数据采集的性能特点直接影响到整个系统。
电压的测量最为普遍性,研究设计并提高电压测量精度的方法及仪器具有十分重要的意义。
在电压测量设计中,单片机作为控制器,是整个设计的核心。
除此之外,设计中还必须有模数转换器(ADC)。
ADC用于直接采集模拟电压并将模拟信号转换成数字信号,它直接影响着数据采集的精度和速度。
2.系统概述本设计的微控制器采用STM32单片机。
STM32系列单片机是基于ARM公司Cortex-M3内核设计的。
它的时钟频率达到72MHz,是同类产品中性能较高的产品,具有高性能、低成本、低功耗的优点,是嵌入式应用设计中良好的选择。
设计中的A/D转换器采用STM32内置ADC.STM32的ADC是一种12位逐次逼近型模拟数字转换器。
它有多达18个通道,可测量16个外部和2个内部信号源。
各通道的A/D转换可以单次、连续、扫描或间断模式执行。
转换结果可以左对齐或右对齐方式存储在16位数据寄存器中。
其输入时钟最大可达到14MHz.本设计可测量8通道电压值,测量范围为0-10V的电压,显示误差为±0.001V.LCD实时显示电压值和波形图,MicroSD卡对数据进行同步存储。
系统原理框图如图1所示。
LCD12864液晶显示模块的使用与分析(函代码分析)一、LCD12864功能应用LCD12864液晶显示模块能显示中文汉字、数字、字符,能显示数字与字符的个数为64个(4行,每行16个数字或字符),能显示汉字的个数为32个(4行,每行8个汉字)。
其内置了8192个中文汉字(16*16的点阵)、128个字符(8*16点阵)、以及64*256 点阵显示RAM(GDRAM)。
图1外观尺寸图图2外观尺寸图图3 LCD12864读操作时序图4 LCD12864写操作时序二、LCD12864主要技术参数(1)工作电压:3.3V-5.5V,模块最佳电压为5V。
(2)可以在显示界面显示数字、字母和中文汉字。
(3)与外部单片机的通信方式有并行或串行两种通信方式,这里主要介绍并行通信方式。
(4)显示内容:128 列× 64 行(5)显示颜色:黄绿/蓝屏/灰屏(6)LCD 类型:STN(7)与MCU 接口:8 位或4 位并行/3 位串行(8)配置LED 背光(9)多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等三、LCD12864液晶显示的电路用法分析图5 LCD12864电路连接图图6 LCD12864电路连接图LCD12864模块主要用来显示所要的界面信息或数据,所以要求能显示汉字,字符和数字,而LCD12864满足系统要求的显示功能。
LCD12864在显示字母和数字时,是4*16的显示字符模块,即可以显示4行,每行可以显示16个字母或数字;在显示汉字时,是4*8的汉字显示模块,即可以显示4行,每行可以显示8个汉字。
下面进行介绍的是并行通信的显示方式。
按照电路原理图跟单片机最小系统进行连线,如图6所示。
LCD12864共有20个引脚,其引脚具体功能如表1所示,由表可得LCD12864引脚组成为8位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制LCD的背景亮度;一个VO引脚,外接一个上拉电阻(控制LCD12864的字符对比度,让字符更加的清晰可见);RST复位引脚,低电平有效,此处直接接高电平;第16、17位空引脚,不用管;剩下的RS,RW,EN 和PSB四个引脚则跟LCD12864的写入息息相关,通过PSB可以控制LCD12864跟单片机的通信方式,输入高电平,则LCD12864跟单片机的通信模式为并行通信,低电平则为串行通信。
【0727学习笔记】LCD12864液晶显示技术-硬件介绍2008-07-27 20:18---- 根据相关资料整理,不对之处,欢迎留言或EMAIL ME niejinbo999# (#换成@) ------ 我是用Proteus仿真的,带字库的LCD12864屏近百大元一个,下载个破解版的Proteus,LCD12864屏直接拖出来就可以用了,想拖几个就拖几个,呵呵,闲话少说,进入正题。
先来看一下Proteus里面的12864长什么样,下图中就是我使用的12864屏,型号为:AMPIRE128X64管脚一共18个。
CS1左半屏片选端,CS2右半屏片选端;VCC、GND就是VCC、GND,没啥好说的;V0液晶显示驱动电压,在网上找的仿真实例中有的这个脚就悬空,我是通过一个电位器接到VCC;RS数据指令选择信号,H为数据,L为指令,有的资料上也叫D/I,我估计是DATA和INSTRUCTIONS这两个单词的缩写;R/W读写选择信号,H为读,L为写,这肯定是READ和WRITE的缩写。
E为LCD使能端,R/W为L时,E信号下降沿锁存DB7-DB0;R/W为H时,E为H,DDRAM数据读到DB7-DB0,如果只写不读的话可以接地处理。
DB0-DB7数据传输端口。
RST复位信号,不过还没弄明白是怎么回事,参考一些资料后接VCC处理。
-VOUT估计和V0差不多,液晶显示驱动电压。
PS:我在网上没找到AMPIRE128X64的资料,但其控制系统和市面上卖的有些是一样的,因此可以参考一下。
我就是参考下面这个型号的资料,需要的朋友可以留下EMIAL。
图片截自深圳彩晶科技的文档资料。
指令说明:一共有7个指令,下面分别加以说明(个人理解)显示开关 0x3e:关;0x3f:开(R/W=0,RS=0)显示起始行 0xc0+i : i取值0至63 (R/W=0,RS=0)设置DDRAM页地址(X地址) 0xb8+i: i取值0至7 (R/W=0,RS=0)设置Y地址 0x40+i:i取值0至63 (R/W=0,RS=0)读状态 R/W为H时,暂未弄明白写数据将数据线上的数据DB7-DB0写到DDRAM ,Y地址指针自动加1 (R/W=0,RS=1)读数据将DDRAM中的数据读入1数据线DB7-DB0 ,Y地址指针自动加1 (R/W=1,RS=1)(用到的很少)DDRAM地址表(注意DB0-DB7在DDRAM里的存储空间,竖起排列)写操作时序(当E信号下降沿时写入数据)小声的说下,资料上是 L有效,时序图里怎么就H了呢?写操作时序(时序参数均为NS级,单片机为US级,故不用考虑延时)读操作时序(时序参数均为NS级,单片机为US级,故不用考虑延时)硬件介绍到此结束,有什么不对之处留言或EMAI告之。
stm3212864lcd显示时间和温度#include "stm32f10x.h"#include "stdio.h"//-------------------------------------------------------------------------------------------------#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2#define KEY0_PRES 1 //KEY0#define KEY1_PRES 2 //KEY1#define WKUP_PRES 3 //WK_UP//-------------------------------------------------------------------------------------------------//位带操作,实现51类似的GPIO控制功能//具体实现思想,参考<>第五章(87页~92页).//IO口操作宏定义#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))//IO口地址映射#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08//IO口操作,只对单一的IO口!//确保n的值小于16!#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入//-------------------------------------------------------------------------------------------------#define LED0 PAout(8) // PA8#define LED1 PDout(2) // PD2#define LED2 PAout(2)#define LED3 PAout(3)//-------------------------------------------------------------------------------------------------// lcd12864//-------------------------------------------------------------------------------------------------#define SID_H GPIOC->BSRR=GPIO_Pin_7#define SID_L GPIOC->BRR=GPIO_Pin_7#define CS_H GPIOC->BSRR=GPIO_Pin_8#define CS_L GPIOC->BRR=GPIO_Pin_8#define SCLK_H GPIOC->BSRR=GPIO_Pin_6#define SCLK_L GPIOC->BRR=GPIO_Pin_6#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat1 1u8 const num_lcd[]={"0123456789"};void Clr_Scr(void);void LCD_Write_String(u8 X,u8 Y,uc8 *s);//12864u8 A,B,C,D;void display_temp_time(void);void display_main(void);void display_1(void);//-------------------------------------------------------------------------------------------------// DS1302//-------------------------------------------------------------------------------------------------#define ds1302clk GPIO_Pin_12#define ds1302dat GPIO_Pin_13#define ds1302rst GPIO_Pin_14uint8_ttime_ds1302[7]={0x00,0x54,0x10,0x08,0x12,0x01,0x08};uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址//按键中断按下显示时间,所以需要全局变量uint8_t i=0,g[7];void ds1302_data(uint8_t *read);uint8_t DSPH[]={"00"};uint8_t DSPM[]={"00"};uint8_t DSPS[]={"00"};uint8_t DSPN[]={"00"};uint8_t DSPY[]={"00"};uint8_t DSPR[]={"00"};//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------// DS18b20//-------------------------------------------------------------------------------------------------float DS18B20_Get_Temp(void);uint8_t DS18B20_Init(void);//-------------------------------------------------------------------------------------------------#define HIGH 1#define LOW 0//-------------------------------------------------------------------------------------------------#define DS18B20_CLK RCC_APB2Periph_GPIOC#define DS18B20_PIN GPIO_Pin_13#define DS18B20_PORT GPIOC//带参宏,可以像内联函数一样使用,输出高电平或低电平#define DS18B20_DATA_OUT(a) if (a) \GPIO_SetBits(GPIOC,GPIO_Pin_13);\else \GPIO_ResetBits(GPIOC,GPIO_Pin_13)//读取引脚的电平#define DS18B20_DATA_IN() GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)uint8_t DSPWD[]={"00"};uint8_t str[2]={0};uint8_t temp;//-------------------------------------------------------------------------------------------------typedef struct{uint8_t humi_int; //湿度的整数部分uint8_t humi_deci; //湿度的小数部分uint8_t temp_int; //温度的整数部分uint8_t temp_deci; //温度的小数部分uint8_t check_sum; //校验和}DS18B20_Data_TypeDef;//---------------------------------------------------------------------------------------------------------------------------------------------------------------------static u8 fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数//-------------------------------------------------------------------------------------------------volatile u32 time = 0;//-------------------------------------------------------------------------------------------------unsigned char sz[5]={0x00,0x01,0x02,0x03,0x04};//-------------------------------------------------------------------------------------------------void delay_init(void);void delay_ms(u16 nms);void delay_us(u32 nus);void KEY_Init(void);//void Delay_us(__IO u32 nTime);void delay_init(void);//-------------------------------------------------------------------------------------------------// 系统定时器初始化//-------------------------------------------------------------------------------------------------void delay_init(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8fac_us=SystemCoreClock/8000000; //为系统时钟的1/8fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数}//-------------------------------------------------------------------------------------------------void delay_us(u32 nus){u32 temp;SysTick->LOAD=nus*fac_us; //时间加载SysTick->VAL=0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16))); //等待时间到达SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器}//--------------------------------------------------------------------//延时nms//注意nms的范围//SysTick->LOAD为24位寄存器,所以,最大延时为://nms<=0xffffff*8*1000/SYSCLK//SYSCLK单位为Hz,nms单位为ms//对72M条件下,nms<=1864//--------------------------------------------------------------------void delay_ms(u16 nms){u32 temp;SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器}//-------------------------------------------------------------------------------------------------// 中断优先级配置//-------------------------------------------------------------------------------------------------void NVIC_Configuration1(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级}//-------------------------------------------------------------------------------------------------// 外部中断初始化函数//-------------------------------------------------------------------------------------------------void EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能AFIO时钟KEY_Init(); //初始化按键对应io模式GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSour ce5); //GPIOC.5 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line5;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSour ce15); //GPIOA.15 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line15;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSour ce0); //GPIOA.0 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);}//-----------------------------------------------------------------// 按键中断函数//-----------------------------------------------------------------void EXTI0_IRQHandler(void){delay_ms(10);if(WK_UP==1){LED0=!LED0;LED1=!LED1;Clr_Scr();A=1;Clr_Scr();//===================================== ============================//printf("测试");//printf("\r\n 现在温度 %.1f 度\r\n",DS18B20_Get_Temp());}EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位}//-----------------------------------------------------------------void EXTI9_5_IRQHandler(void){delay_ms(10);if(KEY0==0){LED0=!LED0;A=0;//printf("稍等");//adcx=Get_Adc_Average(ADC_Channel_1,10);//temp =(float) adcx/4096*3.3;//printf("\r\n The current AD value = 0x%04X \r\n",adcx);//printf("\r\n The current AD value = %f V \r\n",temp);}EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位}//-----------------------------------------------------------------void EXTI15_10_IRQHandler(void){delay_ms(10);if(KEY1==0){LED1=!LED1;A=2;//printf("硕硕");// ds1302_data(read);//printf("20%d%d年%d%d月%d%d日%d%d:%d%d:%d%d 星期%d\r\n",time_ds1302[6],g[6],time_ds1302[4],g[4],time_ds1302[ 3],g[3],//time_ds1302[2],g[2],time_ds1302[1],g[1],time_ds1302[0],g[ 0],g[5]);}EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位}//===================================== ========================================= ===================//-------------------------------------------------------------------------------------------------// LED GPIO 初始化//-------------------------------------------------------------------------------------------------void LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_2|GPIO_Pin_3; //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出,IO口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高}//-------------------------------------------------------------------------------------------------// GPIO 按键初始化//-------------------------------------------------------------------------------------------------void KEY_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0}//-------------------------------------------------------------------------------------------------// 串口配置//-------------------------------------------------------------------------------------------------void USART1_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_/doc/400b4fab7c1cfad6185fa 744.html ART_BaudRate = 9600;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_WordLength = USART_WordLength_8b;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_StopBits = USART_StopBits_1;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Parity = USART_Parity_No ;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_HardwareFlowControl =USART_HardwareFlowControl_None;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1, ENABLE);}//--------------------------------------------------------------------// 配置USART1接收中断//--------------------------------------------------------------------void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}//--------------------------------------------------------------------//--------------------------------------------------------------------// 重定向c库函数printf到USART1//--------------------------------------------------------------------int fputc(int ch, FILE *f){//发送一个字节数据到USART1USART_SendData(USART1, (uint8_t) ch);//等待发送完毕while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);}// 重定向c库函数scanf到USART1int fgetc(FILE *f){while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(USART1);}//--------------------------------------------------------------------// 串口3配置//--------------------------------------------------------------------void USART3_Config(void){NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_/doc/400b4fab7c1cfad6185fa 744.html ART_BaudRate = 9600;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_WordLength = USART_WordLength_8b;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_StopBits = USART_StopBits_1;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Parity = USART_Parity_No ;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}//===================================== ========================================= ========================================= ========================================= =====// DS1302//===================================== ========================================= ========================================= ========================================= =====void DS1302_GPIO(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst; //clk、rst配置为输出GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = ds1302dat;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; //IO配置为双向GPIO_Init(GPIOB, &GPIO_InitStruct);}//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------void write_1302byte(uint8_t dat){uint8_t i = 0;GPIO_ResetBits(GPIOB,ds1302clk);delay_us(2);//延时大约2usfor(i = 0;i < 8;i ++){GPIO_ResetBits(GPIOB,ds1302clk); //ds1302clk=0;if(dat&0x01)GPIO_SetBits(GPIOB,ds1302dat);else GPIO_ResetBits(GPIOB,ds1302dat);delay_us(2);GPIO_SetBits(GPIOB,ds1302clk);dat >>= 1;delay_us(1);}}//-----------------------------------------------uint8_t read_1302(uint8_t add){uint8_t i=0;uint8_t Return_dat=0x00;GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk);delay_us(3);GPIO_SetBits(GPIOB,ds1302rst);delay_us(3);write_1302byte(add);for(i=0;i<8;i++){GPIO_SetBits(GPIOB,ds1302clk);Return_dat >>= 1;GPIO_ResetBits(GPIOB,ds1302clk);if(GPIO_ReadInputDataBit(GPIOB,ds1302dat)==1) //数据线此时为高电平{Return_dat = Return_dat|0x80;}}delay_us(1);GPIO_ResetBits(GPIOB,ds1302rst); //ds1302rst=0;释放总线return Return_dat;}//-----------------------------------------------void write_1302(uint8_t add,uint8_t dat) //向指定寄存器写入一个字节的数据{GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk); //ds1302rst=0;//ds1302clk=0;delay_us(1);GPIO_SetBits(GPIOB,ds1302rst); //ds1302rst=1;delay_us(2);write_1302byte(add);write_1302byte(dat);GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk); //ds1302clk=0;//ds1302rst=0;delay_us(1);}//-----------------------------------------------void ds1302_init(uint8_t*write,uint8_t*time) //初始化1302 {uint8_t i=0,j=0;write_1302(0x8e,0x00);for(i=0;i<7;i++){j=time_ds1302[i]%10;time_ds1302[i]=(time_ds1302[i]/10)*16+j;}for(i=0;i<7;i++){write_1302(write[i],time_ds1302[i]);}write_1302(0x8e,0x80);//-----------------------------------------------void ds1302_data(uint8_t *read){//中断按键按下显示时间,所以定义为全局变量//uint8_t i=0,g[7],time_ds1302[7];//static uint8_t s = 1;for(i=0;i<7;i++){time_ds1302[i]=read_1302(read[i]);}//===================================== ==========/*for(i=0;i<7;i++){g[i]=time_ds1302[i]%16; time_ds1302[i]=time_ds1302[i]/16;}*///此时已转换成10进制数,g[i]里面存放的是秒分时日月周年的各个位数据//而此时的time[i]存放的是十位数据//if(s != (time[0]+g[0]))//printf("20%d%d年%d%d月%d%d日%d%d:%d%d:%d%d 星期%d\r\n",time_ds1302[6],g[6],time_ds1302[4],g[4],time_ds1302[ 3],g[3],//time_ds1302[2],g[2],time_ds1302[1],g[1],time_ds1302[0],g[ 0],g[5]);//s = time[0]+g[0];//---------------------------------------------------------------------------------------------------------------------------------------------------------------------// DS18B20温度传感器//-------------------------------------------------------------------------------------------------void DS18B20_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); //开启DS18B20_PORT的外设时钟GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHzGPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORTGPIO_SetBits(DS18B20_PORT, DS18B20_PIN);}//-------------------------------------------------------------------------------------------------void DS18B20_Mode_IPU(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置引脚模式为浮空输入模式GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORT}//-------------------------------------------------------------------------------------------------void DS18B20_Mode_Out_PP(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速率为50MHzGPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORT}//-------------------------------------------------------------------------------------------------void DS18B20_Rst(void){DS18B20_Mode_Out_PP(); //主机设置为推挽输出DS18B20_DATA_OUT(LOW);delay_us(750); // 主机至少产生480us的低电平复位信号DS18B20_DATA_OUT(HIGH); //主机在产生复位信号后,需将总线拉高delay_us(15); //从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲}//-------------------------------------------------------------------------------------------------//检测从机给主机返回的存在脉冲//0:成功//1:失败//-------------------------------------------------------------------------------------------------uint8_t DS18B20_Presence(void){uint8_t pulse_time = 0;DS18B20_Mode_IPU(); //主机设置为上拉输入//等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号//如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲while( DS18B20_DATA_IN() && pulse_time<100 ){pulse_time++;delay_us(1); //经过100us后,存在脉冲都还没有到来}if( pulse_time >=100 )return 1;elsepulse_time = 0;while( !DS18B20_DATA_IN() && pulse_time<240 ) //存在脉冲到来,且存在的时间不能超过240us{pulse_time++;delay_us(1);}if( pulse_time >=240 )return 1;elsereturn 0;}//从DS18B20读取一个bituint8_t DS18B20_Read_Bit(void){uint8_t dat; //读0和读1的时间至少要大于60usDS18B20_Mode_Out_PP();DS18B20_DATA_OUT(LOW); //读时间的起始:必须由主机产生 >1us <15us 的低电平信号delay_us(10);DS18B20_Mode_IPU(); //设置成输入,释放总线,由外部上拉电阻将总线拉高//Delay_us(2);if( DS18B20_DATA_IN() == SET )dat = 1;elsedat = 0;delay_us(45); //这个延时参数请参考时序图return dat;}//从DS18B20读一个字节,低位先行uint8_t DS18B20_Read_Byte(void){uint8_t i, j, dat = 0;for(i=0; i<8; i++){j = DS18B20_Read_Bit();dat = (dat) | (j<<i);}return dat;}//写一个字节到DS18B20,低位先行void DS18B20_Write_Byte(uint8_t dat) {uint8_t i, testb;DS18B20_Mode_Out_PP();for( i=0; i<8; i++ ){testb = dat&0x01;dat = dat>>1;//写0和写1的时间至少要大于60us if (testb){DS18B20_DATA_OUT(LOW);//1us < 这个延时 < 15usdelay_us(8);DS18B20_DATA_OUT(HIGH);delay_us(58);}else{DS18B20_DATA_OUT(LOW);//60us < Tx 0 < 120usdelay_us(70);DS18B20_DATA_OUT(HIGH);//1us < Trec(恢复时间) < 无穷大delay_us(2);}}}//-------------------------------------------------------------------------------------------------void DS18B20_Start(void){DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0X44); // 开始转换}//-------------------------------------------------------------------------------------------------uint8_t DS18B20_Init(void){DS18B20_GPIO_Config();DS18B20_Rst();return DS18B20_Presence();}//温度 = 符号位 + 整数 + 小数*0.0625float DS18B20_Get_Temp(void){uint8_t tpmsb, tplsb;short s_tem;float f_tem;DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0X44); // 开始转换DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0XBE); // 读温度值tplsb = DS18B20_Read_Byte();tpmsb = DS18B20_Read_Byte();s_tem = tpmsb<<8;s_tem = s_tem | tplsb;if( s_tem < 0 ) // 负温度f_tem = (~s_tem+1) * 0.0625;elsef_tem = s_tem * 0.0625;return f_tem;}//===================================== ========================================= ===void Show_Temperature(void){</i);temp=DS18B20_Get_Temp();str[0]=temp/10;str[1]=temp%10;DSPWD[0]=str[0]+0x30;DSPWD[1]=str[1]+0x30;}//-------------------------------------------------------------------------------------------------//---------------------------------------------------------------------------------------------------------------------------------------------------------------------// LCD12864//---------------------------------------------------------------------------------------------------------------------------------------------------------------------void Lcds_Config(void){// SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/*PC4-A0*/// GPIO_SetBits(GPIOC, GPIO_Pin_12);//预置为高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;。