ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:59.47KB ,
资源ID:16476302      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16476302.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(整理51单片机键盘设置Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

整理51单片机键盘设置Word文档格式.docx

1、 JNB P1.6, RS7 ; S7按下,程序去执行RS7 JNB P1.7, RS8 ; S8按下,程序去执行RS8 AJMP START ; 继续扫描按键 .RS1: AJMP PK1 ;RS2: AJMP PK2 ;RS3: AJMP PK3 ;RS4: AJMP PK4 ;RS5: AJMP PK5 ;RS6: AJMP PK6 ;RS7: AJMP PK7 ;RS8: AJMP PK8 ; AJMP START ; 无键按下,继续扫描PK1: . ; 按键S1功能处理程序 AJMP START ; 处理S1按键后, 继续扫描PK2: 按键S2功能处理程序 AJMP START .P

2、K8: ; 按键S8功能处理程序 AJMP START ; 处理S8按键后, 继续扫描 连线简单,程序容易.缺点: 太浪费资源适用于按键较少、I/O口空闲的场合。三、行列式非编码键盘接口方法 按键较多时,一般采用行列式键盘.采用扫描方式,软件扫描方式有三种: 程序扫描方式: 当CPU空闲时,扫描键盘,判断有无键按下. 定时扫描方式: 利用CPU的定时器,每隔一定时间扫描一次键盘. 中断扫描方式: 在硬件上采用中断,有键按下时,产生中断, 由中断服务程序来处理.下面是16个按键,构成的44键盘行线: 四根,接P1.0-P1.3 列线: 四根,接P1.4-P1.7 程序扫描法原理: P1.0-P1

3、.3输出低电平,读P1.4P1.7,若全为1,无键按下若不全为1,有键按下 在有键按下的情况下,进一步判断是那个键按下 使P1.0-P1.3依次输出低电平,读P1.4-P1.7判断有无键按下子程序, 程序名: KAP键盘查询子程序KAP: MOV P1,#0F0H ;行线输出低电平,列线输出高电平 MOV A,P1 ;P1口读入A CPL A ;取反ANL A,#0F0H ;取高四位,即P1.4-P1.7RET程序出口: A=0, 则无键按下. A0 则有键按下.去抖动-延时10ms子程序: 程序名D10MSD10MS: MOV R6, #14H; DL: MOV R7,#0FFH; DJNZ

4、 R7,$ DJNZ R6,DL RETKINP: LCALL KAP ; 调键盘查询子程序, JNZ KP1 ; A0,有键按下 SJMP END_KINP ; A=0,无键按下,退出按键查询程序KP1: LCALL D10MS ;延时10MS,去抖动 LCALL KAP ;再次查询键盘, JNZ KP2 ; A0,确认有键按下 SJMP END_KINP ; A=0,误操作,重新查询KP2为取键值子程序KP2: MOV R2, #0FEH ; R2为行扫描值 MOV R4, #00H ; R4初值为第0行行首键号 CLR F0 ; F0=0表示正在扫描键盘KP4: MOV P1, R2 ;

5、 扫描行为低 MOV A, P1 ; 读P1 JB ACC.4, L1 ; 第0列不为低,则检查第1列 MOV A, #00H ; 为低,则行首键值送入A AJMP KP5 ; KP5L1: JB ACC.5, L2 ; 检查第一列 MOV A, #04H ; 第一列行首键值送入A AJMP KP5 L2: JB ACC.6 , L3 ; 检查第二列 MOV A, #08H ; 第二列行首键值送入A AJMP KP5L3: JB ACC.7 , NEXT ; 检查第三列,若为1,则检查下一行 MOV A, #0CH ; 第三列行首键值送入AKP5: ADD A , R4 ; A A+R4,键值

6、调整 PUSH A ;KP3: LCALL D10MS ; 后沿去抖动 LCALL KAP ; 查询按键是否释放 JNZ KP3 ; A0 未释放,继续查询 POP A ; 键已释放,弹出键值NEXT: INC R4 ; 下一列,行键值加1 MOV A , R2 ; 取扫描值 JNB ACC.3, END_KINP ; 判断扫描是否结束? RL A ; 下一个扫描值 MOV R2, A ; AJMP KP4 ;END_KINP: SETB F0 RET51单片机电子日历(电子时钟)程序2007-08-03 21:01:05|分类:默认分类|字号订阅程序代码:/*/* 电子日历,有时间显示、闹铃

7、、日期、秒表及键盘设置功能 */* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关 秒表模式下为记时开关/* 功能键B: 设置位数字-1/* 功能键C:设置模式及设置位选择 秒表模式下为清零键 */* 功能键D:在四种工作模式下切换 设置闹钟开关#include/*这里设置程序初始化时显示的时间*/#define SET_HOUR 12/*设置初始化小时*/#define SET_MINUTE 00/*设置初始化分钟*/#define SET_SECOND 00/*设置初始化秒数*/*系统地址*/#define BASE_PORT 0x8000/*选通基地址*/#define KEY_LIN

8、E BASE_PORT+1/*键盘行线地址*/#define KEY_COLUMN BASE_PORT+2/*键盘列线地址*/#define LED_SEG BASE_PORT+4/*数码管段选地址*/#define LED_BIT BASE_PORT+2/*数码管位选地址*/#define LED_ON(x) XBYTELED_BIT=(0x01#define LED_OFF XBYTELED_SEG=0x00/*LED显示空*/x)/*在设置模式下对秒分时的宏定义*/#define SECOND 0 /*对应数码管右边两位*/#define MINUTE 1 /*对应数码管中间两位*/#d

9、efine HOUR 2 /*对应数码管左边两位*/*定义四种工作模式*/#define CLOCK clockstr /*时钟模式*/#define ALART alartstr /*闹钟模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*/*以下是所有子函数的声明*/void sys_init(void); /*系统的初始化程序*/void display(void);/*动态刷新一次数码管子程序*/void clockplus(void);/*时间加1S的子程序*/void update_clockstr(void

10、);/*更新时间显示编码*/void update_alartstr(void); /*更新闹钟时间的显示编码*/void update_datestr(void);/*更新日期显示编码*/void update_timerstr(void); /*更新秒表时间的显示编码*/void deley(int); /*延时子程序*/void update_dispbuf(unsigned char *);/*更新显示缓冲区*/unsigned char getkeycode(void);/*获取键值子程序*/void keyprocess(unsigned char);/*键值处理子程序*/unsi

11、gned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*/*功能键功能子函数*/void Akey(void); /*当前设置位+1 开关闹钟 开关秒表*/void Bkey(void); /*当前设置位-1 开关闹钟 */void Ckey(void); /*设置位选择 秒表清零*/void Dkey(void); /*切换四种工作模式*/*全局变量声明部分*/unsigned char led10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/*从09的LED编码

12、*/unsigned char ledchar3=0x5c,0x54,0x71;/*o n f*/unsigned char key24=/* 键值代码数组 对应键位:*/0x70,0x71,0x72,0x73,0x74,0x75, 7 8 9 A TRACE RESET*/0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, 4 5 6 B STEP MON */0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, 1 2 3 C HERE LAST */0xe0,0xe1,0xe2,0xe3,0xe4,0xe5; 0 F E D EXEC NEXT */struct/*时间

13、结构体变量*/unsigned char s;unsigned char m;unsigned char h;clock=SET_SECOND,SET_MINUTE,SET_HOUR; /*闹铃时间结构体变量*/alart=SET_MINUTE,SET_HOUR; /*日期结构体变量*/ unsigned int year; unsigned char month; unsigned char day; date=6,1,1; /*秒表时间结构体变量*/ unsigned char ms; unsigned char s; unsigned char m; timer=0,0,0;unsign

14、ed char dispbuf6;/*显示缓冲区数组*/unsigned char clockstr6;/*时间显示的数码管编码数组*/unsigned char alartstr6;/*闹钟显示的数码管编码数组*/unsigned char datestr6;/*日期显示的数码管编码数组*/unsigned char timerstr6; /*秒表显示的数码管编码数组*/unsigned int itime=0,idot;/*定时器0中断计数*/unsigned char itime1=0;/*定时器1中断计数*/sbit P3_1=P31;/*外接蜂鸣器的管脚*/bdata bit IsS

15、et=0;/*设置模式标志位:正常走时 :设置模式*/bdata bit Alart_EN=0;/*闹铃功能允许位 :禁止闹铃 :允许闹铃*/bdata bit IsBeep=0; /*响铃标志位未响铃 :正在响铃*/unsigned char SetSelect=0;/*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/unsigned char *CurrentMode; /*标志当前正设置的功能,如CurrentMode=CLOCK或CurrentMode=ALART等*/void timerplus(void);/*函数部分*/void main(void) sys_init

16、();while(1)XBYTEKEY_COLUMN,0x00;/*给键盘列线赋全零扫描码,判断是否有键按下while(XBYTEKEY_LINE&0x0f)=0x0f)/*检测是否有键按下,无则一直进行LED的刷新显示*/ if(Alart_EN&(clock.h=alart.h)&(clock.m=alart.m) IsBeep=1; else IsBeep=0; P3_1=0; display(); keyprocess(getkeycode();/*有键按下时得到键值,并送入键值处理程序*/*可要可不要*/void sys_init(void)TMOD=0x22;/*定时器0和1都设置

17、为工作方式2,基准定时2502500us=0.5ms*/TH0=6; /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/ TH1=6; TL1=6; ET0=1; ET1=1; EA=1;TR0=1; update_clockstr(); /*初始化时钟显示编码数组*/ update_alartstr(); /*初始化闹钟显示编码数组*/ update_datestr(); /*初始化日期显示编码数组*/ update_timerstr(); /*初始化秒表显示编码数组*/ update_dispbuf(cl

18、ockstr);/*初始化显示缓冲数组*/ CurrentMode=CLOCK; /*默认的显示摸式为时钟*/ /*蜂鸣器接线引脚复位*/void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/itime+;if(itime=1000) if(IsSet) /*在设置模式下,对正在设置的位闪烁显示*/ dispbufSetSelect*2=0; /*对正在设置的位所对应的显示缓冲区元素赋0,使LED灭*/ dispbufSetSelect*2+1=0; if(IsBeep) P3_1=!P3_1;/*闹钟模式时,产生峰鸣器响脉冲*

19、/ if(CurrentMode=CLOCK) dispbuf2=dispbuf2&0x7f; dispbuf4=dispbuf4&if(itime=2000)/*两千次计数为1S 20000.5ms=1s*/ itime=0;/*定时1s时间到,软计数清零*/ clockplus();/*时间结构体变量秒数加1 */* 更新时间显示编码数组 */ if(CurrentMode!=TIMER) update_dispbuf(CurrentMode);/* 用时间编码数组更新显示缓冲区 */void timer1(void) interrupt 3 using 2 /*定时器1中断服务器,用来产

20、生1/100秒定时*/idot+;if(+itime1=20) /*20*0.5ms=10ms*/ itime1=0; timerplus(); if(CurrentMode=TIMER) update_dispbuf(timerstr); /*关闭小数点的显示*/ if(idot1000) /*闪烁显示小数点*/ dispbuf2=dispbuf2|0x80; dispbuf4=dispbuf4|0x80; elseif(idot=2000) idot=0;/*功能模块子函数*/void clockplus(void)/*时间加1s判断分,时子函数*/if(+clock.s=60)/*秒位判断*/clock.s=0;if(+clock.m=60)/*分位判断*/ clock.m=0; if(+clock.h=24)/*时位判断*/ clock.h=0; if(+date.day=(getmonthdays(date

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1