- // LCD1602.h
- #ifndef _BSP_LCD1602_H
- #define _BSP_LCD1602_H
- #include "stm32f10x.h"
- #include "stm32f10x_gpio.h"
- #include "bsp_SysTick.h"
- #define LCD1602_CLK RCC_APB2Periph_GPIOB
- #define LCD1602_GPIO_PORT GPIOB
- #define LCD1602_E GPIO_Pin_10 //定义使能引脚
- #define LCD1602_RW GPIO_Pin_11 //定义读写引脚
- #define LCD1602_RS GPIO_Pin_12 //定义数据、命名引脚
- #define EO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_E)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_E))
- #define RWO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RW)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RW))
- #define RSO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RS)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RS))
- //只能是某个GPIO口的低八位
- #define DB0 GPIO_Pin_0
- #define DB1 GPIO_Pin_1
- #define DB2 GPIO_Pin_2
- #define DB3 GPIO_Pin_3
- #define DB4 GPIO_Pin_4
- #define DB5 GPIO_Pin_5
- #define DB6 GPIO_Pin_6
- #define DB7 GPIO_Pin_7
- void LCD1602_Init(void); //初始化LCD602;
- void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str,uint8_t len);
- void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num);
- void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat);
- #endif //_BSP_LCD1602_H
复制代码
#include "adc.h"
void ADC1_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE); //使能ADC1,GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//为什么没有配置这个????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PC4
}
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;//ADC结构体变量//注意在一个语句快内变量的声明要放在可执行语句的前面,否则出错,因此要放在ADC1_GPIO_Config();前面
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //使能扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换,不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为1
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
//ADC1选择信道14,音序等级1,采样时间55.5个周期
// ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
ADC_Cmd(ADC1, ENABLE);//使能ADC1
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// ADC_ResetCalibration(ADC1); //重置.(复位).ADC1校准寄存器
// while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
// ADC_StartCalibration(ADC1);//开始ADC1校准
// while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}
- //adc.h
- #ifndef __ADC_H
- #define __ADC_H
- #include "sys.h"
- void Adc_Init(void);
- void ADC1_GPIO_Config(void);
- void ADC_Config(void);
- #endif
复制代码- #include "bsp-lcd1602.h"
- void LCD1602_GPIO_Config(void)
- {
- RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
- GPIO_InitTypeDef LCD1602_GPIOStruct;
- LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
- LCD1602_GPIOStruct.GPIO_Pin = LCD1602_E | LCD1602_RS | LCD1602_RW ;
- GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
- LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
- LCD1602_GPIOStruct.GPIO_Pin = DB0 | DB1 | DB2 |DB3 | DB4 | DB5|
- DB6 | DB7 ; //设置为开漏输出
- GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
- }
- void LCD1602_WaitReady(void) //检测忙状态
- {
- uint8_t sta;
- GPIOB->ODR =0x00FF;
- RSO(0);
- RWO(1);
- EO(1);
- SysTick_Delay_Us(1);
- do{
- sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
- EO(0);
- }while(sta);
- }
- void LCD1602_WriteCmd(uint8_t cmd) //写指令
- {
- LCD1602_WaitReady();
- RSO(0);
- RWO(0);
- EO(0);
- SysTick_Delay_Us(1);
- EO(1);
- LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
- EO(0);
- SysTick_Delay_Us(400);
- }
- void LCD1602_WriteDat(uint8_t dat) //写数据
- {
- LCD1602_WaitReady();
- RSO(1);
- RWO(0);
- SysTick_Delay_Us(30);
- EO(1);
- LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
- EO(0);
- SysTick_Delay_Us(400);
- }
- void LCD1602_SetCursor(uint8_t x, uint8_t y)
- {
- uint8_t addr;
-
- if (y == 0) //由输入的屏幕坐标计算显示RAM的地址
- addr = 0x00 + x; //第一行字符地址从0x00起始
- else
- addr = 0x40 + x; //第二行字符地址从0x40起始
- LCD1602_WriteCmd(addr|0x80); //设置RAM地址
- }
- void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
- {
- LCD1602_SetCursor(x, y); //设置起始地址
- while (len--) //连续写入len个字符数据
- {
- LCD1602_WriteDat(*str++);
- }
- }
- //??1???
- //x,y :????
- //num:??(0~99)
- //-----------------------------*/
- void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
- {
- LCD1602_SetCursor(x, y); //设置起始地址
- LCD_ShowChar(x,y,num+'0');
-
- }
- void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
- {
- LCD1602_SetCursor(x, y); //设置起始地址
- LCD1602_WriteDat(dat);
- }
- void LCD1602_Init(void)
- {
- LCD1602_GPIO_Config(); //开启GPIO口
- LCD1602_WriteCmd(0X38); //16*2显示,5*7点阵,8位数据接口
- LCD1602_WriteCmd(0x0C); //显示器开,光标关闭
- LCD1602_WriteCmd(0x06); //文字不动,地址自动+1
- LCD1602_WriteCmd(0x01); //清屏
- }
-
-
复制代码- int main()
- #include "stm32f10x.h"
- #include "bsp-lcd1602.h"
- #include "delay.h"
- #include "sys.h"
- #include "adc.h"
- int main(void)
- {
- int a,b,c,d;
- float temp;
-
- delay_init(); //延时函数初始化
- LCD1602_Init();
- ADC1_GPIO_Config();
- ADC_Config();
- LCD1602_ShowStr(1,0,"adcvalue=0.0V",13);
- LCD1602_ShowStr(1,1,"LIUTONGBO 32",13);
-
- while(1)
- {
- b=ADC_GetConversionValue(ADC1);
- temp=(float)b*(3.4/4096);
- a=temp/0.675;
- c=temp*10;
- d=c%10;
- LCD_ShowNum(10,0,a);
- LCD_ShowNum(12,0,d);
- }
- }
复制代码
|