标题: 1602数字显示 [打印本页]

作者: 老蒋家的木头    时间: 2017-7-15 09:43
标题: 1602数字显示
用1602显示一个可变的数字,初始为0,K1按下时数字加1,K2按下时数字减1

作者: 18871101234    时间: 2017-7-15 15:34
这可以通过改变1602的写入数据来实现,按键按下时,数据加一,再将新的数据放入1602写入数据里就可以了
作者: HC6800-ES-V2.0    时间: 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, 下载次数: 91)

1.jpg

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

2.jpg

作者: 老蒋家的木头    时间: 2017-7-17 09:12
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

拜谢大神,那要是按完k1按k2数字加一,然后按完k2按k1数字减一要怎么改
作者: lqh_fairy    时间: 2021-9-28 20:21
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

请问  LcdWriteCom(0x02);  这条指令是什么作用
作者: lqh_fairy    时间: 2021-9-28 20:23
HC6800-ES-V2.0 发表于 2017-7-16 10:32
按照你的要求,我写了一个程序:
#include       

不好意思,我还想请问一下  void LCDreturn()  这一段的作用是什么,谢谢啦
作者: wojiaoguogai    时间: 2021-9-30 17:54
lqh_fairy 发表于 2021-9-28 20:23
不好意思,我还想请问一下  void LCDreturn()  这一段的作用是什么,谢谢啦

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1