找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4141|回复: 12
收起左侧

单片机程序做好以后仿真也可以,但是下载到开发板以后lcd第二行不亮,没有反应!

[复制链接]
ID:560111 发表于 2019-6-17 22:51 | 显示全部楼层 |阅读模式
LCD1602A第一行显示信息加学号滚动显示,第二行显示倒计时40s,晶振11.0952MHz,程序似乎是没什么问题,proteus仿真也是好的,但是我下载到开发板以后就只有第一行的滚动显示,而没有第二行的倒计时,为什么啊?用的是YL-51单片机,请大家看看我的程序和仿真图。我是新手,好多地方都不太懂,求指教!
5Y@N1_16VKT{LAN{CHI)YEC.png
单片机源程序如下:
#include <REGX51.H>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^4;
unsigned char i,q=0,w=0,e=0,x=0,c=40;
unsigned char xuehao1[]="LGL1605230139";
unsigned char xuehao2[]="ZCY1605230140";
unsigned char xuehao3[]="SGJ1605230126";
unsigned char xuehao4[]="XWQ1605230124";
unsigned char code num[]={0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};

void delay(int n)
{
int j,k;
for(k=0;k<n;k++)
{
  for(j=0;j<200;j++);
}
}
void timer0()
{
TMOD=0X01;
TH0=(65536-9216)/256;
TL0=(65536-9216)%256;
EA=1;
ET0=1;
TR0=1;
}
void LCD1602_write_cmd(unsigned char cmd)
{
P0=cmd;
RS=0;
RW=0;
EN=1;
EN=0;
delay(10);

}
void LCD1602_write_Data(unsigned char Data)
{
P0=Data;
RS=1;
RW=0;
EN=1;
EN=0;
delay(10);

}
void LCD1602_init()
{
    LCD1602_write_cmd(0x38);
    LCD1602_write_cmd(0x0C);
    LCD1602_write_cmd(0x06);
    LCD1602_write_cmd(0x01);
}
void disp_LCD(uint c)
{
   LCD1602_write_cmd(0xC0);
   LCD1602_write_Data(num[c/10]);
   LCD1602_write_cmd(0XC1);
   LCD1602_write_Data(num[c%10]);
}
void disp_XXLCD()
{
  LCD1602_write_cmd(0X80);
  for(w=e;w<13+e;w++)

{

   LCD1602_write_Data(xuehao1[w]);

}

      e++;
          if(e>=45)

   {

         e=0;

         delay(200);

        }

      delay(60);
          }
void main()
{
  timer0();
  LCD1602_init();
  while(1)
{
   disp_XXLCD();
   disp_LCD(c);
   if(c==0)
   while(1);  
}
}
void timer() interrupt 1
{
TH0=(65536-9216)/256;
TL0=(65536-9216)%256;
x++;
if(x==100)
{
  x=0;
  c--;
}
}

这个是我的程序,另外我的这个设计,倒计时的时候好像因为前面的显示程序需要的时间太长,后边的倒计时不是一秒,而是一秒多,这个问题该怎么解决呢?最重要的是怎么解决开发板第二行不显示的问题
IMG_20190617_223929.jpg
IMG_20190617_223940.jpg
回复

使用道具 举报

ID:123289 发表于 2019-6-18 08:13 | 显示全部楼层
先设法证明第二行全部是OK的。例如:显示一行完整的信息。然后再找自己的原因。
回复

使用道具 举报

ID:332444 发表于 2019-6-18 09:16 | 显示全部楼层
void main()
{
   timer0();
   LCD1602_init();
   while(1)
{
    disp_XXLCD();
    disp_LCD(c);
    if(c==0)
    while(1);  //**************到此死循环了
}
}
回复

使用道具 举报

ID:560111 发表于 2019-6-18 09:50 | 显示全部楼层
yzwzfyz 发表于 2019-6-18 08:13
先设法证明第二行全部是OK的。例如:显示一行完整的信息。然后再找自己的原因。

我试了一下把前面的信息显示关掉,让它在第二行只显示一个1,可是开发板上的第二行还是没反应,背光都不亮.这是怎么回事啊,在proteus里头都是好着的啊
回复

使用道具 举报

ID:560111 发表于 2019-6-18 10:28 | 显示全部楼层
xianfajushi 发表于 2019-6-18 09:16
void main()
{
   timer0();

这个是倒计时完毕就让它停止了啊
回复

使用道具 举报

ID:332444 发表于 2019-6-18 13:10 | 显示全部楼层
检查液晶显示器引脚是否存在接触问题,或拿别处试看是否正常
程序也一样在别的板子上试看
把第一行改发第二行察看液晶是否有问题
回复

使用道具 举报

ID:842806 发表于 2020-11-12 21:19 | 显示全部楼层
是程序的问题,你可能有个时候把输入数据中的“”RS”和“RW”同时改成了0,也就是输入数据变成了输入指令
回复

使用道具 举报

ID:88256 发表于 2020-11-12 23:46 | 显示全部楼层
对C语言不熟悉,num是强制类型转换的?把 disp_LCD 函数改成下面看看效果
void disp_LCD(uint c)
{
   LCD1602_write_cmd(0xC0);
   LCD1602_write_Data(0X30+c/10);
   LCD1602_write_cmd(0XC1);
   LCD1602_write_Data(0X30+c%10);
}
回复

使用道具 举报

ID:314908 发表于 2020-11-13 20:45 | 显示全部楼层
#include <REGX51.H>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char

sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
#define Port  P2

unsigned char i,q=0,w=0,e=0,x=0,c=41;
unsigned char xuehao1[]="LGL1605230139   ";
unsigned char xuehao2[]="ZCY1605230140   ";
unsigned char xuehao3[]="SGJ1605230126   ";
unsigned char xuehao4[]="                ";
unsigned char code num[]="0123456789";

uchar flag=0;

void delay(int n)

回复

使用道具 举报

ID:314908 发表于 2020-11-13 20:49 | 显示全部楼层
        在初始化1602里加入
RW=0;        ///////////新加入的两条
        EN=0;  ////////////// 新加入的两条
即可显示两行
去掉就只显示一行了
回复

使用道具 举报

ID:314908 发表于 2020-11-13 21:03 | 显示全部楼层
修改后的显示
IMG_20201113_205340.jpg
回复

使用道具 举报

ID:314908 发表于 2020-11-13 21:08 | 显示全部楼层
1秒不准,是因为你的延时函数延时太长,没正在利用定时器
回复

使用道具 举报

ID:314908 发表于 2020-11-13 21:30 | 显示全部楼层
没正确利用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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