📄 i8254.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 + -