找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3094|回复: 14
收起左侧

单片机液晶传送P0口改为P1口,改完不显示?

[复制链接]
ID:763540 发表于 2020-6-20 19:23 | 显示全部楼层 |阅读模式
只改了 P0=com;//送入数据,P0=dat;//送入数据    改完不显示,初学,请哥哥们指教?
[code]#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int     
sbit RW=P2^6;//定义LCD1602液晶显示器读写端         
sbit RS=P2^5;//定义LCD1602液晶显示器数据命令端
sbit EN=P2^7;//定义LCD1602液晶显示器使能端
sbit qiting=P3^0;//定义启停按键
uchar qitingnum;//定义启停次数变量
uint count;//定时器0定时中断次数变量
unsigned long speed=0;//定义速度变量
uchar code tab1[]={"RPM:"};//显示转速的固定大写字符
uchar code tab2[]={"rpm/sec"};//显示转速的固定小写字符
/**ms级延时子程序**/
  void delay(uint x)
{
   uint i,j;                       
   for(i=0;i<x;i++)     
    for(j=0;j<110;j++);
  }
/********液晶写入指令函数与写入数据函数**************/
  void write_1602com(uchar com)//****液晶写入指令函数****
{
   RS=0;//数据/指令选择置为指令
   P0=com;//送入数据   *******************************这个我改成了P1
   delay(1);
   EN=1;//拉高使能端,为制造有效的下降沿做准备。
   delay(1);
   EN=0;//en由高变低,产生下降沿,液晶执行命令。
  }
  void write_1602dat(uchar dat)//液晶写入数据函数
{
   RS=1;//数据/指令选择置为数据
   P0=dat;//送入数据  *******************************这个我改成了P1
   delay(1);
   EN=1; //en置高电平,为制造下降沿做准备。
   delay(1);
   EN=0; //en由高变低,产生下降沿,液晶执行命。
  }
  void lcd1602_init()//液晶初始化函数
{
   uchar a;
   RW=0;
   write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据。
   write_1602com(0x0c);//开显示不显示光标
   write_1602com(0x06);//整屏不移动,光标自动右移。
   write_1602com(0x01);//清显示        
   write_1602com(0x80);//显示固定符号从第一行第0个(从第0个开始数)位置开始显示
   for(a=0;a<4;a++)
{
    write_1602dat(tab1[a]);//向液晶屏写固定符号部分
   }
   write_1602com(0x80+9);//显示固定符号写入位置,从第一行第9个(从第0个开始数)位置开始显示。
   for(a=0;a<8;a++)
{
    write_1602dat(tab2[a]);//写显示固定符号
   }
}
/*************转速显示函数**********/  
  void display(unsigned long speed)//转速显示函数
{
   if(speed<=99999)
{
    uchar wan,qian,bai,shi,ge;//定义拆字变量
    wan=speed/10000;//转速/10000得到万位
    qian=speed%10000/1000;//转速/10000的余数/1000得到千位
    bai=speed%1000/100;//取得百位
    shi=speed%100/10;//取得十位数字
    ge=speed%10;//取得个位数字
    write_1602com(0x80+4);//从第一行第4个(从第0个开始数)位置开始显示
    if(wan==0)//万位为0时
  {
     write_1602dat(' ');//显示空格
    }
    else//万位不为0时
  {
     write_1602dat(0x30+wan);//显示万位的数据,+0x30是因为在液晶的字库中,0的地址是0x30,1的地址是0x31,以此类推。
    }
    if((wan+qian)==0)//万位和千位都为0时
  {
     write_1602dat(' ');//千位显示空格
    }
    else//万位和千位不都为0时
  {
     write_1602dat(0x30+qian);//显示千位数据
    }

    if((wan+qian+bai)==0)//万位、千位和百位都是0时
  {
     write_1602dat(' ');//显示空格
    }
    else//万位、千位和百位不都为0时
  {
     write_1602dat(0x30+bai);//显示百位数据
    }
    if((wan+qian+bai+shi)==0)//万位、千位、百位和十位都为0时
  {
     write_1602dat(' ');//显示空格
    }
    else//万位、千位、百位和十位不都为0时
  {
     write_1602dat(0x30+shi);//显示十位数据
    }               
    write_1602dat(0x30+ge);//显示个位数据,数字+0x30得到该数字的LCD1602显示码。
  }
}
/**************按键扫描函数*****************/  
  void keyscan()//按键扫描函数
{
   if(qiting==0)//判断启停键是否按下
{
    delay(5);
    if(qiting==0)//判断启停键是否再次按下
  {
     qitingnum++;//启停次数变量加加
     lcd1602_init();//LCD1602液晶显示器初始化函数
     while(!qiting);//等待启停键松开
   }
  }
   if(qitingnum==1)//判断启停次数变量是否为1
{
    display(speed);//显示速度函数
  }
   if(qitingnum==2)//判断启停次数变量是否为2
{
    write_1602com(0x08);//关LCD1602液晶显示器显示
    qitingnum=0;//启停次数变量置0
   }
}
/**********定时器0、计数器1初始化子程序*********/
  void Time0_Time1_init()
{
   TMOD=0X51;//模式选定时器0、计数器1,工作方式选定时器0定时模式1、计数器1计数模式1。
   TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
   TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
   TH1=0;//计数器1高8位计数初值为0
   TL1=0;//计数器1低8位计数初值为0
   EA=1;//打开总中断
   ET0=1;//打开定时器0的中断
   TR0=1;//打开定时器0
   ET1=1;//打开计数器1的中断
   TR1=1;//打开计数器1
}
/************主函数***************/  
  void main()//主函数
{
   Time0_Time1_init();//定时器0与外部中断0初始化子程序
   while(1)//固定循环
{  
    keyscan();
  }
}
/**定时器0中断服务子程序**/                                      
  void Timer0() interrupt 1
{
   TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
   TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒
   count++;//定时器0定时中断次数变量加加
   if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。
{
    count=0;//定时器0定时中断次数变量清0
    TR1=0;//关计数器1,开始统计1秒钟内,霍尔元件发送的脉冲个数。
    speed=TH1*256+TL1;//表示计数器1计数霍尔元件发送的脉冲个数,即转速:转/秒。
    TH1=0;//计数器1高8位计数清0,为了下一次计数。
    TL1=0;//计数器1低8位计数0,为了下一次计数。
    TR1=1;//开计数器1,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。
   }
}[/code]
回复

使用道具 举报

ID:155507 发表于 2020-6-20 23:12 | 显示全部楼层
这个要看你的硬件电路了,你的电路改了吗?
回复

使用道具 举报

ID:763540 发表于 2020-6-21 09:42 | 显示全部楼层
angmall 发表于 2020-6-20 23:12
这个要看你的硬件电路了,你的电路改了吗?

硬件改过了,液晶D0-D7接口从P0已改至P1
回复

使用道具 举报

ID:590038 发表于 2020-6-21 10:21 | 显示全部楼层
P1改回P0查看是否正常;
回复

使用道具 举报

ID:213173 发表于 2020-6-21 10:21 | 显示全部楼层
wangzhenongyao 发表于 2020-6-21 09:42
硬件改过了,液晶D0-D7接口从P0已改至P1

从道理上来讲不会发生楼主所述现象,仔细检查硬件电路,看看P1除了接液晶屏D0-D7外有没有接其它电路。还不行在P1加上拉电阻试试。
回复

使用道具 举报

ID:763540 发表于 2020-6-21 12:41 | 显示全部楼层
guocheng1144 发表于 2020-6-21 10:21
P1改回P0查看是否正常;

谢谢您
回复

使用道具 举报

ID:763540 发表于 2020-6-21 12:41 | 显示全部楼层
wulin 发表于 2020-6-21 10:21
从道理上来讲不会发生楼主所述现象,仔细检查硬件电路,看看P1除了接液晶屏D0-D7外有没有接其它电路。还 ...

谢谢您
回复

使用道具 举报

ID:743654 发表于 2020-6-21 14:26 | 显示全部楼层
硬件图发上来看看
回复

使用道具 举报

ID:763540 发表于 2020-6-21 17:54 | 显示全部楼层
cheney03 发表于 2020-6-21 14:26
硬件图发上来看看

C:\Users\Administrator\Desktop\211731dzszwjai4io44ipp.png
回复

使用道具 举报

ID:763540 发表于 2020-6-21 18:07 | 显示全部楼层
cheney03 发表于 2020-6-21 14:26
硬件图发上来看看

C:\Users\Administrator\Desktop\05944c9080d8f77b2f7467f4cdcd280.jpg
回复

使用道具 举报

ID:763540 发表于 2020-6-21 19:51 | 显示全部楼层
硬件连接图及试验现象
05944c9080d8f77b2f7467f4cdcd280.jpg
211731dzszwjai4io44ipp.png
回复

使用道具 举报

ID:420836 发表于 2020-6-21 23:13 | 显示全部楼层
试试删除其他功能,仅测试LCD部分。
回复

使用道具 举报

ID:584814 发表于 2020-6-24 06:46 | 显示全部楼层
如果P0能正常工作而P1不行,建议查P1的上拉电阻是否有,或P1上是否有其他东东。
这个程序写法比较原始,数据占8个口必须独占的,图上看你的1602初始化都没能过。
如果端口紧张可以用四线程序(网上多不需加任何硬件改动且通用),最少用4+2个口就可以驱动1602显示,而且可以做到用任意6个加过上拉的I/O口都可以驱动任意1602。当然硬件改动还可以减少占口,除加IIC转换( PCF8574只要用2个口可拟出8个口用掉6个还余2个可驱动任意1602,模块某宝上2元左右已多用了1个口控制背光还余1个口可用)外其他可实验不推荐应用。
回复

使用道具 举报

ID:763540 发表于 2020-6-24 11:46 | 显示全部楼层
man1234567 发表于 2020-6-24 06:46
如果P0能正常工作而P1不行,建议查P1的上拉电阻是否有,或P1上是否有其他东东。
这个程序写法比较原始,数 ...

谢谢您!
我用该程序加载到学习板上就可以正常显示。加载到最小系统板上就不行:P1端口不行,P0端口外加上拉电阻也不行,P0/P1现象都一样,杜邦线顺序检查了很多遍,用表也测了,排除了顺序接错、接触不良的现象,还是不行,这个问题已经纠结了好几天了!
回复

使用道具 举报

ID:763540 发表于 2020-6-24 12:35 | 显示全部楼层
感谢大家!
感谢大家!
问题已经解决了,RS和RW接反了!这么低级的错误,折腾了几天,谢谢各位师傅的指点!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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