#include<reg51.h> //头文件
#define uchar unsigned char //预定义
#define uint unsigned int
#define lcd_dat P0 BUZZ
sbit lcdrs=P2^6; //1602的数据/指令选择控制线
sbit lcdrw=P2^5; //1602的读写控制线
sbit lcden=P2^4; //1602的使能控制线
sbit yihao=P2^0; //一号病房按键
sbit erhao=P2^1;
sbit sanhao=P2^2;
sbit sihao=P2^3;
uchar table1[]="Number";
uchar table2[]="1234";
void delay(uint z) //延时子程序
{
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) //写数据子程序
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(3);
lcden=0;
}
void init() //1602初始化子程序
{
write_com(0x38);//显示模式设置。
delay(5);
write_com(0x0c);//关光标,不闪烁
delay(5);
write_com(0x06); //显示地址递增,即写一个数据后,显示位置右移位
delay(5);
write_com(0x01); //清屏
delay(5); }
void Number() //显示Number子程序
{uchar m;
write_com(0x80);
for(m=0;m<6;m++) //将table[]中的数据依次写入1602显示
{
write_data(table1[m]);
delay(200);
}
}
void main() //主函数
{
unsigned char FLAG; //FLAG的值为P2口的值
init();
do
{
FLAG=P2;
switch(FLAG&0X0f) //屏蔽P2口高四位
{
case 0X0E:
Number();
write_com(0x80+10); //显示地址设为90H(即10H,)上排第十位
write_data(table2[0]);
delay(200);
break;
case 0X0D:
Number();
write_com(0x80+10); //显示地址设为90H(即10H,)上排第十位
write_data(table2[1]);
delay(200);
break;
case 0X0B:
Number();
write_com(0x80+10); //显示地址设为90H(即10H,)上排第十位
write_data(table2[2]);
delay(200);
break;
case 0X07:
Number();
write_com(0x80+10); //显示地址设为90H(即10H,)上排第十位
write_data(table2[3]);
delay(200);
break;
default:
break;
}
}
while(1);
}
sbit BUZZ =P1^0; //蜂鸣器控制引脚
unsigned char T0LoadH= 0; //T0重载值的高字节
unsigned char T0LoadL=0; //T0重载值的低字节
void OpenBuzz(unsigned int frequ);
void StopBuzz();
void major()
{
unsigned int i=0;
TMOD=0x01; //配置T0工作在模式1,暂不启动
EA=1; //使能全局中断
while (1)
{
OpenBuzz(4000); //以4KHz的频率启动蜂鸣器
for (i=0; i<40000; i++);
StopBuzz();
for (i=0; i<40000; i++);
OpenBuzz(1000); //以1KHz的频率启动蜂鸣器
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); //由给定频率值计算定时器重载值
T0LoadH=reload>>8; //16位重载值分解为高低两个字节
T0LoadL = reload;
TH0=0xFF;//设定一个接近溢出的初值,以使定时器马上投入工作
TL0=0xFE;
ET0=1; //使能T0中断
TR0=1; //启动T0
}
void StopBuzz()
{
ET0=0; //禁用T0中断
TR0=0; //停止T0
}
void InterruptTimer0()
interrupt 1
{
TH0=T0LoadH; //溢出后进入中断重新赋值
TL0=T0LoadL;
BUZZ=~BUZZ; //反转蜂鸣器控制电平
}
|