//问题一:程序不能实现,遮挡一次,1602显示次数加一的功能
#include "reg51.h" //包含头文件
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5; //命令/数据选择
sbit rw=P2^4; //读写口
sbit e=P2^3; //锁存控制
sbit duiguan=P2^0; //红外对管
uchar data dis1[16]={" the number is: "}; //第一行
uint Data[10] = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039};
//问题二:此数字是何含义?
uchar num;
//**************************************************************************************************
//延时函数
//**************************************************************************************************
void delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<100;j++); //for循环,循环50次
}
//**************************************************************************************************
//向LCD写一命令
//**************************************************************************************************
void wcode(uchar t)
{
rs=0; // 写的是命令
rw=0; // 写状态
e=1; //使能
P0=t; //写入命令
delay(20); //等待写入,如果时间太短,会导致液晶无法显示
e=0; //数据的锁定
}
//**************************************************************************************************
//向LCD写一数据
//**************************************************************************************************
void wdata(uchar t)
{
rs=1; // 写的是数据
rw=0; // 写状态
e=1; //使能
P0=t; //写入数据
delay(20); //等待写入,如果时间太短,会导致液晶无法显示
e=0; //数据的锁定
}
//**************************************************************************************************
//LCD显示第一行
//**************************************************************************************************
void xian1()
{
uchar i;
wcode(0x80); //设置第一行显示地址
for(i=0;i<16;i++) //循环16次,写完1行
{
wdata(dis1); //写入该行数据
}
}
//**************************************************************************************************
//LCD显示第二行
//**************************************************************************************************
void xian2()
{
uint shi,ge,bai;
if(num<10) //1位数时
{
wcode(0xcc); //设置第二行显示地址
wdata(Data[num]); //显示次数
}
if(num>=10) //2位数时
{
shi=num/10; //分离num得到十位数
ge=num%10; //分离num得到个位数
wcode(0xcc); //设置第二行显示地址
wdata(Data[shi]); //显示次数十位数
wdata(Data[ge]); //显示次数个位数
if(num>=100) //3位时
{
bai=num/100; //分离num得到百位数
shi=num%100/10; //分离num得到十位数
ge=num%100%10; //分离num得到个位数
wcode(0xcc); //设置第二行显示地址
wdata(Data[bai]); //显示次数百位数
wdata(Data[shi]); //显示次数十位数
wdata(Data[ge]); //显示次数个位数
} //千位可自行添加
}
}
//**************************************************************************************************
//LCD 初始化
//**************************************************************************************************
void InitLCD()
{
wcode(0x01); //清屏
wcode(0x06); //输入方式控制,增量光标不移位
wcode(0x0e); //显示开关控制
wcode(0x38); //功能设定:设置16x2显示,5x7显示,8位数据接口
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
main()
{
InitLCD(); //初始化1602
xian1(); //显示第一行
duiguan=1; //初始化i/0口(红外对管)
while(1)
{
if(duiguan==1) //判断是否被挡住 (挡住执行)
{
delay(20); //去抖
while(duiguan==1);//延时后再判断 若未被挡住执行
num++; //计数加1
}
xian2(); //显示计数
}
}
|