找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2831|回复: 2
打印 上一主题 下一主题
收起左侧

LCD1602显示采集的电压(简易电压表项目)

[复制链接]
跳转到指定楼层
楼主
实际上我们用电阻做一个电压,用单片机的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) //检测忙状态
{
        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的状态,知道为0时 退出,然后设置EO为低,不选中芯片
}

void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
        LCD1602_WaitReady();//只有sta为0,才会执行完这个函数,意味着不忙了
        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) //写数据
{
        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++);
    }
}

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位数据接口
    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');
       
}



b8f80ea9ab930055c77b906d1af6f82.png (102.94 KB, 下载次数: 88)

b8f80ea9ab930055c77b906d1af6f82.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:88256 发表于 2021-6-9 18:18 | 只看该作者
也就是1602显示部分,ADC呢?
回复

使用道具 举报

板凳
ID:1096922 发表于 2023-10-22 22:40 | 只看该作者
如果需要用到四路ADC,IO口不够 ,需要把低八位改高八位改如何改。搞了好久没弄懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表