|
#include<reg51.h> //頭文件
#define uchar unsigned char //預(yù)定義
#define uint unsigned int
#define lcd_dat P0 BUZZ
sbit lcdrs=P2^6; //1602的數(shù)據(jù)/指令選擇控制線
sbit lcdrw=P2^5; //1602的讀寫控制線
sbit lcden=P2^4; //1602的使能控制線
sbit yihao=P2^0; //一號(hào)病房按鍵
sbit erhao=P2^1;
sbit sanhao=P2^2;
sbit sihao=P2^3;
uchar table1[]="Number";
uchar table2[]="1234";
void delay(uint z) //延時(shí)子程序
{
uint x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--);
}
void write_com(uchar com) //寫命令子程序
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(3);
lcden=0;
}
void write_data(uchar date) //寫數(shù)據(jù)子程序
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(3);
lcden=0;
}
void init() //1602初始化子程序
{
write_com(0x38);//顯示模式設(shè)置。
delay(5);
write_com(0x0c);//關(guān)光標(biāo),不閃爍
delay(5);
write_com(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移位
delay(5);
write_com(0x01); //清屏
delay(5); }
void Number() //顯示Number子程序
{uchar m;
write_com(0x80);
for(m=0;m<6;m++) //將table[]中的數(shù)據(jù)依次寫入1602顯示
{
write_data(table1[m]);
delay(200);
}
}
void main() //主函數(shù)
{
unsigned char FLAG; //FLAG的值為P2口的值
init();
do
{
FLAG=P2;
switch(FLAG&0X0f) //屏蔽P2口高四位
{
case 0X0E:
Number();
write_com(0x80+10); //顯示地址設(shè)為90H(即10H,)上排第十位
write_data(table2[0]);
delay(200);
break;
case 0X0D:
Number();
write_com(0x80+10); //顯示地址設(shè)為90H(即10H,)上排第十位
write_data(table2[1]);
delay(200);
break;
case 0X0B:
Number();
write_com(0x80+10); //顯示地址設(shè)為90H(即10H,)上排第十位
write_data(table2[2]);
delay(200);
break;
case 0X07:
Number();
write_com(0x80+10); //顯示地址設(shè)為90H(即10H,)上排第十位
write_data(table2[3]);
delay(200);
break;
default:
break;
}
}
while(1);
}
sbit BUZZ =P1^0; //蜂鳴器控制引腳
unsigned char T0LoadH= 0; //T0重載值的高字節(jié)
unsigned char T0LoadL=0; //T0重載值的低字節(jié)
void OpenBuzz(unsigned int frequ);
void StopBuzz();
void major()
{
unsigned int i=0;
TMOD=0x01; //配置T0工作在模式1,暫不啟動(dòng)
EA=1; //使能全局中斷
while (1)
{
OpenBuzz(4000); //以4KHz的頻率啟動(dòng)蜂鳴器
for (i=0; i<40000; i++);
StopBuzz();
for (i=0; i<40000; i++);
OpenBuzz(1000); //以1KHz的頻率啟動(dòng)蜂鳴器
for (i=0; i<40000; i++);
StopBuzz();
for (i=0; i<40000; i++);
}
}
void OpenBuzz(unsigned int frequ)
{
unsigned int reload;
reload = 65536-(11059200/12)/(frequ*2); //由給定頻率值計(jì)算定時(shí)器重載值
T0LoadH=reload>>8; //16位重載值分解為高低兩個(gè)字節(jié)
T0LoadL = reload;
TH0=0xFF;//設(shè)定一個(gè)接近溢出的初值,以使定時(shí)器馬上投入工作
TL0=0xFE;
ET0=1; //使能T0中斷
TR0=1; //啟動(dòng)T0
}
void StopBuzz()
{
ET0=0; //禁用T0中斷
TR0=0; //停止T0
}
void InterruptTimer0()
interrupt 1
{
TH0=T0LoadH; //溢出后進(jìn)入中斷重新賦值
TL0=T0LoadL;
BUZZ=~BUZZ; //反轉(zhuǎn)蜂鳴器控制電平
}
|
|