#include <stdio.h>
#include <stm32f10x.h>
#define RS_0 (GPIOA->BRR = GPIO_BRR_BR0)
#define RS_1 (GPIOA->BSRR = GPIO_BSRR_BS0)
#define RW_0 (GPIOA->BRR = GPIO_BRR_BR1)
#define RW_1 (GPIOA->BSRR = GPIO_BSRR_BS1)
#define E_0 (GPIOA->BRR = GPIO_BRR_BR2)
#define E_1 (GPIOA->BSRR = GPIO_BSRR_BS2)
void delay(void)
{
uint32_t i;
for (i = 0; i < 8000000; i++);
}
void delay_short(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
void LCD1602_BusyWait(void)
{
RS_0;
RW_1;
E_1;
GPIOC->CRL = 0x44444444; // 讀端口
while (GPIOC->IDR & GPIO_IDR_IDR7);
GPIOC->CRL = 0x33333333;
E_0;
}
void LCD1602_WriteCmd(uint8_t cmd)
{
LCD1602_BusyWait();
RS_0;
RW_0;
GPIOC->ODR = cmd;
E_1;
delay_short();
E_0;
}
void LCD1602_WriteData(uint8_t data)
{
LCD1602_BusyWait();
RS_1;
RW_0;
GPIOC->ODR = data;
E_1;
delay_short();
E_0;
}
void LCD1602_Init(void)
{
LCD1602_WriteCmd(0x38);
LCD1602_WriteCmd(0x01);
LCD1602_WriteCmd(0x0c);
DAC->CR = DAC_CR_EN1 | DAC_CR_EN2;
DAC->DHR8R1 = 69; // 對比度電壓: 約1.0V, 端口: PA4
DAC->DHR8R2 = DAC->DHR8R1; // PA5輸出同樣大小的電壓
}
// printf內容往液晶上顯示
// 工程屬性里的Use MicroLIB必須打勾
int fputc(int ch, FILE *fp)
{
LCD1602_WriteData(ch);
return ch;
}
int main(void)
{
uint8_t n = 0;
RCC->APB1ENR = RCC_APB1ENR_DACEN;
RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_ADC1EN;
GPIOA->CRL = 0x00000333; // RS, RW, E設為輸出, PA4~5為模擬輸出, PA6為模擬輸入
GPIOC->CRL = 0x33333333; // 1602DATA
LCD1602_Init();
ADC1->SQR1 &= ~ADC_SQR1_L; // L=0000, 1 conversion
ADC1->SQR3 = 6; // SQ1=PA6=ADC12_IN6
ADC1->CR2 = ADC_CR2_ADON;
while (1)
{
ADC1->CR2 |= ADC_CR2_ADON; // 再次寫1開始AD轉換
while ((ADC1->SR & ADC_SR_EOC) == 0); // 等待轉換完畢
LCD1602_WriteCmd(0x80); // 轉到第一行
printf("ADC1->DR=%d ", ADC1->DR);
LCD1602_WriteCmd(0xc0); // 轉到第二行
printf("n=%d ", n++);
delay();
}
}