找回密码
 立即注册

QQ登录

只需一步,快速开始

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

想用按键来控制LCD1602屏的参数,就是说往屏幕里的某个单元里写入参数,这5个按键....

[复制链接]
跳转到指定楼层
楼主
ID:939423 发表于 2021-7-22 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是89C52的单片机,我还是初级者,刚接触单片机不到半年。求指导。拜托了!!!

改懵逼的LCD1602液晶.7z

18.73 KB, 下载次数: 7

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

使用道具 举报

沙发
ID:123289 发表于 2021-7-22 10:22 | 只看该作者
1、你先设计出一组参数,再给出一个显示的方案。
例如:A决定行,B决定列,C决定……,形成一个协议。
2、根据ABC……进行显示。
3、根据按键修改ABC……的值。
大功造成。
回复

使用道具 举报

板凳
ID:939423 发表于 2021-7-22 11:07 | 只看该作者
yzwzfyz 发表于 2021-7-22 10:22
1、你先设计出一组参数,再给出一个显示的方案。
例如:A决定行,B决定列,C决定……,形成一个协议。
2 ...


#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
------------------------------------------------------------------
sbit k1=P2^4;
sbit k2=P2^5;
sbit k3=P2^6;
sbit beep=P2^4;
sbit k4=P2^7;
------------------------------------------------------------------
------------------------------------------------------------------
u8 Disp[]="0123456789: zns";//z正常,n闹钟,s设置
u8 s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16;
u8 ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,ss9,ss10,ss11,ss12,ss13,ss14,ss15,ss16;
u8 nz1,nz2,nz3,nz4,nz5,nz6,nz7,nz8,nz9,nz10,nz11;
u8 nzz1,nzz2,nzz3,nzz4,nzz5,nzz6;
u8 hw;
u8 msxz,msxz1,zns;//模式选择
u8 kg;//k1继电器
u8 fm;
u8 tsec; //秒
u8 tmin; //分
u8 thour;//时
u16  dat,dat1;
u16  tt1,ssbz,hh,tt2;
/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延迟
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}
//-----------------------------
void  displays()
{
        /*第一行*/
    hh=1;
        LcdInit();          
        LcdWriteData(Disp[ss1]);       
        LcdWriteData(Disp[ss2]);          
        LcdWriteData(Disp[10]);         
        LcdWriteData(Disp[ss4]);       
        LcdWriteData(Disp[ss5]);       
        LcdWriteData(Disp[10]);       
        LcdWriteData(Disp[ss7]);       
        LcdWriteData(Disp[ss8]);       
        LcdWriteData(Disp[11]);
        LcdWriteData(Disp[msxz1]);                       
}
/*******************************************************************************
* 函 数 名         : nzxs
* 函数功能                   : 闹钟显示
*******************************************************************************/
void nzxs()
{
        /*第一行*/
    hh=1;
        LcdInit();          
        LcdWriteData(Disp[nzz1]);       
        LcdWriteData(Disp[nzz2]);          
        LcdWriteData(Disp[10]);         
        LcdWriteData(Disp[nzz3]);       
        LcdWriteData(Disp[nzz4]);       
        LcdWriteData(Disp[10]);       
        LcdWriteData(Disp[nzz5]);       
        LcdWriteData(Disp[nzz6]);       
        LcdWriteData(Disp[11]);
        LcdWriteData(Disp[msxz1]);
}

/*******************************************************************************
* 函 数 名         : key1
* 函数功能                   : 设置,显示光标
*******************************************************************************/

void key1()                //设置,显示光标
{
if(k1==0)
{
  delay(100);
  if(k1==0)
  {
  while(!k1);
   kg++;
  if(kg==3)
  {
   kg=0;
   hw=0;  
  }
   
  }
}
}

/*******************************************************************************
* 函 数 名         : key2
* 函数功能                   : 换位
*******************************************************************************/

void key2()                //换位
{

if(k2==0)
{
  delay(100);
  if(k2==0)
  {
    while(!k2);
    hw++;
  }
  if(hw>=6)
  hw=0;
}
}

/*******************************************************************************
* 函 数 名         : key3
* 函数功能                   : 加数
*******************************************************************************/

void key3()                //加数
{
if(k3==0)
{
  delay(100);
  if(k3==0)
  {
   while(!k3);
   if(kg==2)        //s设置模式
   {
   if(hw==0)
    {
        thour=thour+10;
        if(thour>=24)thour=thour%10;
        }
   if(hw==1)
    {
        thour=thour+1;
        if(thour>=24)thour=0;       
        }
   if(hw==2)
    {
        tmin=tmin+10;
        if(tmin>=60)tmin=0;
        }
   if(hw==3)
    {
    tmin=tmin+1;
        if(tmin>=60)tmin=0;
        }
   if(hw==4)
    {
    tsec=tsec+10;
        if(tsec>=60)tsec=0;
        }
   if(hw==5)
    {
        tsec=tsec+1;
        if(tsec>=60)tsec=0;
        }
   if(hw==6)
    {
         msxz=msxz+1;
         if(msxz>=15)msxz=12;
        }
        }

        }
       
        if(kg==1)//n闹钟模式
   {
   if(hw==0)
    {
        nz1=nz1+1;
        if(nz1>=2)nz1=0;
        }
   if(hw==1)
    {
        nz2=nz2+1;
        if(nz2>=9)nz2=0;       
        }
   if(hw==2)
    {
        nz3=nz3+1;
        if(nz3>=6)nz3=0;
        }
   if(hw==3)
    {
    nz4=nz4+1;
        if(nz4>=9)nz4=0;
        }
   if(hw==4)
    {
    nz5=nz5+1;
        if(nz5>=6)nz5=0;
        }
   if(hw==5)
    {
        nz6=nz6+1;
        if(nz6>=9)nz6=0;
        }
   if(hw==6)
    {
         msxz=msxz+1;
         if(msxz>=15)msxz=12;
        }
        }
  
  }
}
//-----------------------------------------------------------------------------
void Timer0Init()
{
        TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

        TH0=(65535-49751)/256;        //给定时器赋初值,定时50ms
        TL0=(65535-49751)%256;       
        //ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器                       
}

void Timer0() interrupt 1
{
        //static u16 i;
        TH0=(65535-49751)/256;        //给定时器赋初值,定时50ms
        TL0=(65535-49751)%256;
        tt1++;
        if(tt1>=20)
        {
          tt1=0;
          ssbz=~ssbz;
    // tsec++;
        }       
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

        TH1=(65535-49751)/256;        //给定时器赋初值,定时50ms
        TL1=(65535-49751)%256;       
        ET1=1;//打开定时器1中断允许           //2021
        EA=1;//打开总中断
        TR1=1;//打开定时器                       
}
/**************************************************************************************/
void Timer1() interrupt 3
{
        //static u16 i;
        TH1=(65535-49751)/256;        //给定时器赋初值,定时50ms
        TL1=(65535-49751)%256;
        tt2++;
        if(tt2>=20)
        {
        tt2=0;
        tsec++;
        }       
}

void  ssfz()
  {
        if(ssbz==0)
        {
        if(hw==0)
           ss1=11;
        if(hw==1)
           ss2=11;
        if(hw==2)
           ss4=11;
        if(hw==3)
           ss5=11;
        if(hw==4)
           ss7=11;
        if(hw==5)
           ss8=11;
        if(hw==6)
           msxz1=11;               
        }
        else{
             ss1=s1;
                 ss2=s2;
                 ss3=s3;
                 ss4=s4;
                 ss5=s5;
                 ss6=s6;                 
                 ss7=s7;
                 ss8=s8;

            }                       
  }
void  ssfz1()
  {
        if(ssbz==0)
        {
        if(hw==0)
           nzz1=11;
        if(hw==1)
           nzz2=11;
        if(hw==2)
           nzz3=11;
        if(hw==3)
           nzz4=11;
        if(hw==4)
           nzz5=11;
        if(hw==5)
          nzz6=11;               
        }
        else{
          nzz1=nz1;
          nzz2=nz2;
          nzz3=nz3;
          nzz4=nz4;
          nzz5=nz5;
          nzz6=nz6;

            }                       
  }
/*-------------------------------------------------------------------------------*/
void clockdisplay()
{
  if(tsec>=60)
  {
  tsec=0;
  tmin++;
  }
  if(tmin>=60)
  {
  tmin=0;
  thour++;
  }
  if(thour>=24)
  {
   thour=0;
  }
  s7=(tsec)/10;
  s8=(tsec)%10;
  s4=(tmin)/10;
  s5=(tmin)%10;
  s1=(thour)/10;
  s2=(thour)%10;
}


      
/*******************************************************************************
* 函 数 名         : fmkg
* 函数功能                   : 蜂鸣继电器
*******************************************************************************/
void fmkg()
{
if(fm==1)
{
  beep=~beep;
  delay(10);
}
if(k4==0)
{
  delay(100);
  {
  while(!k4);
   if(k4==0)
   fm++;
   if(fm==2)fm=0;  
  }
}
}
   
/*******************************************************************************
* 函 数 名         : bee
* 函数功能                   : 蜂鸣判断程序
*******************************************************************************/  
void bee()
{
if(ss1==nz1)
{
  if(ss2==nz2)
  {          
   if(ss4==nz3)
   {
    if(ss5==nz4)
        {
         if(ss7==nz5)
         {
          if(ss8==nz6)
          {
       fm++;
          }
     }
    }
   }
  }
}
}  
/*******************************************************************************
* 函 数 名         : fmkg
* 函数功能                   : 蜂鸣继电器
*******************************************************************************/
/*
void fmkg()
{
if(fm==1)
{
  beep=~beep;
  delay(10);
}
if(k4==0)
{
  delay(100);
  {
  while(!k4);
   if(k4==0)
   fm++;
   if(fm==2)fm=0;  
  }
}
} */  
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主程序
*******************************************************************************/
void main(void)
{
kg=0;
fm=0;
Timer0Init();
Timer1Init();
ssbz=0;
ET0=1;
while(1)
{ //displays();
/*  bee();                   /////////////
if(fm==1)
{
  beep=~beep;
  delay(10);
}
if(fm>=2)fm=0;
  
if(k4==0)
{
  delay(100);
  {
   if(k4==0)fm++;
   delay(100);
  }
}
  // fmkg();       
  
        msxz1=zns;
    key1();
        if(kg==1)
        {
          msxz=13;
          msxz1=msxz;
          ssfz1();
          nzxs();

      key2();       
      key3();
     
          ET0=1;
          ET1=1;
          nzz1=nz1;
          nzz2=nz2;
          nzz3=nz3;
          nzz4=nz4;
          nzz5=nz5;
          nzz6=nz6;
        }
        if(kg==2)
        {
         msxz=14;
         msxz1=msxz;
         clockdisplay();
          ssfz();
         displays();         
      key2();       
      key3();
     // ssfz();
          ET0=1;
          ET1=0;
          ss1=s1;
                 ss2=s2;
                 ss3=s3;
                 ss4=s4;
                 ss5=s5;
                 ss6=s6;
                 ss7=s7;
                 ss8=s8;       
        } */
//        if(kg==0)
        {
         msxz=12;
         msxz1=msxz;
         clockdisplay();
         displays();
          ET0=0;
         // ET1=1;
             ss1=s1;
                 ss2=s2;
                 ss3=s3;
                 ss4=s4;
                 ss5=s5;
                 ss6=s6;
                 ss7=s7;
                 ss8=s8;       
        }
   //displays();
   
}
                                       
}
这是我刚才修改的,但是这个只能显示一行时钟,不知道哪里出问题了
回复

使用道具 举报

地板
ID:939710 发表于 2021-7-22 11:17 | 只看该作者
总共就16*2  32个字符。。怎么整也能整明白吧
回复

使用道具 举报

5#
ID:939423 发表于 2021-7-22 17:02 | 只看该作者
lishengaha 发表于 2021-7-22 11:17
总共就16*2  32个字符。。怎么整也能整明白吧

能,但是我想让屏幕的第二行显示年月日,怎么实现?
回复

使用道具 举报

6#
ID:161164 发表于 2021-7-22 17:36 | 只看该作者
lhpsnd 发表于 2021-7-22 17:02
能,但是我想让屏幕的第二行显示年月日,怎么实现?

标题不要写得太长,后面都被省略了

你用了LcdInit(); 来清屏,所以永远由第一行开始
打开lcd.h,尝试了解一下每句代码的含义
百度一下LCD1602的命令,找出第二行第一位的地址

评分

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

查看全部评分

回复

使用道具 举报

7#
ID:939423 发表于 2021-7-23 10:04 | 只看该作者
lkc8210 发表于 2021-7-22 17:36
标题不要写得太长,后面都被省略了

你用了LcdInit(); 来清屏,所以永远由第一行开始

感谢,我慢慢弄吧,对于一个初级者来说有点难呀!不太好理解。
回复

使用道具 举报

8#
ID:955647 发表于 2021-7-28 21:14 | 只看该作者
例如本程序,将eeprom滑动变阻器阻值读出通过k3键确认输入lcd1602
#include<reg52.h>         
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar key[]="7777";  //初始密码
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}

sbit DOUT = P3^7;          
sbit CLK  = P3^6;          
sbit DIN  = P3^4;          
sbit CS   = P3^5;         //eeprom定义
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit key1=P3^1;
sbit key2=P3^0;
sbit key3=P3^2;
uchar code table[]="012345789";
uint bai,num,keynum1,d1,d2,d3,d4;
void delay(uint i)
{
        while(i--);       
}

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void SPI_Write(uchar dat)
{
        uchar i;
        CLK = 0;
        for(i=0; i<8; i++)
        {
                DIN = dat >> 7;         
                dat <<= 1;
                CLK = 0;                       
                CLK = 1;
        }
}
uint SPI_Read(void)
{
        uint i, dat=0;
        CLK = 0;
        for(i=0; i<12; i++)               
        {
                dat <<= 1;
                CLK = 1;
                CLK = 0;
                dat |= DOUT;
        }
        return dat;       
}
uint Read_AD_Data(uchar cmd)
{
        uchar i;
        uint AD_Value;
        CLK = 0;
        CS  = 0;
        SPI_Write(cmd);
        for(i=6; i>0; i--);        
        CLK = 1;         
        _nop_();
        _nop_();
        CLK = 0;
        _nop_();
        _nop_();
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;       
}
void write_com(uint com)
{
        lcdrs=0;
        P0=com;
        lcden=0;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}
void write_date(uint date)
{
        lcdrs=1;
        P0=date;
        lcden=0;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}
void init_lcd()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);
        write_com(0x0c);       
        write_com(0x06);
        write_com(0x01);
}
void datapros()
{
        uint temp;
        static uchar i;
        if(i==10)
        {
                i=0;
                temp = Read_AD_Data(0x94);       
        }
        i++;
}
void display()
{
        uint temp;
        bai=temp%1000/100;
         write_com(0x80);
         write_date(table[bai]);
}
void compare()
{
        if(d1==key[0]&&d2==key[1]&&d3==key[2]&&d4==key[3])
        {
                write_com(0x80+4);
                write_date('1');
         }
else
        {
                write_com(0x80+5);
                write_date('0');
        }
}
void keypro()
{
       
       
        if(key2==0)
        {
                delayms(5);
                if(key2==0)
                {
                        compare();
                }
                while(!key2);
        }
        if(key3==0)
        {
                delayms(5);
                if(key3==0)
                {
                        keynum1++;
                        while(!key3);
                        if(keynum1==1)
                        {
                         write_com(0x80+0x40);
                         write_date(table[bai]);
                                d1=table[bai];
                               
                        }
                                if(keynum1==2)
                        {
                                write_com(0x80+0x40+1);
                           write_date(table[bai]);
                                d2=table[bai];
                        }
                       
                        if(keynum1==3)
                        {
                                write_com(0x80+0x40+2);
                           write_date(table[bai]);
                                d3=table[bai];
                        }
                       
                        if(keynum1==4)
                        {
                                write_com(0x80+0x40+3);
                           write_date(table[bai]);
                                d4=table[bai];
                        }               
                }
        }
}       
void main()
{       
        init_lcd();
        while(1)
        {
                keypro();
                datapros();
                display();
        }               
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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