📄 51
字号:
113 3 Output_Sound(); //转去计算定时常数
114 3 break;
115 3 case 8:f=re; //如果第8个键按下,将中音2的频率赋给f
116 3 Output_Sound(); //转去计算定时常数
117 3 break;
C51 COMPILER V8.18 EX79 01/04/2010 13:10:50 PAGE 3
118 3 case 9:f=h_re; //如果第9个键按下,将高音2的频率赋给f
119 3 Output_Sound(); //转去计算定时常数
120 3 break;
121 3 case 10:f=h_dao; //如果第10个键按下,将高音1的频率赋给f
122 3 Output_Sound(); //转去计算定时常数
123 3 break;
124 3 case 11:f=xi; //如果第11个键按下,将中音7的频率赋给f
125 3 Output_Sound(); //转去计算定时常数
126 3 break;
127 3 case 12:f=la; //如果第12个键按下,将中音6的频率赋给f
128 3 Output_Sound(); //转去计算定时常数
129 3 break;
130 3 case 13:f=h_la; //如果第13个键按下,将高音6的频率赋给f
131 3 Output_Sound(); //转去计算定时常数
132 3 break;
133 3 case 14:f=h_sao; //如果第14个键按下,将高音5的频率赋给f
134 3 Output_Sound(); //转去计算定时常数
135 3 break;
136 3 case 15:f=h_fa; //如果第15个键按下,将高音4的频率赋给f
137 3 Output_Sound(); //转去计算定时常数
138 3 break;
139 3 case 16:f=h_mi; //如果第16个键按下,将高音3的频率赋给f
140 3 Output_Sound(); //转去计算定时常数
141 3 break;
142 3 }
143 2 }
144 1 }
145 /**************************************************************
146 函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波
147 **************************************************************/
148
149 void Time0_serve(void ) interrupt 1 using 1
150 {
151 1
152 1 TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
153 1 TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
154 1 sound=!sound; //将P3.7引脚取反,输出音频方波
155 1 }
156
157 /**************************************************************
158 函数功能:定时器T1的中断服务子程序,进行键盘扫描,判断键位
159 **************************************************************/
160 void time1_serve(void) interrupt 3 using 2 //定时器T1的中断编号为3,使用第2组寄存器
161 {
162 1 TR1=0; //关闭定时器T0
163 1 P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”
164 1 if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下
165 1 {
166 2 delay20ms(); //延时一段时间、软件消抖
167 2 if((P1&0xf0)!=0xf0) //确实有键按下
168 2 {
169 3 P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)
170 3 if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
171 3 keyval=1; //可判断是S1键被按下
172 3 if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
173 3 keyval=2; //可判断是S2键被按下
174 3 if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
175 3 keyval=3; //可判断是S3键被按下
176 3 if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
177 3 keyval=4; //可判断是S4键被按下
178 3
179 3 P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)
C51 COMPILER V8.18 EX79 01/04/2010 13:10:50 PAGE 4
180 3 if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
181 3 keyval=5; //可判断是S5键被按下
182 3 if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
183 3 keyval=6; //可判断是S6键被按下
184 3 if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
185 3 keyval=7; //可判断是S7键被按下
186 3 if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
187 3 keyval=8; //可判断是S8键被按下
188 3
189 3 P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)
190 3 if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
191 3 keyval=9; //可判断是S9键被按下
192 3 if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
193 3 keyval=10; //可判断是S10键被按下
194 3 if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
195 3 keyval=11; //可判断是S11键被按下
196 3 if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
197 3 keyval=12; //可判断是S12键被按下
198 3
199 3 P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)
200 3 if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
201 3 keyval=13; //可判断是S13键被按下
202 3 if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
203 3 keyval=14; //可判断是S14键被按下
204 3 if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
205 3 keyval=15; //可判断是S15键被按下
206 3 if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
207 3 keyval=16; //可判断是S16键被按下
208 3 }
209 2 }
210 1 TR1=1; //开启定时器T1
211 1 TH1=(65536-500)/256; //定时器T1的高8位赋初值
212 1 TL1=(65536-500)%256; //定时器T1的高8位赋初值
213 1 }
214
215
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 519 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -