#include<reg51.h> //头文件 #define uchar unsigned char //预定义 #define uint unsigned int #define lcd_dat P0 BUZZsbit 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^1; //蜂鸣器控制引脚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; //反转蜂鸣器控制电平} |