2022年2022年键盘液晶模块经典单片机初级程序 .pdf

上传人:Che****ry 文档编号:27190431 上传时间:2022-07-23 格式:PDF 页数:49 大小:335.08KB
返回 下载 相关 举报
2022年2022年键盘液晶模块经典单片机初级程序 .pdf_第1页
第1页 / 共49页
2022年2022年键盘液晶模块经典单片机初级程序 .pdf_第2页
第2页 / 共49页
点击查看更多>>
资源描述

《2022年2022年键盘液晶模块经典单片机初级程序 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年键盘液晶模块经典单片机初级程序 .pdf(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、本人直接最经典的,谢谢支持。 QQ:251034461 2011.3.10 / 实例 71 :CPU 控制的独立式键盘扫描实验#include / 包含 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; for

2、(i=0;i250;i+) for(j=0;j250;j+) ; /* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 49 页 - - - - - - - - - 函数功能:软件消抖延时*/ void delay30ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j100;j+) ; /* 函数功能:正向流水点亮LED */ void forward(void) P3=0 xfe; / 第一个灯亮led_dela

3、y(); P3=0 xfd; / 第二个灯亮led_delay(); P3=0 xfb; / 第三个灯亮led_delay(); P3=0 xf7; / 第四个灯亮led_delay(); P3=0 xef; / 第五个灯亮 led_delay(); P3=0 xdf; / 第六个灯亮led_delay(); P3=0 xbf; / 第七个灯亮 led_delay(); P3=0 x7f; / 第八个灯亮 led_delay(); P3=0 xff; P3=0 xfe; / 第一个灯亮led_delay(); /* 函数功能:反向流水点亮LED */ void backward(void) P

4、3=0 x7f; / 第八个灯亮 led_delay(); P3=0 xbf; / 第七个灯亮 led_delay(); P3=0 xdf; / 第六个灯亮名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 49 页 - - - - - - - - - led_delay(); P3=0 xef; / 第五个灯亮 led_delay(); P3=0 xf7; / 第四个灯亮led_delay(); P3=0 xfb; / 第三个灯亮led_delay(); P3=0 xfd;

5、 / 第二个灯亮led_delay(); P3=0 xfe; / 第一个灯亮led_delay(); /* 函数功能:关闭所有LED */ void stop(void) P3=0 xff; /* 函数功能:闪烁点亮LED */ void flash(void) P3=0 xff; led_delay(); P3=0 x00; led_delay(); /* 函数功能:键盘扫描子程序*/ void key_scan(void) if(P1&0 xf0)!=0 xf0) / 第一次检测到有键按下 delay30ms(); / 延时 20ms 再去检测if(S1=0) / 按键 S1被按下keyv

6、al=1; if(S2=0) / 按键 S2被按下keyval=2; if(S3=0) / 按键 S3被按下keyval=3; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 49 页 - - - - - - - - - if(S4=0) / 按键 S4被按下keyval=4; /* 函数功能:主函数*/ void main(void) / 主函数 keyval=0; / 按键值初始化为 0,什么也不做while(1) key_scan(); switch(keyval)

7、 case 1:forward(); break; case 2:backward(); break; case 3:stop(); break; case 4: flash(); break; / 实例 72 :定时器中断控制的独立式键盘扫描实验#include / 包含 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; / 储存按

8、键值/* 函数功能:流水灯延时*/ void led_delay(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 49 页 - - - - - - - - - unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; /* 函数功能:软件消抖延时*/ void delay20ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ; /* 函数

9、功能:正向流水点亮LED */ void forward(void) P3=0 xfe; / 第一个灯亮led_delay(); P3=0 xfd; / 第二个灯亮led_delay(); P3=0 xfb; / 第三个灯亮led_delay(); P3=0 xf7; / 第四个灯亮led_delay(); P3=0 xef; / 第五个灯亮 led_delay(); P3=0 xdf; / 第六个灯亮led_delay(); P3=0 xbf; / 第七个灯亮 led_delay(); P3=0 x7f; / 第八个灯亮 led_delay(); P3=0 xff; P3=0 xfe; /

10、第一个灯亮led_delay(); /* 函数功能:反向流水点亮LED 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 49 页 - - - - - - - - - */ void backward(void) P3=0 x7f; / 第八个灯亮 led_delay(); P3=0 xbf; / 第七个灯亮 led_delay(); P3=0 xdf; / 第六个灯亮led_delay(); P3=0 xef; / 第五个灯亮 led_delay(); P3=0 xf7;

11、 / 第四个灯亮led_delay(); P3=0 xfb; / 第三个灯亮led_delay(); P3=0 xfd; / 第二个灯亮led_delay(); P3=0 xfe; / 第一个灯亮led_delay(); /* 函数功能:关闭所有LED */ void stop(void) P3=0 xff; / 关闭 8 个 LED /* 函数功能:闪烁点亮LED */ void flash(void) P3=0 xff; / 关闭 8 个 LED led_delay(); P3=0 x00; / 点亮 8 个 LED led_delay(); /* 函数功能:主函数*/ void main

12、(void) / 主函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 49 页 - - - - - - - - - TMOD=0 x01; / 使用定时器 T0 的模式 1 EA=1; / 开总中断ET0=1; / 定时器 T0中断允许TR0=1; / 启动定时器 T0 TH0=(65536-1000)/256; / 定时器 T0赋初值,每计数200 次(217微秒)发送一次中断请求TL0=(65536-1000)%256; / 定时器 T0赋初值keyval=0; /

13、 按键值初始化为 0,什么也不做while(1) switch(keyval) case 1:forward(); break; case 2:backward(); break; case 3:stop(); break; case 4: flash(); break; /* 函数功能:定时器T0的中断服务子程序*/ void Time0_serve(void) interrupt 1 using 1 if(P1&0 xf0)!=0 xf0) / 第一次检测到有键按下 delay20ms(); / 延时 20ms 再去检测if(S1=0) / 按键 S1被按下keyval=1; if(S2=

14、0) / 按键 S2被按下keyval=2; if(S3=0) / 按键 S3被按下keyval=3; if(S4=0) / 按键 S4被按下keyval=4; TH0=(65536-1000)/256; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 49 页 - - - - - - - - - TL0=(65536-1000)%256; / 实例 73 :独立式键盘控制的4 级变速流水灯#include / 包含 51 单片机寄存器定义的头文件unsigned cha

15、r speed; / 储存流水灯的流动速度sbit S1=P14; / 位定义 S1为 P1.4 sbit S2=P15; / 位定义 S2为 P1.5 sbit S3=P16; / 位定义 S3为 P1.6 sbit 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;i100;i+) for(j=0;j60;j+) ; /* 函数功能:延时可调子程序入口参数: x */ void

16、delay(unsigned char x) unsigned char k; for(k=0;kx;k+) delay20ms(); /* 函数功能:主函数*/ void main(void) TMOD=0 x02; / 使用定时器 T0 的模式 2 EA=1; / 开总中断ET0=1; / 定时器 T0 中断允许TR0=1; / 定时器 T0 开始运行TH0=256-200; / 定时器 T0赋初值 ,每 200 微妙来 1 次中断请求名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -

17、第 8 页,共 49 页 - - - - - - - - - TL0=256-200; speed=3; / 默认流水灯流水点亮延时20ms3=60ms while(1) P3=0 xfe; / 第一个灯亮delay(speed); / 调用延时可调子程序P3=0 xfd; / 第二个灯亮delay(speed); P3=0 xfb; / 第三个灯亮delay(speed); P3=0 xf7; / 第四个灯亮delay(speed); P3=0 xef; / 第五个灯亮delay(speed); P3=0 xdf; / 第六个灯亮delay(speed); P3=0 xbf; / 第七个灯亮

18、delay(speed); P3=0 x7f; / 第八个灯亮delay(speed); P3=0 xff; /* 函数功能:定时器T0的中断服务子程序 ,进行键盘扫描*/ void intersev(void) interrupt 1 using 1 TR0=0; / 关闭定时器 T0/ P1=0 xff; / 将 P1口的均置高电平 1 if(P1&0 xf0)!=0 xf0) / 如果有键按下 delay20ms(); / 延时 20ms,软件消抖if(P1&0 xf0)!=0 xf0) / 确实有键按下 if(S1=0) / 如果是按键 S1按下speed=5; / 流水灯流水点亮延时

19、20ms5=100ms if(S2=0) / 如果是按键 S2按下speed=10; / 流水灯流水点亮延时20ms10=200ms if(S3=0) / 如果是按键 S3按下speed=25; / 流水灯流水点亮延时20ms25=500ms if(S4=0) / 如果是按键 S4按下speed=50; / 流水灯流水点亮延时20ms50=1000ms 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 49 页 - - - - - - - - - TR0=1; / 启动定时

20、器 T0 / 实例 74:独立式键盘的按键功能扩展:以一当四 #include / 包含 51 单片机寄存器定义的头文件unsigned char ID; / 储存流水灯的流动速度sbit S1=P14; / 位定义 S1为 P1.4 /* 函数功能:延时子程序*/ void delay(void) / 因为仅对一个按键扫描,所以延时时间较长约200ms unsigned char i,j; for(i=0;i200;i+) for(j=0;j100;j+) ; /* 函数功能:主函数*/ void main(void) TMOD=0 x02; / 使用定时器 T0 的模式 2 EA=1; /

21、 开总中断ET0=1; / 定时器 T0 中断允许TR0=1; / 定时器 T0 开始运行TH0=256-200; / 定时器 T0赋初值,每 200微妙来 1 次中断请求TL0=256-200; ID=0; while(1) switch(ID) case 0: P3=0 xfe; break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 49 页 - - - - - - - - - case 1: P3=0 xfd; break; case 2: P3=0 xf

22、b; break; case 3: P3=0 xf7; break; /* 函数功能:定时器T0的中断服务子程序,进行键盘扫描*/ void intersev(void) interrupt 1 using 1 TR0=0; / 关闭定时器 T0 P1=0 xff; if(S1=0) / 如果是按键 S1按下 delay(); / 延时 20ms,软件消抖if(S1=0) / 如果是按键 S1按下ID=ID+1; if(ID=4) ID=0; TR0=1; / 启动定时器 T0 / 实例 75 :独立式键盘调时的数码时钟实验#include / 包含 51 单片机寄存器定义的头文件unsign

23、ed char code Tab =0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; / 数字 09 的段码unsigned char int_time ; / 中断次数计数变量unsigned char second; / 秒计数变量unsigned char minute; / 分钟计数变量unsigned char hour; / 小时计数变量sbit S1=P14; / 将 S1位定义为 P1.4 sbit S2=P15; / 将 S2位定义为 P1.5 名师资料总结 - - -精品资料欢迎下载 - - - - -

24、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 49 页 - - - - - - - - - sbit S3=P16; / 将 S3位定义为 P1.6 sbit S4=P17; / 将 S4位定义为 P1.7 /* 函数功能:数码管扫描延时*/ void delay(void) unsigned char j; for(j=0;j200;j+) ; /* 函数功能:键盘扫描延时*/ void delay60ms(void) unsigned char i,j; for(i=0;i200;i+) for(j=0;j100;j+)

25、; /* 函数功能:显示秒入口参数: s */ void DisplaySecond(unsigned char s) P2=0 xbf; /P2.6 引脚输出低电平,DS6点亮P0=Tabs/10; / 显示十位delay(); P2=0 x7f; /P2.7 引脚输出低电平,DS7点亮P0=Tabs%10; / 显示个位delay(); P2=0 xff; / 关闭所有数码管 /* 函数功能:显示分钟入口参数: m */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,

26、共 49 页 - - - - - - - - - void DisplayMinute(unsigned char m) P2=0 xf7; / P2.3 引脚输出低电平,DS3点亮P0=Tabm/10;/显示个位delay(); P2=0 xef; / P2.4 引脚输出低电平,DS4点亮P0=Tabm%10; delay(); P2=0 xdf; /P2.5 引脚输出低电平,DS5点亮P0=0 xbf; / 分隔符“ -”的段码delay(); P2=0 xff; / 关闭所有数码管 /* 函数功能:显示小时的子程序入口参数: h */ void DisplayHour(unsigned

27、char h) P2=0 xfe; /P2.0 引脚输出低电平,DS0点亮P0=Tabh/10; / 显示十位delay(); P2=0 xfd; /P2.1 引脚输出低电平,DS1点亮P0=Tabh%10; / 显示个位delay(); P2=0 xfb; /P2.2 引脚输出低电平,DS2点亮P0=0 xbf; / 分隔符“ -”的段码delay(); P2=0 xff; / 关闭所有数码管 /* 函数功能:键盘扫描*/ void key_scan(void) P1=0 xf0; / 将 P1口高 4 位置高电平“ 1”if(P1&0 xf0)!=0 xf0) / 有键按下 delay60

28、ms(); / 延时 60ms再检测if(P1&0 xf0)!=0 xf0) / 确实有键按下 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 49 页 - - - - - - - - - if(S1=0) / 如果是 S1键按下second+; / 秒加 1 if(S2=0) / 如果是 S2键按下minute+; / 分钟加 1 if(S3=0) / 如果是 S3键按下hour+; / 小时加 1 if(S4=0) / 如果是 S4键按下 second=0; / 秒

29、清 0 minute=0; / 分钟清 0 hour=0; / 小时清 0 /* 函数功能:主函数*/ void main(void) TMOD=0 x01; / 使用定时器 T0 EA=1; / 开中断总允许ET0=1; / 允许 T0 中断TH0=(65536-46083)/256; / 定时器高八位赋初值TL0=(65536-46083)%256; / 定时器低八位赋初值TR0=1; / 启动定时器 T0 int_time=0; / 中断计数变量初始化second=0; / 秒计数变量初始化minute=0; / 分钟计数变量初始化hour=0; / 小时计数变量初始化while(1)

30、DisplaySecond(second); / 调用秒显示子程序DisplayMinute(minute); / 调用分钟显示子程序DisplayHour(hour); / 调用小时显示子程序 /* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 49 页 - - - - - - - - - 函数功能:定时器T0的中断服务子程序*/ void interserve(void ) interrupt 1 using 1 /using Time0 TR0=0; / 关闭定

31、时器 T0 int_time+; / 中断次数加 1 if(int_time=20) / 如果中断次数满 20 int_time=0; / 中断计数变量清 0 second+; / 秒计数变量加 1 if(second=60) / 如果秒计满 60 second=0; / 如果秒计满 60,将秒计数变量清0 minute+; / 分钟计数变量加 1 if(minute=60) / 如果分钟计满 60 minute=0; / 如果分钟计满 60,将分钟计数变量清0 hour+; / 小时计数变量加 1 if(hour=24) / 如果小时计满 24 hour=0; / 如果小时计满 24,将小时

32、计数变量清0 key_scan(); / 执行键盘扫描TH0=(65536-46083)/256; / 定时器 T0高四位赋值TL0=(65536-46083)%256; / 定时器 T0 低四位赋值TR0=1; / 启动定时器 T0 / 实例 76:独立式键盘控制步进电机实验#include / 包含 51 单片机寄存器定义的头文件sbit S1=P14; / 将 S1位定义为 P1.4引脚sbit S2=P15; / 将 S2位定义为 P1.5引脚sbit S3=P16; / 将 S3位定义为 P1.6引脚unsigned char keyval; / 储存按键值unsigned char

33、 ID; / 储存功能标号/* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 49 页 - - - - - - - - - 函数功能:软件消抖延时(约50ms)*/ void delay(void) unsigned char i,j; for(i=0;i150;i+) for(j=0;j100;j+) ; /* 函数功能:步进电机转动延时,延时越长,转速越慢*/ void motor_delay(void) unsigned int i; for(i=0;i2000

34、;i+) ; /* 函数功能:步进电机正转*/ void forward( ) P0=0 xfc; /P0 口低四位脉冲 1100 motor_delay(); P0=0 xf6; /P0 口低四位脉冲 0110 motor_delay(); P0=0 xf3; /P0 口低四位脉冲 0011 motor_delay(); P0=0 xf9; /P0 口低四位脉冲 1001 motor_delay(); /* 函数功能:步进电机反转*/ void backward() P0=0 xfc; /P0 口低四位脉冲 1100 motor_delay(); P0=0 xf9; /P0 口低四位脉冲 1

35、001 motor_delay(); P0=0 xf3; /P0 口低四位脉冲 0011 motor_delay(); P0=0 xf6; /P0 口低四位脉冲 0110 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 49 页 - - - - - - - - - motor_delay(); /* 函数功能:步进电机停转*/ void stop(void) P0=0 xff ; / 停止输出脉冲 /* 函数功能:主函数*/ void main(void) TMOD=0

36、 x01; / 使用定时器 T0 的模式 1 EA=1; / 开总中断ET0=1; / 定时器 T0中断允许TR0=1; / 启动定时器 T0 TH0=(65536-500)/256; / 定时器 T0赋初值,每计数 200 次(217 微秒)发送一次中断请求TL0=(65536-500)%256; / 定时器 T0赋初值keyval=0; / 按键值初始化为 0,什么也不做ID=0; while(1) switch(keyval) / 根据按键值 keyval选择待执行的功能 case 1:forward(); / 按键 S1按下,正转break; case 2:backward(); /

37、按键 S2按下 ,反转break; case 3:stop(); / 按键 S3按下,停转break; /* 函数功能:定时器T0的中断服务子程序*/ void Time0_serve(void) interrupt 1 using 1 TR0=0; / 关闭定时器 T0 if(P1&0 xf0)!=0 xf0) / 第一次检测到有键按下 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 49 页 - - - - - - - - - delay(); / 延时一段时间再去

38、检测if(P1&0 xf0)!=0 xf0) / 确实有键按下 if(S1=0) / 按键 S1被按下keyval=1; if(S2=0) / 按键 S2被按下keyval=2; if(S3=0) / 按键 S3被按下keyval=3; TH0=(65536-200)/256; / 定时器 T0的高 8 位赋初值TL0=(65536-200)%256; / 定时器 T0的低 8 位赋初值TR0=1; / 启动定时器 T0 / 实例 77 :矩阵式键盘按键值的数码管显示实验#include / 包含 51 单片机寄存器定义的头文件sbit P14=P14; / 将 P14位定义为 P1.4引脚s

39、bit P15=P15; / 将 P15位定义为 P1.5引脚sbit P16=P16; / 将 P16位定义为 P1.6引脚sbit P17=P17; / 将 P17位定义为 P1.7引脚unsigned char code Tab =0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; / 数字 09 的段码unsigned char keyval; / 定义变量储存按键值/* 函数功能:数码管动态扫描延时*/ void led_delay(void) unsigned char j; for(j=0;j200;j+) ;

40、 /* 函数功能:按键值的数码管显示子程序*/ void display(unsigned char k) P2=0 xbf; / 点亮数码管 DS6 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 49 页 - - - - - - - - - P0=Tabk/10; / 显示十位led_delay(); / 动态扫描延时P2=0 x7f; / 点亮数码管 DS7 P0=Tabk%10; / 显示个位led_delay(); / 动态扫描延时 /* 函数功能:软件延时子

41、程序*/ void delay20ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ; /* 函数功能:主函数*/ void main(void) EA=1; / 开总中断ET0=1; / 定时器 T0中断允许TMOD=0 x01; / 使用定时器 T0的模式 1 TH0=(65536-500)/256; / 定时器 T0 的高 8 位赋初值TL0=(65536-500)%256; / 定时器 T0 的高 8 位赋初值TR0=1; / 启动定时器 T0 keyval=0 x00; / 按键值初始化为0 while(1) /

42、 无限循环 display(keyval); / 调用按键值的数码管显示子程序 /* 函数功能:定时器0 的中断服务子程序,进行键盘扫描,判断键位*/ void time0_interserve(void) interrupt 1 using 1 / 定时器 T0的中断编号为 1,使用第一组寄存器 TR0=0; / 关闭定时器 T0 P1=0 xf0; / 所有行线置为低电平“ 0”,所有列线置为高电平“ 1”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 49 页 -

43、 - - - - - - - - if(P1&0 xf0)!=0 xf0) / 列线中有一位为低电平“ 0”,说明有键按下delay20ms(); / 延时一段时间、软件消抖if(P1&0 xf0)!=0 xf0) / 确实有键按下 P1=0 xfe; / 第一行置为低电平“ 0”(P1.0输出低电平“0”)if(P14=0) / 如果检测到接 P1.4引脚的列线为低电平 “0”keyval=1; / 可判断是 S1键被按下if(P15=0) / 如果检测到接 P1.5引脚的列线为低电平“0”keyval=2; / 可判断是 S2键被按下if(P16=0) / 如果检测到接 P1.6引脚的列线

44、为低电平“0”keyval=3; / 可判断是 S3键被按下if(P17=0) / 如果检测到接 P1.7引脚的列线为低电平“0”keyval=4; / 可判断是 S4键被按下P1=0 xfd; / 第二行置为低电平“ 0”(P1.1输出低电平“0”)if(P14=0) / 如果检测到接 P1.4引脚的列线为低电平“ 0”keyval=5; / 可判断是 S5键被按下if(P15=0) / 如果检测到接 P1.5引脚的列线为低电平“0”keyval=6; / 可判断是 S6键被按下if(P16=0) / 如果检测到接 P1.6引脚的列线为低电平“0”keyval=7; / 可判断是 S7键被按

45、下if(P17=0) / 如果检测到接 P1.7引脚的列线为低电平“0”keyval=8; / 可判断是 S8键被按下P1=0 xfb; / 第三行置为低电平“ 0”(P1.2输出低电平“0”)if(P14=0) / 如果检测到接 P1.4引脚的列线为低电平“ 0”keyval=9; / 可判断是 S9键被按下if(P15=0) / 如果检测到接 P1.5引脚的列线为低电平“0”keyval=10; / 可判断是 S10键被按下if(P16=0) / 如果检测到接 P1.6引脚的列线为低电平 “0”keyval=11; / 可判断是 S11键被按下if(P17=0) / 如果检测到接 P1.7

46、引脚的列线为低电平 “0”keyval=12; / 可判断是 S12键被按下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 49 页 - - - - - - - - - P1=0 xf7; / 第四行置为低电平“ 0”(P1.3输出低电平“0”)if(P14=0) / 如果检测到接 P1.4引脚的列线为低电平“ 0”keyval=13; / 可判断是 S13键被按下if(P15=0) / 如果检测到接 P1.5引脚的列线为低电平“0”keyval=14; / 可判断是

47、S14键被按下if(P16=0) / 如果检测到接 P1.6引脚的列线为低电平 “0”keyval=15; / 可判断是 S15键被按下if(P17=0) / 如果检测到接 P1.7引脚的列线为低电平 “0”keyval=16; / 可判断是 S16键被按下 TR0=1; / 开启定时器 T0 TH0=(65536-500)/256; / 定时器 T0的高 8 位赋初值TL0=(65536-500)%256; / 定时器 T0的高 8 位赋初值 / 实例 78:矩阵式键盘按键音#include / 包含 51 单片机寄存器定义的头文件sbit sound=P37; / 将 sound位定义为

48、P3.7 /* 函数功能:蜂鸣器发声延时约120ms */ void delay_sound(void) unsigned char i; for(i=0;i250;i+) ; /* 函数功能:软件延时子程序约20ms */ void delay20ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ; /* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 49 页 - - - - - - - - -

49、 函数功能:主函数*/ void main(void) EA=1; / 开总中断ET0=1; / 定时器 T0中断允许TMOD=0 x01; / 使用定时器 T0的模式 1 TH0=(65536-500)/256; / 定时器 T0 的高 8 位赋初值TL0=(65536-500)%256; / 定时器 T0 的高 8 位赋初值TR0=1; / 启动定时器 T0 while(1) / 无限循环,等待键盘按下; /* 函数功能:定时器0 的中断服务子程序,进行键盘扫描,判断键位*/ void time0_interserve(void) interrupt 1 using 1 / 定时器 T0的

50、中断编号为 1,使用第一组寄存器 unsigned char i; TR0=0; / 关闭定时器 T0 P1=0 xf0; / 所有行线置为低电平“ 0”,所有列线置为高电平“ 1”if(P1&0 xf0)!=0 xf0) / 列线中有一位为低电平“ 0”,说明有键按下delay20ms(); / 延时一段时间、软件消抖if(P1&0 xf0)!=0 xf0) / 确实有键按下 for(i=0;i200;i+) / 让 P3.7引脚电平不断取反输出音频 sound=0; delay_sound(); sound=1; delay_sound(); TR0=1; / 开启定时器 T0 TH0=(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁