#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; //反轉蜂鳴器控制電平} |