回帖奖励 1 分积分 回复本帖可获得 1 分积分奖励! 每人限 1 次

[问答] 51单片机如何利用独立按键改变显示在LCD1602上的变量的值?

[复制链接]

实习生

发表于 6 天前   146 查看 2 回复 显示全部楼层 倒序浏览
分享
我自己写了一个程序,但是显示只显示了我附加的图的样子,有哪位大神帮我看看我的程序到底哪有问题,感激不尽。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积分
标签:LCD1602

试用达人

发表于 5 天前  

回帖奖励 +1 分积分

你按键是不是修改了你要显示的值的大小,显示时,要重新进行字符生成
回复

点赞 举报

实习生

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

我应该是设置函数位置没设置好,这个问题我已经解决的差不多了,最后就是数字范围的问题了,想让他显示到50就停下来,但是总是没招,多谢多谢。
回复

点赞 举报

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

关闭

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

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区