#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//lcd 管腳口定義
#define LCD1602_DATAPINS P0
//開拓者
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit cgq = P3^0;
sbit beep = P1^5;
////自己焊的板子
//sbit LCD1602_RS = P1^0;
//sbit LCD1602_RW = P1^1;
//sbit LCD1602_E = P1^2;
//sbit cgq = P2^1;
//sbit beep = P1^4;
uint count = 0; //計(jì)數(shù)值
uint a = 0;
static uint p = 0; //中斷標(biāo)號(hào)
uint flag = 0,m = 0; //中斷標(biāo)志位
uint num1[] = {'0','1','2','3','4','5','6','7','8','9'}; //數(shù)字
uchar line1[] = " **Counter** "; //首行顯示字符
uint num2[16]; //存儲(chǔ)數(shù)值
uchar blank[] = " "; //存儲(chǔ)16個(gè)空格
void delay_1ms(uint x)
{
uint y;
for(;x > 0;x--)
for(y = 110;y > 0;y--);
}
void Lcd1602_Delay1ms(uint c) //誤差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
void LcdDisplay(uint num)
{
uint i;
num2[15-2] = num/100; //百位
if(num > 99)
num2[15-1] = num/10%10;
else
num2[15-1] = num/10; //十位
num2[15] = num%10; //個(gè)位
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
for(i=0;i<16;i++)
{
LcdWriteData(line1[i]);
}
LcdWriteCom(0x80+0x40); //光標(biāo)移動(dòng)到第二行
for(i=0;i<16;i++)
{
if(i < 13)
LcdWriteData(blank[i]);
else
LcdWriteData(num1[num2[i]]);
}
}
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫一個(gè)指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
//傳感器計(jì)數(shù)
void CgqCounter()
{
if(cgq == 0)
{
delay_1ms(20);
if(cgq == 0)
{
while((!cgq));
count++;
LcdDisplay(count);
}
}
}
void Timer0_Init()
{
TMOD |= 0x01;
TH0 = 0xfc;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 0;
}
void main()
{
Timer0_Init();
LcdInit();
LcdDisplay(count);
while(1)
{
CgqCounter();
if((count % 12 == 0) && (count >= 12) && (m != count))
{
flag = 1;
TR0 = 1;
}
}
}
void Timer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x18;
p++;
if(flag == 1)
{
beep = !beep;
if(p == 2000)
{
TR0 = 0;
p = 0;
flag = 0;
m = count;
}
}
}
|