发 帖  
[问答] 51单片机如何利用独立按键改变显示在LCD1602上的变量的值?
2018-7-12 21:58:03  291 LCD1602
收藏 0 收藏 推荐 0 推荐
分享
回复本帖可获得 1 分积分奖励! 每人限 1 次
我自己写了一个程序,但是显示只显示了我附加的图的样子,有哪位大神帮我看看我的程序到底哪有问题,感激不尽。main.c
/**************************************************************************************
*                              LCD1602液晶显示实验                                                                                                  *
实现现象:        具体接线操作请参考视频教程
                        下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:                                                                                                                                                                  
***************************************************************************************/

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

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
//定义字符数组显示数字sbit k1=P1^0;
sbit k1=P1^0;
unsigned char code digit[ ]={"0123456789"};
u8 Disp[]="     Tt:25      ";
u8 Disp1[]="     Ts:      ";

void delay(u16 i)
{
        while(i--);        
}
void display(unsigned char add,unsigned int x)
{
     unsigned char i,j;
         i=x/10;
         j=x%10;
         LcdWriteCom(add);
         LcdWriteCom(add);
         LcdWriteData(digit+0x30);
         LcdWriteData(digit[j]+0x30);
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
        u8 y,z;
        unsigned int Ts=35;
        LcdInit();
        LcdWriteCom(0x80);
        for(y=0;y<16;y++)
        {
                LcdWriteData(Disp[y]);        
        }
        while(1);

        LcdInit();
        LcdWriteCom(0x80+0x40);
        for(z=0;z<16;z++)
        {
            LcdWriteData(Disp1[z]);
        }
        while(1);

        while(1)
        {
                if (!k1)
                {
                        delay(1);
                        if(!k1)
                        {
                                while(!k1);
                                Ts++;
                                display(0x80+0x40,Ts);
                        }
                }
        }                        
}
lcd.c
#include "lcd.h"


/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能                   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/


void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                for (b=199;b>0;b--)
                {
                          for(a=1;a>0;a--);
                }      
        }
            
}


/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能                   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时
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;
}
#else
void LcdWriteCom(uchar com)          //写入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //选择写入命令
        LCD1602_RW = 0;         //选择写入


        LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);


        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;


        LCD1602_DATAPINS = com << 4; //发送低四位
        Lcd1602_Delay1ms(1);


        LCD1602_E = 1;         //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能                   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/                   
#ifndef         LCD1602_4PINS                   
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;
}
#else
void LcdWriteData(uchar dat)                        //写入数据
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //选择写入数据
        LCD1602_RW = 0;          //选择写入


        LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
        Lcd1602_Delay1ms(1);


        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;


        LCD1602_DATAPINS = dat << 4; //写入低四位
        Lcd1602_Delay1ms(1);


        LCD1602_E = 1;          //写入时序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能                : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/                   
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //开显示
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //将8位总线转为4位总线
        LcdWriteCom(0x28);         //在四位线下的初始化
        LcdWriteCom(0x0c);  //开显示不显示光标
        LcdWriteCom(0x06);  //写一个指针加1
        LcdWriteCom(0x01);  //清屏
          //设置数据指针起点
}




#endif

IMG_20180712_215316.jpg
已退回2积分
2018-7-12 21:58:03   评论 邀请回答
2个回答

回帖奖励 +1 分积分

你按键是不是修改了你要显示的值的大小,显示时,要重新进行字符生成
2018-7-13 13:45:02 评论

举报

jinyi7016 发表于 2018-7-13 13:45
你按键是不是修改了你要显示的值的大小,显示时,要重新进行字符生成

我应该是设置函数位置没设置好,这个问题我已经解决的差不多了,最后就是数字范围的问题了,想让他显示到50就停下来,但是总是没招,多谢多谢。
2018-7-13 15:29:12 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

提问题
关闭

站长推荐 上一条 /9 下一条

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