1、/模板70:软件消抖的独立式键盘输入实验#include / 包含51单片机寄存器定义的头文件 sbit S1=P14; /将S1位定义为P1.4引脚 sbit LED0=P30; /将LED0位定义为P3.0引脚 / 函数功能:延时约30ms/void delay(void)unsigned char i,j;for(i=0;i /包含51单片机寄存器定义的头文件 sbit S1=P14; /将S1位定义为P1.4引脚 sbit S2=P15; /将S2位定义为P1.5引脚 sbit S3=P16; /将S3位定义为P1.6引脚 sbit S4=P17; /将S4位定义为P1.7引脚 uns
2、igned char keyval; /储存按键值 / 函数功能:流水灯延时 /void led_delay(void)unsigned char i,j;for(i=0;i /包含51单片机寄存器定义的头文件 sbit S1=P14; /将S1位定义为P1.4引脚 sbit S2=P15; /将S2位定义为P1.5引脚 sbit S3=P16; /将S3位定义为P1.6引脚 sbit S4=P17; /将S4位定义为P1.7引脚 unsigned char keyval; /储存按键值 / 函数功能:流水灯延时 /void led_delay(void)unsigned char i,j;f
3、or(i=0;i / 包含51单片机寄存器定义的头文件 unsigned char speed; /储存流水灯的流动 sbit S1=P14; /位定义S1为P1.4sbit S2=P15; /位定义S2为P1.5sbit S3=P16; /位定义S3为P1.6sbit S4=P17; /位定义S4为P1.7/ 函数功能:延时20ms的子程序 /void delay20ms(void) /3 i j+2 i=3 100 60+2 100=20000s=20ms;unsigned char i,j;for(i=0;i / 包含51单片机寄存器定义的头文件 unsigned char ID; /储
4、存流水灯的流动 sbit S1=P14; /位定义S1为P1.4/ 函数功能:延时子程序 /void delay(void) / 为 一个按键扫描,所 延时时间 约200msunsigned char i,j;for(i=0;i / 包含51单片机寄存器定义的头文件 unsigned char code Tab =0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /数 09的段 unsigned char int_time ; /中断次数计数变 unsigned char second; /秒计数变 unsigned char minute;
5、 / 计数变 unsigned char hour; /时计数变 sbit S1=P14; /将S1位定义为P1.4sbit S2=P15; /将S2位定义为P1.5sbit S3=P16; /将S3位定义为P1.6sbit S4=P17; /将S4位定义为P1.7/ 函数功能:数 扫描延时 /void delay(void) unsigned char j;for(j=0;j /包含51单片机寄存器定义的头文件 sbit S1=P14; /将S1位定义为P1.4引脚 sbit S2=P15; /将S2位定义为P1.5引脚 sbit S3=P16; /将S3位定义为P1.6引脚 unsigne
6、d char keyval; /储存按键值 unsigned char ID; /储存功能fifl / 函数功能:软件消抖延时(约50ms) /void delay(void)unsigned char i,j;for(i=0;i /包含51单片机寄存器定义的头文件 sbit P14=P14; /将P14位定义为P1.4引脚 sbit P15=P15; /将P15位定义为P1.5引脚 sbit P16=P16; /将P16位定义为P1.6引脚 sbit P17=P17; /将P17位定义为P1.7引脚 unsigned char code Tab =0xc0,0xf9,0xa4,0xb0,0x
7、99,0x92,0x82,0xf8,0x80,0x90; /数 09的段 unsigned char keyval; /定义变 储存按键值 / 函数功能:数 动 扫描延时 /void led_delay(void) unsigned char j;for(j=0;j /包含51单片机寄存器定义的头文件 sbit sound=P37; /将sound位定义为P3.7/ 函数功能:器发延时约120ms/void delay_sound(void) unsigned char i;for(i=0;i /包含51单片机寄存器定义的头文件 sbit P14=P14; /将P14位定义为P1.4引脚 sb
8、it P15=P15; /将P15位定义为P1.5引脚 sbit P16=P16; /将P16位定义为P1.6引脚 sbit P17=P17; /将P17位定义为P1.7引脚 unsigned char keyval; /定义变 储存按键值 sbit sound=P37; /将sound位定义为P3.7unsigned int C; / 变 ,储存定时器的定时 数 unsigned int f; / 变 ,储存 的 / 下 C 低 的 定义 #define l_dao 262 /将currency1l_dao” 定义为低 currency11”的 262Hz#define l_re 286 /
9、将currency1l_re” 定义为低 currency12”的 286Hz#define l_mi 311 /将currency1l_mi” 定义为低 currency13”的 311Hz#define l_fa 349 /将currency1l_fa” 定义为低 currency14”的 349Hz#define l_sao 392 /将currency1l_sao” 定义为低 currency15”的 392Hz#define l_la 440 /将currency1l_a” 定义为低 currency16”的 440Hz#define l_xi 494 /将currency1l_xi
10、” 定义为低 currency17”的 494Hz/ 下 C 中 的 定义 #define dao 523 /将currency1dao” 定义为中 currency11”的 523Hz#define re 587 /将currency1re” 定义为中 currency12”的 587Hz#define mi 659 /将currency1mi” 定义为中 currency13”的 659Hz#define fa 698 /将currency1fa” 定义为中 currency14”的 698Hz#define sao 784 /将currency1sao” 定义为中 currency15”
11、的 784Hz#define la 880 /将currency1la” 定义为中 currency16”的 880Hz#define xi 987 /将currency1xi” 定义为中 currency17”的 53/ 下 C 的 定义 #define h_dao 1046 /将currency1h_dao” 定义为 currency11”的 1046Hz#define h_re 1174 /将currency1h_re” 定义为 currency12”的 1174Hz#define h_mi 1318 /将currency1h_mi” 定义为 currency13”的 1318Hz#de
12、fine h_fa 1396 /将currency1h_fa” 定义为 currency14”的 1396Hz#define h_sao 1567 /将currency1h_sao” 定义为 currency15”的 1567Hz#define h_la 1760 /将currency1h_la” 定义为 currency16”的 1760Hz#define h_xi 1975 /将currency1h_xi” 定义为 currency17”的 1975Hz/ 函数功能:软件延时子程序 /void delay20ms(void) unsigned char i,j;for(i=0;i100;i
13、+)for(j=0;j60;j+); / 函数功能: 的延时的 单位,延时200ms/void delay() unsigned char i,j;for(i=0;i250;i+)for(j=0;j250;j+);/ 函数功能:输出 入 数:F/void Output_Sound(void)C=(46083/f) 10; /计 定时 数 TH0=(8192-C)/32; / 13位计数器TH0 8位的赋初值 TL0=(8192-C)%32; / 13位计数器TL0低5位的赋初值 TR0=1; /开定时T0delay(); /延时200ms, TR0=0; /关闭定时器 sound=1; /关闭
14、器 keyval=0xff; / 按键 ,将按键值, / 函数功能:主函数 / void main(void) EA=1; /开总中断 ET0=1; /定时器T0中断允许 ET1=1; /定时器T1中断允许 TR1=1; /定时器T1启动,开始键盘扫描 TMOD=0x10; / 使用定时器T1的模式1,T0的模式0TH1=(65536-500)/256; /定时器T1的 8位赋初值 TL1=(65536-500)%256; /定时器T1的 8位赋初值 while(1) / switch(keyval)case 1:f=dao; / 第1个键按下,将中 1的 赋fOutput_Sound();
15、/ 去计 定时 数 break;case 2:f=l_xi; / 第2个键按下,将低 7的 赋fOutput_Sound(); / 去计 定时 数 break;case 3:f=l_la; / 第3个键按下,将低 6的 赋fOutput_Sound(); / 去计 定时 数 break;case 4:f=l_sao; / 第4个键按下,将低 5的 赋fOutput_Sound(); / 去计 定时 数 break;case 5:f=sao; / 第5个键按下,将中 5的 赋fOutput_Sound(); / 去计 定时 数 break;case 6:f=fa; / 第6个键按下,将中 4的
16、赋fOutput_Sound(); / 去计 定时 数 break;case 7:f=mi; / 第7个键按下,将中 3的 赋fOutput_Sound(); / 去计 定时 数 break; case 8:f=re; / 第8个键按下,将中 2的 赋fOutput_Sound(); / 去计 定时 数 break;case 9:f=h_re; / 第9个键按下,将 2的 赋fOutput_Sound(); / 去计 定时 数 break;case 10:f=h_dao; / 第10个键按下,将 1的 赋fOutput_Sound(); / 去计 定时 数 break;case 11:f=xi
17、; / 第11个键按下,将中 7的 赋fOutput_Sound(); / 去计 定时 数 break;case 12:f=la; / 第12个键按下,将中 6的 赋fOutput_Sound(); / 去计 定时 数 break; case 13:f=h_la; / 第13个键按下,将 6的 赋fOutput_Sound(); / 去计 定时 数 break;case 14:f=h_sao; / 第14个键按下,将 5的 赋fOutput_Sound(); / 去计 定时 数 break;case 15:f=h_fa; / 第15个键按下,将 4的 赋fOutput_Sound(); / 去
18、计 定时 数 break;case 16:f=h_mi; / 第16个键按下,将 3的 赋fOutput_Sound(); / 去计 定时 数 break; / 函数功能:定时器T0的中断服务子程序,使P3.7引脚输出 / void Time0_serve(void ) interrupt 1 using 1 TH0=(8192-C)/32; / 13位计数器TH0 8位的赋初值 TL0=(8192-C)%32; / 13位计数器TL0低5位的赋初值 sound=!sound; /将P3.7引脚取反,输出 / 函数功能:定时器T1的中断服务子程序, 键盘扫描,断键位 / void time1_
19、serve(void) interrupt 3 using 2 /定时器T1的中断fl为3,使用第2寄存器 TR1=0; /关闭定时器T0P1=0xf0; /所有 为低电平currency10”,所有 为 电平currency11” if(P1 /延时一段时间软件消抖 if(P1 /第一 为低电平currency10”(P1.0输出低电平currency10”) if(P14=0) / 检测到P1.4引脚的为低电平currency10” keyval=1; / 断 S1键被按下 if(P15=0) / 检测到P1.5引脚的为低电平currency10” keyval=2; / 断 S2键被按下
20、 if(P16=0) / 检测到P1.6引脚的为低电平currency10” keyval=3; / 断 S3键被按下 if(P17=0) / 检测到P1.7引脚的为低电平currency10” keyval=4; / 断 S4键被按下 P1=0xfd; /第二 为低电平currency10”(P1.1输出低电平currency10”) if(P14=0) / 检测到P1.4引脚的为低电平currency10” keyval=5; / 断 S5键被按下 if(P15=0) / 检测到P1.5引脚的为低电平currency10” keyval=6; / 断 S6键被按下 if(P16=0) /
21、检测到P1.6引脚的为低电平currency10” keyval=7; / 断 S7键被按下 if(P17=0) / 检测到P1.7引脚的为低电平currency10” keyval=8; / 断 S8键被按下 P1=0xfb; /第三 为低电平currency10”(P1.2输出低电平currency10”) if(P14=0) / 检测到P1.4引脚的为低电平currency10” keyval=9; / 断 S9键被按下 if(P15=0) / 检测到P1.5引脚的为低电平currency10” keyval=10; / 断 S10键被按下 if(P16=0) / 检测到P1.6引脚的为
22、低电平currency10” keyval=11; / 断 S11键被按下 if(P17=0) / 检测到P1.7引脚的为低电平currency10” keyval=12; / 断 S12键被按下 P1=0xf7; /第四 为低电平currency10”(P1.3输出低电平currency10”) if(P14=0) / 检测到P1.4引脚的为低电平currency10” keyval=13; / 断 S13键被按下 if(P15=0) / 检测到P1.5引脚的为低电平currency10” keyval=14; / 断 S14键被按下 if(P16=0) / 检测到P1.6引脚的为低电平currency10” keyval=15; / 断 S15键被按下 if(P17=0) / 检测到P1.7引脚的为低电平currency10” keyval=16; / 断 S16键被按下 TR1=1; /开启定时器T1TH1=(65536-500)/256; /定时器T1的 8位赋初值 TL1=(65536-500)%256; /定时器T1的 8位赋初值