找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc8h8k64u内部12位ad加lcd1602做得电压表为啥运行不了?

[复制链接]
回帖奖励 100 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:1108299 发表于 2024-3-5 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <STC8h.H>
#include <stdio.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
//        uint Get_ADC12bitResult(uchar channel);

//void iO();
sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0

void delay(unsigned int ms)        //@11.0592MHz
{
        unsigned char data i, j;
   while(ms--)
         {
        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}}

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
delay(1);
EN_SET;
         delay(1);
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
delay(1);
EN_CLR;
         delay(1);
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
delay(1);
EN_CLR;
         delay(1);
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delay(5);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while ((*s)!='\0')
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   delay(5);
   LCD_Write_Com(0x38);
   delay(5);
   LCD_Write_Com(0x38);
   delay(5);  
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   delay(5);  
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }



void adc_init() {
    ADCCFG =ADCCFG|0x20;  // 将P1.0设置为ADC功能
    ADC_RES = 0;
        ADC_RESL = 0;
    ADC_CONTR = 0x80;
}

unsigned int adc_read()
        {
    ADC_CONTR |= 0x40;
                delay(3);
    while ((ADC_CONTR&0x20)==0);
    ADC_CONTR &= ~0x20;
    return (ADC_RES << 8) + ADC_RESL;
}

void main() {
    unsigned int voltage;
        unsigned char i;
    char str[16];

    LCD_Init();
    adc_init();

    while (1) {
        voltage = adc_read();
        sprintf(str, "Voltage: %.2fV", voltage * 5.0 / 4096);

        LCD_Write_Com(0x80);  // 设置光标位置为第一行第一列
        for ( i = 0; i < 16; i++) {
            LCD_Write_Data(str[i]);
        }

        delay(1000);  // 延时1秒钟
    }
}


有没有大佬回答!这个显示没有报错,但是运行不了,是哪个原因?



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

使用道具 举报

沙发
ID:226055 发表于 2024-3-5 14:06 | 只看该作者
    你好,你这里只给了程序,看不到原理图和硬件不好分析,下面从典型的几点给下参考:
    1、先分开测试,比如先点亮屏,屏需要硬件调节对比度的。不知道你的硬件,我把我手上有的艾克姆的STC8H8K64U的程序附件发上。


    2、如果屏可以显示(注意参考时把IO口都注意到,修改到),然后可以测下ADC,程序见附件。注意ADC选择的通道。例程用的P0.4口。

ADC.rar

42.32 KB, 下载次数: 8

LCD1602.rar

40.56 KB, 下载次数: 6

回复

使用道具 举报

板凳
ID:41656 发表于 2024-3-5 15:48 | 只看该作者
你说的运行不了是具体只什么,显示也显示不了还是能显示ADC转换不正常。程序中没有看到你初始化IO模式,STC8H的IO看看手册上面P3.0、P3.1是默认准双向,其余IO是默认高阻模式,初始化驱动LCD的GPIO模式为准双向或者推挽模式,不熟悉的情况下设置为准双向
回复

使用道具 举报

地板
ID:213173 发表于 2024-3-5 16:40 | 只看该作者
给你一个STC8H测量电压,数码管显示并串口上传数据的示例,只要把对应端口和数码管改1602显示就行。
STC8H测量电源电压计算输入电压串口上传数据.rar (22.1 KB, 下载次数: 19)

回复

使用道具 举报

5#
ID:883242 发表于 2024-3-5 17:40 | 只看该作者
是没有显示还是显示的数值不对?
回复

使用道具 举报

6#
ID:1108299 发表于 2024-3-5 19:58 | 只看该作者
没有显示
回复

使用道具 举报

7#
ID:62223 发表于 2024-3-9 10:29 | 只看该作者
单片机的P0数据口得配置推挽输出,
如果是自己做的板子注意需要把显示屏的VL引脚接一个1K电阻到地,调高对比度
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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