//問題一:程序不能實現,遮擋一次,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(); //顯示計數
}
}
|