目前共有3篇帖子。 內容轉換:不轉換▼
 
點擊 回復
410 2
【程序】STM32单片机通过DAC向1602液晶提供对比度电压,不使用外部电位器
一派護法 十九級
1樓 發表于:2017-3-5 14:35

/* LCD1602引脚2(VDD)必须接5V电压, 不可以接3.3V电压。其他引脚(包括引脚15-背光电源正)都可以接3.3V电压 */
/* 必须把J-Link设为不供电(更改内部跳线), 然后另插上USB线,才能得到5V的电压 */
#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)
{
    uint16_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();
    E_0;
}

void LCD1602_WriteData(uint8_t data)
{
    LCD1602_BusyWait();
    RS_1;
    RW_0;
    GPIOC->ODR = data;
    E_1;
    delay();
    E_0;
}

void LCD1602_WriteString(const char *s)
{
    while (*s)
        LCD1602_WriteData(*s++);
}

void LCD1602_Init(void)
{
    LCD1602_WriteCmd(0x38);
    LCD1602_WriteCmd(0x01);
    LCD1602_WriteCmd(0x0c);
}

int main(void)
{
    RCC->APB1ENR = RCC_APB1ENR_DACEN;
    RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN;
    
    GPIOA->CRL = 0x00000333; // RS, RW, E设为输出, PA4~5设为模拟输出, 其中PA4接LCD_3(对比度端口), PA5接电压表正极
    GPIOC->CRL = 0x33333333; // 数据端口设为输出
    
    // 设置背光电压
    DAC->CR = DAC_CR_EN1 | DAC_CR_EN2;
    DAC->DHR8R1 = 69; // 通道1为液晶提供对比度电压, 约1.0V
    DAC->DHR8R2 = DAC->DHR8R1; // 通道2供电压表显示电压
    
    LCD1602_Init();
    LCD1602_WriteString("Hello World!");
    LCD1602_WriteCmd(0xc0);
    LCD1602_WriteString("STM32F103RCT6");
    while (1);
}
一派護法 十九級
2樓 發表于:2017-3-5 14:39

delay函数用于延长E信号的高电平时间,一般情况下for循环里面的循环值至少要为10液晶才能正常工作。
因为STM32单片机工作速度非常快,如果不延时,那么程序运行时液晶什么都不会显示。

另外,delay函数里面的变量i可以声明为uint8_t类型:
void delay(void)
{
    uint8_t i;
    for (i = 0; i < 10; i++);
}
一派護法 十九級
3樓 發表于:2017-3-5 14:40

LCD1602_BusyWait函数也是必不可少的,如果在写命令或指令前不执行这个函数,则液晶也会什么都不显示。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:410 回複數:2
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2017-3-5 14:40
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。