找回密码
 立即注册

QQ登录

只需一步,快速开始

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

c52单片机的1602液晶屏只显示第一排的黑格子 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:660739 发表于 2019-12-23 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做的矩阵键盘输入,LCD屏幕显示,可以实现9999以内简单的四则运算,
把程序烧进去后LCD1602却只显示一排黑色方块,求大神来看看是哪里出了问题。
程序如下

//利用51单片机控制LCD1602,实现加减乘除运算
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define DATE_IO P0//P0口并行传输数据(LCD1602的数据端接P0口)
sbit RS=P1^0;//LCD1602寄存器选择端
sbit E=P1^2; //使能信号端
sbit RW=P1^1;//读写控制端
sbit deng=P1^3;//结果
sbit shuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)
sbit shuzi22=P3^7; //后面的数字加1
sbit jia=P3^3;//加号
sbit jian=P3^4;//减号
sbit cheng=P3^5;//乘号
sbit chu=P3^6;//除号

uint countqian=0,counthou=0;//数值
uchar qian,bai,shi,ge,a=0;

uchar code table1[]="0123456789";
uchar code table2[]="+-*/";

//**********************延时函数*****************************************
void delay_us(unsigned int n)
  {
        if(n==0)
           return ;           
        while(--n);
  }

void delay_ms(uint i)
{
         unsigned char a,b;
         for (a=1;a<i;a++)
                 for(b=1;b;b++);            
}

void delay(uint z)
{        
   uint x,y;
   for(x=110;x>0;x--)        
                for(y=z;y>0;y--);
}
//***********************************************************************

//*********************控制LCD1602的函数*******************************
void write_command(uchar come)//写指令函数
{
        RS=0;//选择指令寄存器
        E=1;//由高电平跳变成低电平时,液晶执行命令
        DATE_IO=come;
        delay_us(5);
        E=0;        
        RS=1;
}

void write_date(uchar date)//写数据函数
{        
  RS=1;//选择数据寄存器        
  E=1;//由高电平跳变成低电平时,液晶执行命令        
  DATE_IO=date;        
  delay_us(5);
  E=0;
  RS=0;
}
//********************************************************************************

//**************************液晶初始化函数(基本上就是这个模式)*******************
void init()//液晶初始化函数
{        
RW=0;//低电平时进行写操作(高电平时进行读操作)
E=0;
write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输
delay_ms(5);
write_command(0x01);//清除屏幕显示
delay_ms(5);
write_command(0x06);//设定输入方式,增量不移位
delay_ms(5);
write_command(0x0c);//开整体显示,关光标,不闪烁
delay_ms(5);
}
//**********************************************************************************

void jiayiqian()//前边数字加1计数函数
{
  if(shuzi11==0)//如果前面加1的按键按下
  {
        delay(50);//消除抖动
    countqian=countqian+1;
  }
  if(countqian==999)//记到999归0
        countqian=0;
}

void jiayihou()//后边数字加1计数函数
{
  if(shuzi22==0)//如果后面加1的按键按下
  {
        delay(50);//消除抖动
    counthou=counthou+1;
  }
  if(counthou==999)//记到999归0
        counthou=0;
}

void fuhao()//+,-,*,/运算号
{
  if(jia==0)//如果加号按下
  {
    while(!jia);//等待按键的释放
    write_date(table2[0]);//显示'+'
        a=1;//加号按下的标志
  }
   if(jian==0)//如果减号按下
   {
     while(!jian);//等待按键的释放
     write_date(table2[1]);//显示'-'
         a=2;//减号按下的标志
   }
   if(cheng==0)//如果乘号按下
   {
    while(!cheng);//等待按键的释放
   write_date(table2[2]);//显示'*'
   a=3;        //乘号按下的标志
   }
   if(chu==0)////如果除号按下
   {
     while(!chu);//等待按键的释放
    write_date(table2[3]);//显示'/'
        a=4;//除号按下的标志
  }
}

void chaiqian()//将前边各位数字拆开函数
{
  bai=countqian/100;//求百位数字
  shi=countqian%100/10;//求十位数字
  ge=countqian%10;//求各位数字
}

void chaihou()//将后边各位数字拆开函数
{
  bai=counthou/100;//求百位数字
  shi=counthou%100/10;//求十位数字
  ge=counthou%10;//求各位数字
}

void chaijiejia()//将相加结果各位数字拆开函数
{
  qian=(countqian+counthou)/1000;//求千位数字
  bai=(countqian+counthou)%1000/100;//求百位数字
  shi=(countqian+counthou)%100/10;//求十位数字
  ge=(countqian+counthou)%10;//求各位数字
}

void chaijiejian()//将相减结果各位数字拆开函数
{
  qian=(countqian-counthou)/1000;//求千位数字
  bai=(countqian-counthou)%1000/100;//求百位数字
  shi=(countqian-counthou)%100/10;//求十位数字
  ge=(countqian-counthou)%10;//求各位数字
}

void chaijiecheng()//将相乘结果各位数字拆开函数
{
  qian=(countqian*counthou)/1000;//求千位数字
  bai=(countqian*counthou)%1000/100;//求百位数字
  shi=(countqian*counthou)%100/10;//求十位数字
  ge=(countqian*counthou)%10;//求各位数字
}

void chaijiechu()//将相除结果各位数字拆开函数(只取了模值)
{
  qian=(countqian/counthou)/1000;//求千位数字
  bai=(countqian/counthou)%1000/100;//求百位数字
  shi=(countqian/counthou)%100/10;//求十位数字
  ge=(countqian/counthou)%10;//求各位数字
}

void xianshiqian()//显示前边数字
{
  write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
  write_date(table1[bai]);//第一位显示百位
  write_date(table1[shi]); //第二位显示十位
  write_date(table1[ge]); //第三位显示个位
  fuhao();//显示运算号
  delay(50);//改变数值可以修改数字滚动的速度
}

void xianshihou()//显示后边数字
{
  write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
  write_date(table1[bai]);//第一位显示百位
  write_date(table1[shi]); //第二位显示十位
  write_date(table1[ge]); //第三位显示个位
  //delay(50);//改变数值可以修改数字滚动的速度
}

void xianshijie()//显示结果
{
  write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
  write_date(table1[qian]);//第一位显示千位
  write_date(table1[bai]);//第二位显示百位
  write_date(table1[shi]); //第三位显示十位
  write_date(table1[ge]); //第四位显示个位
  //delay(50);//改变数值可以修改数字滚动的速度
}

void main()//主函数
{
  init();//调用液晶初始化函数        
  while(1)
          {
            jiayiqian();//调用前边数字加1计数函数
                chaiqian();//调用将前边数字各位数字拆开函数
            xianshiqian();//显示前边数字
                jiayihou();//调用后边数字加1计数函数
                chaihou();//调用将后边数字各位数字拆开函数
            xianshihou();//显示后边数字
                if(deng==0)//控制显示结果的按键按下
                {
                 if(a==1)//计算的是加法
                 {
                 chaijiejia();//将结果的各位数字拆分开
                 xianshijie(); //显示结果
                 }
                 if(a==2)//计算的是减法
                 {
                 chaijiejian(); //将结果的各位数字拆分开
                 xianshijie();//显示结果
                 }
                 if(a==3)//计算的是乘法
                 {
                 chaijiecheng();//将结果的各位数字拆分开
                 xianshijie(); //显示结果
                 }
                 if(a==4) //计算的是除法
                 {
                 chaijiechu();//将结果的各位数字拆分开
                 xianshijie(); //显示结果
                 }
                }
          }                          
}

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

使用道具 举报

沙发
ID:23606 发表于 2019-12-24 09:02 | 只看该作者
简化程序,从显示一个字符去排查
回复

使用道具 举报

板凳
ID:356963 发表于 2019-12-24 10:21 | 只看该作者
对比调节了吗
回复

使用道具 举报

地板
ID:395068 发表于 2019-12-26 16:10 | 只看该作者
你直接贴这么大一段,谁有耐心去看。显示黑格子,一般是读写时序有问题,主要检查时序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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