⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i8254.c

📁 8254计数器发声程序
💻 C
字号:
#include "includes.h"
#include "i8254.h"
#include "gpio.h"
   
void bell2(void);
void bell3(void);
void ring2(void);
void tone14(void);
void TwoTiger(void);
void playc(char ch, char li);
void play_song(char *tones, char *len);
void playsong(int *song);
void ambulance(void);
void TestMusic(void);
void song1(void);
void tonedelay(int n);

void ring6(void);
void ring7(void);
void ring8(void);     
void ring9(void);
void delay10us(int);
void alarm1(void);

extern int kbhit(void);
extern int HaveFrame(void);
extern int HaveMsg(void);
extern char HaveDoorRing(void);
extern far int tone[];
extern far int tone1[];
extern far char song[];
extern far char length[];
extern far int song1_freq[];
extern far int song2_freq[];
extern far int song3_freq[];

void Init8253(void)
{
	outportb(CTR, 0xb6);
}
void sound(unsigned frequency)
{
	char b;
	
	outportb(CT2, CLK/frequency); 		// load low byte
	outportb(CT2, (CLK/frequency)>>8); 	// load high byte
	
	b = inportb(CTC);
	b |= 3;
	outportb(CTC, b);
}

void nosound(void)
{
	char b;
	
	b = inportb(CTC);
	b &= 0xfc;
	outportb(CTC, b);
}




void Test8254(void)
{
	delay(1000);
//	outportb(0x244, 3);
//	while(1) alarm1();
#if 0
	sound(D6); delay(300);
	sound(F5); delay(400);
	nosound();
	delay(500);
	sound(D6); delay(300);
	sound(F5); delay(400);
	nosound();
#endif
}

void tone14(void)
{
	int i;

	for(i=0;i<14;i++){
		sound(tone1[i]);
		delay(500);
	}
	for(i=0;i<14;i++){
		sound(tone[i]);
		delay(500);
	}
	nosound();
	delay(1000);
	for(i=13;i>=0;i--){
		sound(tone[i]);
		delay(500);
	}
	for(i=13;i>=0;i--){
		sound(tone1[i]);
		delay(500);
	}
	nosound();
}

void bell3(void)
{
	sound(C6);		// play
	delay(100);
	nosound();		// stop
	delay(100);
	sound(C6);		// play
	delay(100);
	nosound();		// stop
	delay(100);
	sound(C6);		// play
	delay(100);
	nosound();		// stop
}

void bell2(void)
{
	sound(C6);
	delay(100);
	nosound();
	delay(100);
	sound(C6);
	delay(100);
	nosound();
	delay(100);
}



void ring2(void)
{
	sound(425); delay(14); 	// G3
	sound(481); delay(14); 	// A3
	sound(539); delay(15); 	// B3
	sound(568); delay(14); 	// C4
	sound(635); delay(14);  	// D4
	sound(714); delay(15); 	// E4
	sound(753); delay(14); 	// F4
	sound(850); delay(15); 	// G4
	if(kbhit()){
		nosound();
		return;
	}
	sound(962); delay(14); 	// A4
	sound(1059); delay(15);	// B4
	sound(1136); delay(14);	// C5
	sound(1250); delay(15);	// D5
	sound(1420); delay(14);	// E5
	sound(1506); delay(14);	// F5
	sound(1689); delay(15);	// G5
	sound(1894); delay(14);	// A5
	if(kbhit()){
		nosound();
		return;
	}

	sound(2119); delay(14);	    // B5
	sound(2273); delay(14);     // C6
	sound(2273); delay(14);     // C6
	sound(2119); delay(14);     // B5
	sound(1894); delay(14);     // A5
	sound(1689); delay(15);     // G5
	sound(1506); delay(14);     // F5
	sound(1420); delay(14);     // E5
	if(kbhit()){
		nosound();
		return;
	}               
	sound(1250); delay(15);      // D5
	sound(1136); delay(14);      // C5
	sound(1059); delay(15);      // B4
	sound(962); delay(14);       // A4
	sound(850); delay(15);       // G4
	sound(753); delay(14);       // F4
	sound(714); delay(15);       // E4
	sound(635); delay(14);       // D4
	sound(568); delay(14);      	// C4
	sound(539); delay(15);       // B3
	sound(481); delay(15);       // A3
//	sound(1689); delay(15);    	// G5
	nosound();
}

void TwoTiger(void)
{
	play_song(song, length);
}


void playc(char ch, char li)
{
	char ti;
	
	switch(ch)
	{
		case 'q': ti=0; break;
		case 'w': ti=1; break;
		case 'e': ti=2; break;
		case 'r': ti=3; break;
		case 't': ti=4; break;
		case 'y': ti=5; break;
		case 'u': ti=6; break;
		case '1': ti=7; break;
		case '2': ti=8; break;
		case '3': ti=9; break;
		case '4': ti=10; break;
		case '5': ti=11; break;
		case '6': ti=12; break;
		case '7': ti=13; break;
		case ' ': ti=50; break; /* no sound */
		default : ti=50; break;
	}
	if(ti==50) return;
	sound(tone[ti]);
	delay(li*PDELAY);
}

void play_song(char *tones, char *len)
{
	int l;
	
	do{
		l= (*len++) - 0x30;
		playc(*tones, l);
		if(kbhit()||HaveFrame()||HaveDoorRing()){
			nosound();
			break;
		}
	}while(*tones++!='\0');
	nosound();
}


void keybell(int key)
{
	switch((INT8U)key){
		case '0':
			sound(B4);
		case '1':
			sound(C5);
			break;
		case '2':
			sound(D5);
			break;
		case '3':
			sound(E5);
			break;
		case '4':
			sound(F5);
			break;
		case '5':
			sound(G5);
			break;
		case '6':
			sound(A5);
			break;
		case '7':
			sound(B5);
			break;
		case '8':
			sound(C6);
			break;
		case '9':
			sound(D6);
			break;
		case '*':
			sound(E6);
			break;
		case '#':
			sound(F6);
			break;
		case 0x80:
			sound(G6);
			break;
		case 0x81:
			sound(G6);
			break;
		case 0x82:
			sound(G6);
			break;
		case 0x83:
			sound(G6);
			break;
	}
	delay(100);
	nosound();
}


void playsong(int *song)
{
	int *f;

	nosound();
	f = song;
	while(*f){
		sound(*f++); delay(*f++);
		if(kbhit())
			break;
	}
	nosound();
}

void ambulance(void)
{
	while(1){
		sound(A4); delay(341);
		sound(E5); delay(341);
		if(kbhit())
			break;
	}
}

void TestMusic(void)
{           

}

void song1(void)
{
	int count, choice;
	int freq;
	
	count = 2;
	choice = 2;
	while(count--){
		switch(choice){
			case 1:
			    	for(freq=10;freq<1000;freq+=100){
			    		sound(freq);
			    		delay(40);
			    	}
			    	for(;freq>10;freq-=10){
			    		sound(freq);
			    		delay(20);
			    	}
			    	break;
			case 2:
				for(freq=100;freq<2000;freq+=10){
					sound(freq);
					delay(120);
				}
				for(;freq>100;freq-=10){
					sound(freq);
					delay(120);
				}
				break;
			default:
				break;
		}
		
	}
	nosound();
}
void ring6(void)
{
	int i;
	
	i=9;
	while(i--){
		sound(D6); delay(15*8);
		sound(E6); delay(15*8);
	}
	nosound();
	
}

void ring7(void)
{
	int x, y;
	
	y = 2;
	while(y--){
		x = 2;
		while(x--){
			sound(D4); delay(28);
		}
		x = 8;
		while(x--){
			sound(E4); delay(28);
		}
		x = 2;
		while(x--){
			sound(D4); delay(28);
		}
		x = 8;
		while(x--){
			sound(C4); delay(28);
		}
		nosound(); delay(64*14);
	}
}


void ring8(void)
{
	int i;
	
	i = 2;
	while(i--){
		sound(2232);  delay(14); 
		sound(2155);  delay(14); 
		sound(2016);  delay(14); 
		sound(1894);  delay(14); 
		sound(1786);  delay(14); 
		sound(1689);  delay(14); 
		sound(1603);  delay(14); 
		sound(1524);  delay(14); 
		sound(1420);  delay(14); 
		sound(1330);  delay(14); 
		sound(1250);  delay(14); 
		sound(1201);  delay(14); 
		sound(1136);  delay(29); 
		nosound();
		delay(15*12+30);
	}
}             

void ring9(void)
{
	int i;
	
	i = 2;
	while(i--){
		sound(1420);  delay(14);
		sound(1524);  delay(14);
		sound(1603);  delay(14);
		sound(1689);  delay(14);
		sound(1786);  delay(14);
		sound(1894);  delay(14);
		sound(2016);  delay(14);
		sound(2155);  delay(14);
		nosound();    delay(14); 
		sound(1420);  delay(14);
		sound(1420);  delay(14);
		sound(1524);  delay(14);
		sound(1603);  delay(14);
		sound(1689);  delay(14);
		sound(1786);  delay(14);
		sound(1894);  delay(14);  
		sound(2016);  delay(14); 
		sound(2155);  delay(14);  
		nosound();
		delay(17*14);
	} 
}
#if 1
void alarm1(void)
{
	int i;
	
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);  
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);  
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	ResetWdt(); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600);
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	ResetWdt();                        
	if(kbhit()){                       
		nosound();                 
		return;                    
	}                 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	ResetWdt();                        
	if(kbhit()){                       
		nosound();                 
		return;                    
	}                   
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	sound(TONE_C6);   tonedelay(33); //delay10us(1600); 
	nosound();                 
	ResetWdt();                 
} 
#endif                 

void alarm(void)                 
{                 
	int i;
	
	sound(TONE_C6);   delay10us(1600);  //tonedelay(33); //
	sound(TONE_CX6);  delay10us(1600);  //tonedelay(18); //
	sound(TONE_D6);   delay10us(1600);  //tonedelay(19); //
	sound(TONE_DX6);  delay10us(1600);  //tonedelay(20); //
	ResetWdt();                         //                 
	sound(TONE_E6);   delay10us(1600);  //tonedelay(21); //
	sound(TONE_F6);   delay10us(1600);  //tonedelay(22); //
	sound(TONE_FX6);  delay10us(1600);  //tonedelay(24); //
	sound(TONE_G6);   delay10us(1600);  //tonedelay(25); //
	sound(TONE_GX6);  delay10us(1600);  //tonedelay(26); //
	ResetWdt();                         //                 
	if(kbhit()){                        //                 
		nosound();                  //                 
		return;                     //                 
	}                                   //                 
	sound(TONE_A6);   delay10us(1600);  //tonedelay(27); //
	sound(TONE_AX6);  delay10us(1600);  //tonedelay(29); //
	sound(TONE_B6);   delay10us(1600);  //tonedelay(62); //
	sound(TONE_AX6);  delay10us(1600);  //tonedelay(29); //
	sound(TONE_A6);   delay10us(1600);  //tonedelay(27); //
	sound(TONE_GX6);  delay10us(1600);  //tonedelay(26); //
	ResetWdt();                         //                 
	if(kbhit()){                        //                 
		nosound();                  //                 
		return;                     //                 
	}                                   //                 
	sound(TONE_G6);   delay10us(1600);  //tonedelay(25); //
	sound(TONE_FX6);  delay10us(1600);  //tonedelay(24); //
	sound(TONE_F6);   delay10us(1600);  //tonedelay(22); //
	sound(TONE_E6);   delay10us(1600);  //tonedelay(21); //
	sound(TONE_DX6);  delay10us(1600);  //tonedelay(20); //
	sound(TONE_C6);   delay10us(1600);  //tonedelay(33); //
	ResetWdt();
	nosound();
}                             

void delay10us(int cnt)
{
	asm mov cx, cnt
   dl0:
        asm nop
        asm nop
        asm nop
        asm nop
        asm nop
        asm nop
	asm nop
	asm nop
        asm loop dl0
}

void tonedelay(int n)
{
	char v;
	
	while(n--){
		wait1:
			asm{
				mov dx, GPIO_PORT_INDEX
				mov al, GPIOB_DAT
				out dx, al
				inc dx
				in  al, dx
				test al, 1
				jz  wait1
			}
		wait2:
			asm{
				mov dx, GPIO_PORT_INDEX
				mov al, GPIOB_DAT
				out dx, al
				inc dx
				in  al, dx
				test al, 1
				jnz  wait2
			}
	}                       
}

void OpenRing(void)
{
	bell2();
}

void OpenScrRing(void)
{
	sound(C6); delay(100);
	sound(D6); delay(100);
	sound(E6); delay(100);
	sound(F6); delay(100);
	sound(G6); delay(100);
	sound(A6); delay(100);
	sound(B6); delay(100);
	sound(C7); delay(100);
	nosound();
}	

void CloseScrRing(void)
{
	sound(C7); delay(100);
	sound(B6); delay(100);
	sound(A6); delay(100);
	sound(G6); delay(100);
	sound(F6); delay(100);
	sound(E6); delay(100);
	sound(D6); delay(100);
	sound(C6); delay(100);
	nosound();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -