微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助!帮忙 看看这个程序

求助!帮忙 看看这个程序

时间:10-02 整理:3721RD 点击:


上面二极管是红外对管,绿色是发射管,蓝色是接受管,实现功能是通过挡住不同的红外对管,在LCD上显示对应的10进制数,求大神帮忙看看下面程序的问题,谢谢!
#include<reg51.h>
#include<intrins.h> //包含_nop_()函数 //定义变量
sbit RS=P2^1; //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
sbit RW=P2^2; //RW为读写信号线,1=读操作,0=写操作。
//当RS=RW=0可以写入指令或者显示地址,
//当RS=0,RW=1可以读取信号
//当RS=1,RW=0可以写入数据
sbit EN=P2^3; //当en端由高电平跳变成低电平时,液晶模块执行命令。
sbit busy=P2^7; //忙指令
sbit ck=P3^7; //LED开关
sbit bizz=P2^0; //蜂鸣器 #define ComDat P2 //命令或数据线
bit ready; //读卡完成标志位
unsigned char code strl[]={"0123456789"}; //字符表
unsigned char card; //读卡数据
unsigned char c1,c2,c3,c4,c5,c6; //显示缓存
//----延时----
dly(unsigned int t)
{while(t--);
}
//判断液晶显示器是否忙
delay ()
{ unsigned char bz;
// busy=1;
// P2=0xff;
ComDat=(ComDat&0x0f)|0xf0;
do
{EN=0;
RS=0;
RW=1;_nop_();
EN=1;_nop_();_nop_();bz=busy;
EN=0;_nop_();_nop_();
EN=1;_nop_();_nop_();
EN=0;//_nop_();_nop_();
}
while(bz); // busy为高电平表示忙,循环等待
}
//----写命令---
WriComm(unsigned char zling) {
RS=0;RW=0;
ComDat=(ComDat&0x0f)|(zling&0xf0); //高四位
EN=1;zling=zling<<4; //低四位移到高四位
EN=0;
ComDat=(ComDat&0x0f)|(zling&0xf0); //高四位
EN=1;_nop_();_nop_();EN=0;
delay(); //等待读忙标志
}
//-----写数据----
WriData(unsigned char dat)
{
RS=1;RW=0;_nop_(); //准备写入数据
ComDat=(ComDat&0x0f)|(dat&0xf0); //高四位
EN=1;dat=dat<<4;//低四位移到高四位
EN=0;
ComDat=(ComDat&0x0f)|(dat&0xf0); //高四位
EN=1;_nop_();_nop_();EN=0;
delay(); //判断液晶模块是否忙
} //---刷新显示内容---
void Display()
{ unsigned char i=0;
//WriComm(0x02); //写入命令光标复位
//选择一行 // 按模块要求的地址最高位必须为1
WriComm(0x80); //写入命令
WriData(strl[c1]);
WriData(strl[c2]);
WriData(strl[c3]);
}
void Rcard(void)
{unsigned char i=0,temp=0;
ck=0;dly(5);//打开LED并延时等待电光二极管状态稳定
P0=0xff; //清除P0端口
card=P0; //读取卡号数据
ck=1; //关闭LED
if(card==0){c1=0;c2=0;c3=0;ready=0;}//判断是否有卡片插入
else
{
if(ready==0)
{dly(10000);
while(ready==0) //连续多次检测以消除插卡过程的错误数据
{
ck=0;dly(10);
P0=0xff;
card=P0;
if(temp==card){i++;}
else i=0;
temp=card;
if(i>=50)ready=1;
dly(200);
}
ck=1;
if(card>0) //读卡成功,蜂鸣提示
{bizz=0;dly(6000);
c3=card%10;
card=card/10;
c2=card%10;
card=card/10;
c1=card%10;
bizz=1;
}
}
}
} //LCD初始化
LCD_init()
{
dly(100);
delay();
WriComm(0x28); //设置显示模式:4位2行5X7点阵
WriComm(0x01); //清屏并光标复位
WriComm(0x0c); //显示器开、光标开、光标禁止闪烁
WriComm(0x06); //文字不动,光标自动右移
} //主程序
main(void)
{ unsigned char j=0;
P2=0x01;
LCD_init();
while(1)
{
Display();
Rcard();
dly(500);
}
}

看不下去              

上一篇:STC12LE
下一篇:学习C51迷茫中

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top