仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
KC5OG0HJDY)(1]`Z(GM73D7.png (45.58 KB, 下載次數: 197)
下載附件
proteus仿真原理圖
2019-5-4 11:17 上傳
lcd1602代碼:- #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); //清屏
- }
-
-
復制代碼 adc采集源代碼:
- #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); //初始化PA1
- }
- 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軟件開始轉換
- }
復制代碼 全部資料:
0.png (5.85 KB, 下載次數: 141)
下載附件
2019-5-5 02:12 上傳
注意這個仿真只能在Proteus8.8運行,經過測試高版本和低版本都不行,數據直接顯示0:
ADC+LCD1602.7z
(237.27 KB, 下載次數: 2532)
2019-5-5 02:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|