?? 課程設計樣品cexp5.cpp
字號:
//*------------------------------------------------------*/
//* Cexp5.cpp(音樂發生器接口實驗) */
//* 音樂發生器程序Source File */
//* Copyright (c) 2001 by HUST */
//*------------------------------------------------------*/
#include <dos.h> //getvect(),setvect();
#include <conio.h> //kbhit();
#include <stdlib.h> //exit(0);
#include <stdio.h> //printf();
#ifdef __cplusplus
#define __CPPARGS
#else
#define __CPPARGS
#endif
short int nFreq[] = {
//聲明歌曲“兩個老虎”的音樂頻率
262,294,330,262,
262,294,330,262,
330,349,392,
330,349,392,
392,440,392,349,330,262,
392,440,392,349,330,262,
294,196,262,
294,196,262,
0
};
short int nTimeDelay[] = {
//聲明歌曲“兩個老虎”的音樂延時
8,8,8,8,
8,8,8,8,
8,8,16,
8,8,16,
4,4,4,4,8,8,
4,4,4,4,8,8,
8,8,16,
8,8,16
};
const unsigned long CLK = 1193180; // 聲明時鐘頻率
const unsigned char INTR = 0X1C; // 聲明中斷號
short int *pFreq; // 聲明音頻指針
short int *pTimeDelay; // 聲明延時指針
void interrupt (*oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS)
{
(*pTimeDelay) -- ; // 延時點數減一
oldhandler(); // 調用原例程
}
int Playing(void);
void main(void)
{
printf("now play music!\n");
printf("strike ESC to exit\n");
Playing();
}
int Playing(void)
{
oldhandler = getvect(INTR); // 保存原中斷向量
setvect(INTR, handler); // 裝載新中斷向量
outportb( 0x303, 0x90); // 初始化8255
outportb( 0x303, 0x0c); // 置pc6=0 禁止8253通道2的gate引腳
outportb( 0x303, 0x00); // 置pc0=0 禁止7408
outportb( 0x307, 0xb6); // 初始化8253
pFreq = nFreq; // 取歌曲的第一個音頻
pTimeDelay = nTimeDelay; // 取歌曲的第一個時延
while ( *pFreq && !kbhit())
{
outportb( 0x306, (unsigned char)(CLK / *pFreq % 256));
// 先送低字節
outportb( 0x306, (unsigned char)(CLK / *pFreq / 256));
// 再送高字節
// 以上置8253通道2 的計數初值
outportb( 0x303, 0x01);
outportb( 0x303, 0x0d); // 開揚聲器
while ( *pTimeDelay){}; //等待延時到
outportb( 0x303, 0x0c);
outportb( 0x303, 0x00); // 關閉揚聲器
pFreq++; // 獲取下一個音頻
pTimeDelay++; // 獲取下一個延時
} // 歌曲結束或按了任意鍵
outportb( 0x303, 0x0c);
outportb( 0x303, 0x00); // 再次關閉揚聲器
setvect(INTR,oldhandler); // 恢復原中斷向量
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -