找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602数字显示

[复制链接]
跳转到指定楼层
楼主
1黑币
用1602显示一个可变的数字,初始为0,K1按下时数字加1,K2按下时数字减1

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

使用道具 举报

沙发
ID:219388 发表于 2017-7-15 15:34 | 只看该作者
这可以通过改变1602的写入数据来实现,按键按下时,数据加一,再将新的数据放入1602写入数据里就可以了
回复

使用道具 举报

板凳
ID:164602 发表于 2017-7-16 10:32 | 只看该作者
按照你的要求,我写了一个程序:
#include<reg51.h>       

#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

sbit k1=P3^1;
sbit k2=P3^0;


unsigned char sz[12]="computation:",BUF[12]="0123456789+-";

void Lcd1602_Delay1ms(uint c)
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=50;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }

}

void Delay15ms()
{
        unsigned char i, j;

        i = 30;
        j = 43;
        do
        {
                while (--j);
        } while (--i);
}

void LcdWriteCom(uchar com)
{
        LCD1602_E = 0;
        LCD1602_RS = 0;
        LCD1602_RW = 0;
       
        LCD1602_DATAPINS = com;
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;       
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}

void LcdWriteData(uchar dat)
{
        LCD1602_E = 0;
        LCD1602_RS = 1;
        LCD1602_RW = 0;

        LCD1602_DATAPINS = dat;
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}

void LcdInit()
{
        LcdWriteCom(0x38);
        LcdWriteCom(0x0c);
        LcdWriteCom(0x06);
        LcdWriteCom(0x01);
        LcdWriteCom(0x02);
        LcdWriteCom(0x80);
}

void LCDreturn()
{
        Delay15ms();
        LcdWriteCom(0x38);
        Delay15ms();
        LcdWriteCom(0x38);
        Delay15ms();
        LcdWriteCom(0x38);
        LcdWriteCom(0x08);
        LcdWriteCom(0x01);
        LcdWriteCom(0x02);
        LcdWriteCom(0x38);
        LcdWriteCom(0x0c);
        LcdWriteCom(0x06);
        LcdWriteCom(0x80);
}

void main(void)
{
        unsigned char i;
        char j=0,k;
        LCDreturn();
        LcdInit();
        for (i=0;i<12;i++)
        {
                LcdWriteData(sz[i]);
        }
        while(1)
        {
                if (k1==0)
                {
                        Delay15ms();
                        if (k1==0)
                        {
                                j++;
                                if (j>125)
                                {
                                        j=-125;
                                }
                        }
                        for (i=0;((i<20)&&(k1==0));i++)
                        {
                                Delay15ms();
                        }
                }
                if (k2==0)
                {
                        Delay15ms();
                        if (k2==0)
                        {
                                j--;
                                if (j<-125)
                                {
                                        j=125;
                                }
                        }
                        for (i=0;((i<20)&&(k2==0));i++)
                        {
                                Delay15ms();
                        }
                }
                LcdWriteCom(0x8c);
                if (j<0)
                {
                        LcdWriteData(BUF[11]);
                        k=-j;
                }
                else
                {
                        LcdWriteData(BUF[10]);
                        k=j;
                }
                LcdWriteData(BUF[k/100]);//多位结果只能一次一次地找位
                LcdWriteData(BUF[(k%100)/10]);
                LcdWriteData(BUF[(k%10)/1]);
        }                               
}

单片机:STC89C52RC,其它电路如图所示。

1.jpg (33.94 KB, 下载次数: 63)

1.jpg

2.jpg (19.3 KB, 下载次数: 77)

2.jpg
回复

使用道具 举报

地板
ID:137499 发表于 2017-7-17 09:12 | 只看该作者
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

拜谢大神,那要是按完k1按k2数字加一,然后按完k2按k1数字减一要怎么改
回复

使用道具 举报

5#
ID:918467 发表于 2021-9-28 20:21 | 只看该作者
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

请问  LcdWriteCom(0x02);  这条指令是什么作用
回复

使用道具 举报

6#
ID:918467 发表于 2021-9-28 20:23 | 只看该作者
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

不好意思,我还想请问一下  void LCDreturn()  这一段的作用是什么,谢谢啦
回复

使用道具 举报

7#
ID:415064 发表于 2021-9-30 17:54 | 只看该作者
lqh_fairy 发表于 2021-9-28 20:23
不好意思,我还想请问一下  void LCDreturn()  这一段的作用是什么,谢谢啦

感觉是多次初始化 预防初始化失败
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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