實際上我們用電阻做一個電壓,用單片機的IO口來采集電壓,并將電壓顯示在LCD顯示屏上,形成了一個簡易的電壓表.
部分代碼如下:(不懂的加我qq280971346)
#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) //檢測忙狀態(tài)
{
uint8_t sta;
GPIOB->ODR =0x00FF;//讓PB0-PB7都輸出高電平
RSO(0);
RWO(1);
EO(1);
SysTick_Delay_Us(1);
do{
sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
EO(0);
}while(sta);
//一直讀PB7的狀態(tài),知道為0時 退出,然后設置EO為低,不選中芯片
}
void LCD1602_WriteCmd(uint8_t cmd) //寫指令
{
LCD1602_WaitReady();//只有sta為0,才會執(zhí)行完這個函數(shù),意味著不忙了
RSO(0);
RWO(0);
EO(0);
SysTick_Delay_Us(1);
EO(1);
LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
//自己試驗了一下,cmd=0x02,進行上面這句運算后就是GPIOB->ODR =0x02
//但是直接GPIOB->ODR =0x02這樣,顯示屏輸出不了字母A,不知道為什么
EO(0);
SysTick_Delay_Us(400);
}
void LCD1602_WriteDat(uint8_t dat) //寫數(shù)據(jù)
{
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--) //連續(xù)寫入len個字符數(shù)據(jù)
{
LCD1602_WriteDat(*str++);
}
}
void LCD1602_ShowChar(uint8_t x, uint8_t y, u8 str)
{
LCD1602_SetCursor(x, y); //設置起始地址
LCD1602_WriteDat(str);
}
void LCD1602_Init(void)
{
LCD1602_GPIO_Config(); //開啟GPIO口
LCD1602_WriteCmd(0X38); //16*2顯示,5*7點陣,8位數(shù)據(jù)接口
LCD1602_WriteCmd(0x0C); //顯示器開,光標關閉
LCD1602_WriteCmd(0x06); //文字不動,地址自動+1
LCD1602_WriteCmd(0x01); //清屏
}
void LCD1602_Clear(void)
{
LCD1602_WriteCmd(0x01); //清屏
}
void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
{
LCD1602_SetCursor(x, y); //設置起始地址
LCD1602_ShowChar(x,y,num+'0');
}
|