找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4547|回复: 8
收起左侧

如何用光电开关计数并用LCD1602显示,求指教

[复制链接]
ID:313959 发表于 2018-5-26 15:17 | 显示全部楼层 |阅读模式
本帖最后由 ethanshen 于 2018-5-26 15:27 编辑

如何用光电开关计数并用LCD1602显示,求大神们指教
下面是我写的程序,希望大家帮我看一下,很急!!!!!!
不知道为什么,总是第一下显示,后面就不显示了,我用的是STC89C52
希望大神能帮我改改这个程序,我是一个初学者,我已经看了好几天了,还是找不出问题,谢谢了!!!!!!

补充:我是用这个来计算硬币的个数的

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
sbit led1=P1^0;
uint num;

unsigned char code table1[]={"Coins total:"};

uchar code smgduan[]= {0x3f, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}


void Read_Busy()//读状态
{
        uchar busy;
        P0 = 0xff;
        RS = 0;
        RW = 1;
        do
        {
                EN = 1;
                busy = P0;
                EN = 0;
        }while(busy & 0x80);
}

void Write_Cmd(uchar cmd) //写LCD1602命令一个字节
{
        Read_Busy();
        RS = 0;
        RW = 0;
        P0 = cmd;
        EN = 1;
        EN = 0;
}

void Write_Dat(uchar dat)//写一个字节数据
{
        Read_Busy();
        RS = 1;
        RW = 0;
        P0 = dat;
        EN = 1;
        EN = 0;
}

void display_digit(uchar d)//显示数字
{
        uchar bai,shi,ge;
        bai=d/100;
        shi=d%100/10;
        ge=d%10;
        Write_Dat(bai+'0');
        Write_Dat(shi+'0');
        Write_Dat(ge+'0');
        while(1);
}

//X代表0-40地址;Y:0代表第一行,1代表第二行;str代表字符串
void display_char(uchar x, uchar y, uchar *str)//显示字符串
{
        if(y) x |= 0x40;
        x |= 0x80;
        Write_Cmd(x);
        while(*str!='\0')
        {
                Write_Dat(*str++);
        }
}


void LCD1602Init()         //初始化
{
        Write_Cmd(0x38);//设置16*2显示
        Write_Cmd(0x0f);//开显示 显示光标,光标闪烁
        Write_Cmd(0x06);//地址指针移位命令
        Write_Cmd(0x01); //清屏
}


//定时器0初始化
void timer0Init()
{
        EA=1;
        ET0=1;
        TR0 = 1;         
        TMOD |= 0X01;
        TH0 =0Xed;
        TL0 =0Xff;
}


void main()
{
        LCD1602Init();
        display_char(0,0,&table1[0]);
        while(1)
        {
                if(led1==0)
                {
                delay(20);
                        if(led1==0)//检测P1^0的低电平,若是,则num加一
                        {
                        num++;
                        while(!led1);
                        }
        
                }
        }
}

void timer0() interrupt 1
{
        TH0=0Xed;
        TL0=0Xff;
        display_digit(num);
}

1.jpg
QQ图片20180526151540.jpg
回复

使用道具 举报

ID:303383 发表于 2018-5-26 16:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:277550 发表于 2018-5-26 16:22 | 显示全部楼层
如果低电平就触发,那检测连接到外部中断上。。。。。。。主函数只管显示

~~~~~~~~~~~
回复

使用道具 举报

ID:313959 发表于 2018-5-27 08:44 | 显示全部楼层
devcang 发表于 2018-5-26 16:22
如果低电平就触发,那检测连接到外部中断上。。。。。。。主函数只管显示

~~~~~~~~~~~

但还是一样的结果啊!
回复

使用道具 举报

ID:160834 发表于 2018-5-27 22:27 | 显示全部楼层
void display_digit(uchar d)//显示数字
{
        uchar bai,shi,ge;
        bai=d/100;
        shi=d%100/10;
        ge=d%10;
        Write_Dat(bai+'0');
        Write_Dat(shi+'0');
        Write_Dat(ge+'0');
       while(1);    是这句代码  应该取消掉。否则显示一次数字后一直停留在这里不下去。
}

另外 程序显示数字位置代码需要再修改下。现在仿真试下来,计数后是一直往后显示而不是在原位置刷新再显示。

回复

使用道具 举报

ID:160834 发表于 2018-5-28 09:44 | 显示全部楼层
程序修改了下。
主程序建议如下:
void main()
{
        LCD1602Init();
        display_char(0,0,&table1[0]);
        while(1)
        {
                if(key1==0)
                {
                delay(20);
                        if(key1==0)
                        {
                          num++;
                          Write_Cmd(0x01);
                         display_char(0,0,&table1[0]);
                         display_digit(num);  //显示数值加在主程序里  不要放在时间中断里。时间中断有干扰显示。 把时间中断程序取消掉。

                          while(!key1);
                        }
                }
        }
}

仿真测试过。能正确显示递加的数值。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:298422 发表于 2018-5-28 18:58 | 显示全部楼层
你好,  为什么我只显示了  coi 三个字母有时候是8个字母 有时候是全的。 为什么?新手,,
回复

使用道具 举报

ID:313959 发表于 2018-5-29 20:24 | 显示全部楼层
QIANLILI 发表于 2018-5-28 09:44
程序修改了下。
主程序建议如下:
void main()

key1是什么,为什么我测试了还是数字不变化
回复

使用道具 举报

ID:427364 发表于 2018-11-15 21:17 | 显示全部楼层
楼主,可以让我看下实物引脚怎样连接吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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