版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖南科技大学信息与电气工程学院课程设计报告 课 程: 单片微机与接口技术 题 目: 电子日历 专 业: 通信工程 班 级: 姓 名: 学 号: 任务书题 目电子日历时 间 安 排 2014-2015第二学期 第14-15周目 的:课程设计是对某门课程理论教学和实验教学的综合和总结。因此,开设单片机原理与应用这门课的课程设计对学生掌握单片机的应用技能是很有必要的。通过单片机原理与应用这门课的课程设计,学生应能对STC15系列单片机有一个全面的认识,掌握以STC15系列单片机为核心的电子电路的设计方法和应用技术要 求:1) 利用STC15F2K60S2单片机作为主控器组成一个电子日历和电子钟;2)
2、 利用LED分别显示当前时间和日历;3) 利用尽可能少的开关实现:校正日历和时间;4) 定制闹钟(时、分、表)。总体方案实现:本系统采用PCF8563时钟芯片进行计时,STC15F2K60S2单片机通过IIC总线进行数据读写,并采用IO方式控制两片74HC595芯片驱动8位数码管,数码管可以实时显示秒,分,小时,日期,月份和年等信息,并且实现闹铃功能时,数码管闪烁显示。阵列式键盘采用行列扫描方式,可以实现秒,分,小时,日期,月份和年信息的校准,以及时钟显示与日历显示的切换功能。指导教师评语: 评分等级:【 】指导教师签名: 目 录第一章设计要求及方案论证21.1设计要求21.2方案选择与论证2
3、1.2.1 计时方案21.2.2 按键方案21.2.3 显示方案2第二章系统设计方案22.1 总体设计方案22.2 硬件电路设计22.2.1微控制器22.2.2时钟接口电路设计22.2.3数码管显示电路22.2.4键盘接口电路22.3系统软件设计22.3.1系统软件方案说明22.3.2 时钟模块22.3.3 数码管显示模块22.3.4 矩阵键盘模块2第三章结论2第四章参考文献2附录A:系统总原理图2附录B:程序源码2摘 要本文提出了一种基于STC15F2K60S2单片机的电子日历设计方案。该方案以STC15F2K60S2单片机为主控制器,与时钟芯片PCF8563、按键输入、8位LED数码管显示
4、等电路模块组成硬件系统。以串行时钟日历芯片PCF8563记录日历和时间,它可以对年、月、日、时、分、和秒进行计时,并且具有闹钟功能。电子日历采用两片74HC595芯片作为LED数码管显示驱动,可以支持更多数码管的稳定显示,采用直观的数字显示在数码管上,并设有独立的按键控制,可以根据使用者的需要随时对时钟进行校准和时间选择,同时具有备用电源,停电时可以实现对系统的持续供电。此电子日历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。关键词:单片机;LED;PCF8563;电子日历;74HC595第一章 设计要求及方案论证1.1 设计要求1
5、) 利用STC15F2K60S2单片机作为主控器组成一个电子日历和电子钟;2) 利用LED分别显示当前时间和日历;3) 利用尽可能少的开关实现校正日历和时间;4) 定制闹钟(时、分、表)。1.2 方案选择与论证1.2.1 计时方案方案一:基本门电路搭建 用基本门电路来实现数字闹钟,电路结构复杂,故障系数大,不易调试。方案二:仅仅由单片机实现时钟功能单片机内部具有定时器,可方便实现定时功能,但由于系统晶振误差、温漂、中断响应时间的不确定性及定时器重新装载时间常数所带来的误差,决定它不能用来作为时钟的时间基准。方案三: 专用时钟芯片目前市场上已有很多实时时钟芯片,如DS12887、DS1302、P
6、CF8563和X1227等,芯片内都集成了时钟/日历功能,给时钟系统设计带来很多方便。因此计时功能以选专用时钟芯片为宜。在系统硬件设计时,串行总线接口较并行总线接口较为方便,系统设计选用PHILPS公司的串行接口总线实时时钟芯片为计时芯片PCF8563。1.2.2 按键方案方案一:阵列式键盘此类键盘是采用行列扫描方式,优点是当按键较多时可以降低占用单片机的I/O口数目,缺点是电路复杂且会加大编程难度。方案二:独立按键电路独立式按键电路,每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点是当按键较多时占用单片机的I/O数目较多,优点是电路设计简单,
7、且编程极其容易。本系统采用方案二。1.2.3 显示方案方案一:LED数码管显示数码管通过设置可以完成制作任务,经济耐用,但其显示不够直观、提供信息量少、不易理解等缺点。方案二:液晶显示屏液晶特别是具有汉字显示功能的液晶显示器,来实现显示功能,不仅可以实现基本的显示信息,而且可以显示丰富的符号指示信息以及文字指示信息,如AM/PM,闹钟符号等,信息量丰富且直观易懂。而且液晶显示有功耗低,体积小,重量轻,寿命长,不产生电磁辐射污染等优点。由于本系统要求显示内容不多,为了节省成本,系统采用方案一。第二章 系统设计方案2.1 总体设计方案本系统采用PCF8563时钟芯片进行计时,STC15F2K60S
8、2单片机通过IIC总线进行数据读写,并采用IO方式控制两片74HC595芯片驱动8位数码管,数码管可以实时显示秒,分,小时,日期,月份和年等信息,并且实现闹铃功能时,数码管闪烁显示。阵列式键盘采用行列扫描方式,可以实现秒,分,小时,日期,月份和年信息的校准,以及时钟显示与日历显示的切换功能。图 21 系统硬件总框图2.2 硬件电路设计2.2.1 微控制器本系统中采用STC15F2K60S2单片机作为主控制器,STC15F2K60S2系列单片机是深圳宏晶公司生产的单时钟机器周期,高速,高可靠,低功耗,超强抗干扰的新一代8051单片机。具有862K在系统可编程Flash存储器,最多42个IO口线,
9、6个定时器,内部高精度R/C时钟,内部时钟从535Mhz可选。2.2.2 时钟接口电路设计本系统的重要部分在于时钟功能模块,这里选用串行日历时钟芯片PCF8563。与采用并行总线与单片机进行数据通信的时钟芯片相比,PCF8563与单片机的连线大为减少,极大的节省了单片机的系统资源。PCF8563具有内部时钟电路、内部震荡电路、内部低电压检测及两线制IIC总线通信方式,不但使用外围电路简洁,而且增加了芯片的可靠性。时钟芯片与单片机的接口电路如图所示。图 22 时钟芯片接口电路PCF8563采用了IIC总线接口,虽然总线时序关系复杂,但我们可以利用PHILIPS公司提供的软件包,使得编程极为简单,
10、可靠性极强。在设计中我们主要用到了PCF8563的计时功能和报警功能。PCF8563内部共有16个寄存器。其中00H,01H为控制方式寄存器,02H08H为时间寄存器,09H0CH为报警功能寄存器,0DH为时钟输出寄存器,0EH 和0FH为定时器功能寄存器。其中报警和时间寄存器的位描述如表所示。表 2-1 BCD格式寄存器地址寄存器名称Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit002h秒VL0059 BCD码格式数03h分钟-0059 BCD码格式数04h小时-0023 BCD码格式数05h日-0131 BCD码格式数06h星期-0607h月/世纪C-0012 BCD码格式
11、数08h年0099 BCD码格式数09h分钟报警AE0059 BCD码格式数0Ah小时报警AE-0023 BCD码格式数0BH日报警AE-0131 BCD码格式数0CH星期报警AE-06可以看出芯片内部时间寄存器和报警寄存器在地址上是连在一起的,并且数据全部是以BCD码形式存放的,这样使得数据读写和处理变得相当简洁和便利。在本设计中,PCF8563通过SCL、SDA与单片机相连,其中SCL为时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于行数据的输入输出;/INT是中断信号输出端,可通过设置报警寄存器按指定时间在该脚产生报警信号,低电平有效;SDA、SCL、/INT均
12、为漏极开路,必须接上拉电阻。PCF8563 共有四种报警方式,分别为小时报警(每小时的同一分钟时刻报警),日报警(每天的同一小时时刻报警),月报警(每月的同一天时刻报警)和星期报警(每星期的同一天时刻报警)。发生报警时在/INT引脚产生一个中断,低电平有效,同时在PCF8563的内部产生中断标志AF。软件清AF后就清除了/INT上的中断信号。我们在设计中联合应用了PCF8563的小时报警、日报警和月报警的功能。即可以设定每个月某日的某时某分为闹铃时刻。报警时,/INT的低电平使单片机产生中断,在中断服务程序中,单片机控制数码管闪烁以提示闹钟。(但由于本系统使用的单片机开发板中/INT引脚未与单
13、片机连接,故使用软件方式实现闹钟,即软件实现时间匹配)。2.2.3 数码管显示电路本系统采用共阴数码管显示时间、日历信息以及提示闹钟时间到,显示格式为“时-分-秒”和“年-月-日”以及“-”闪烁。接口电路如图所示。图 2-3 数码管显示电路使用了两片74HC595分别驱动8位数码管的位选端口及段选端口,74HC595是带锁存功能的三态输出的8位串行输入/并行输出的移位寄存器。由于它自带锁存器,所以其数据在移位寄存器中的移位与锁存器的输出是独立的,当数据移位时,可以保持锁存器输出的数据不改变,等所有8位数据全部串入完成移位操作后,一次性的将数据打入锁存器中,从而实现了并行输出的同步改变。另外该芯
14、片可以进行级联,能够实现8Xn个并口扩展。2.2.4 键盘接口电路在设计键盘接口电路时,采用扫描法识别按键,我们使用XY方法查找4*4矩阵键盘的方法,其中P0.0,P0.1,P0.2,P0.3,P0.4,P0.5,P0.6,P0.7连接STC15F2K60S2单片机作为输出端口,其具体的接口电路如图所示。图 2-4 键盘接口电路2.3 系统软件设计2.3.1 系统软件方案说明软件系统在本设计中尤其重要,基本功能大部分是由软件完成的,发挥功能的关键控制部分同样需要软件的密切配合才能顺利实现。考虑本人对各大计算机高级语言的熟悉程度,本系统采用C语言编程。 整个软件系统采用自顶向下模块化的程序设计方
15、法,共分为上级的主程序模块和下级的时间设定、闹铃设定两个部分。软件系统的主要特点是整个过程完全在键盘的控制之下,实现了完全的友好的人机交互功能。主程序通过查询键盘的输入情况调用不同的子程序。子程序的功能实现也是在键盘的配合之下完成的。图 2-5 系统软件总框图2.3.2 时钟模块1) 使用Timer0的16位自动重装产生1ms节拍,程序运行于这个节拍下。2) 单片机通过IIC总线向PCF8563的秒,时,分,日,月,年寄存器写入时间初值,注意写入初值前要进行十进制与BCD码的转换。3) 每秒钟单片机通过IIC总线读取PCF8563各时间寄存器内的数据,并进行数据处理,即屏蔽无效位,以实现准确读
16、取时钟信息。4) 单片机通过IIC总线读取PCF8563寄存器中数据的过程为主机依次发送起始信号,从机器件地址及写信号,发送存储单元地址。主机再次发送起始信号,从机器件地址及读信号,读取从机寄存器中的数据,接收应答信号,发送停止信号,完成数据读写过程。写过程同上。2.3.3 数码管显示模块1) 将所有LED的一端负极连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示时间信息的目的。2) 74HC595是8位串行输入转并行输出移位寄存器。两片74HC595分别控制8位数码管的段选及位选。3) 串行输入,先将移位寄存器控制引脚置为低,取数据的最高位,将数
17、据的次高位移到最高位,再将SCL置为高,产生移位时钟上升沿,上升沿时,数据寄存器的数据移位。4) 并行输出,将存储器引脚置为低,再置为高,产生移位时钟上升沿,上升沿时,移位时钟寄存器的数据进入数据存储寄存器,当使能 OE时(为低电平),存储寄存器的数据输出到总线,更新显示数据。2.3.4 矩阵键盘模块本系统中,4*4矩阵键盘14行的行线连接到P0.4P0.7,14列的列线连接到P0.0P0.3。当有键按下时,高电平的低四位,也就是按下去的那一行的行线会变低,为低电平,这时就进入循环进行判断,这里进行行判断。当行判断完后,因为单片机执行程序需要的时间很少,这时按键还没有释放,因此按下去
18、的这个按键的列线会变低电平,所以进入列循环判断。由以上行列扫描的方式,即可确定按键。第三章 结论本次设计用STC15F2K60S2单片机、PCF8563、矩阵键盘和8位数码管实现电子时钟,该电路比较简单。它主要是通过8位数码管来显示时间信息,通过不同的按键来进行时钟/日历的切换,及时钟日历的校准。通过这次课程设计,我碰到了许多平时的学习过程中没有遇到的问题,比如查看芯片的datesheet,根据芯片操作方法及相应时序来编写程序等。在设计过程中我很好的回顾了专业知识,利用软件编程也提高了我对单片机编程的能力。并且我也用到了以前学习中用到的软件,比如Altium Designer,Keil c51
19、和STC烧写等软件。当然,在设计电路的过程中,由于自己知识的匮乏,也遇到了很多的困难。比如PCF8563的数据手册没有看明白,导致编写时钟读写程序时绕了很大的弯路,最终找了大量的参考程序才将其完成。其次就是在查阅相关资料的时候,常常不能有针对性地去查找,至使浪费了大量的时间。然而,在整个设计过程中,让我感触最深刻的是课程设计不仅让我初步地了解到一个产品的开发流程。还培养了我们勇于探索、严格推理、用实践去检验理论的严谨治学态度。在整个设计中遇到了许多平时没有遇到的困难,有时候做不出结果让人很灰心,但庆幸的是失败并没有让我怀疑自己的能力,而是促使我更加努力的进行设计,在查阅了许许多多的资料,请教相
20、应课程老师,与同学的讨论之后,我最终完成了此次课程设计。这次的课程设计耗时两周,从查找资料确定研究课题及方向,画原理图,编写程序,最后撰写课程设计报告。最大的感受是完完全全做好一件事不容易,要考虑到各方面的问题,把问题统一起来看,才能做好一件事,希望我在将来的时间里认真做好每一件事,用坚韧不拔的态度面对每一个挑战。第四章 参考文献1 张帆,史彩成.单片机应用M.北京:电子工业出版社,2009.2 苏荣,胡莲. 数码管应用J .电脑知识与技术,2014,(14):51-53.3 黄勋,季彦呈.基于PCF8563的电子时钟设计J .信息化研究,2012,(04):12. 4 徐东阳,徐东怀.基于S
21、TC89C52的电子时钟J.电子世界, 2014,(21):2-8.5 黄勇,方海斌.单片机课程设计实例指导R.北京:中国电子科学研究院.1999.6 陈启美,丁传锁. 单片微型计算机及其应用M.南京:南京大学出版社,2003.7 李英伟,王成儒,练秋生,等.USB2.0单片机开发(第2版)M.北京:国防工业出版社,2007.8 吴金戎,沈庆阳,郭庭吉.89C52单片机实践与应用M.北京: 清华大学出版社.1998.附录A:系统总原理图附录B:程序源码#define MAIN_Fosc22118400L/定义主时钟#include"STC15Fxxxx.H&qu
22、ot;/*/#define DIS_DOT0x20#define DIS_BLACK0x10#define DIS_0x11/*定义用户宏*/#defineTimer0_Reload(65536UL -(MAIN_Fosc / 1000)/Timer 0 中断频率 500次/秒/*/*本地常量声明*/u8 code t_display=/标准字库/ 0 1 2 3 4 5 6 7 8 9 A B C D E F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,/black - H J
23、K L No P U t G Q r M y0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46;/0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1u8 code T_COM=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;/位码/*IO口定义*/sbitP_HC595_SER = P40;/pin 14SERdata inputsb
24、itP_HC595_RCLK = P54;/pin 12RCLkstore (latch) clocksbitP_HC595_SRCLK = P43;/pin 11SRCLKShift data clock/*本地变量声明*/u8 LED88;/显示缓冲u8display_index;/显示位引索bitB_1ms;/1ms标志u8 IO_KeyState, IO_KeyState1, IO_KeyHoldCnt;/行列键盘变量u8KeyHoldCnt;/键按下计时u8KeyCode;/给用户使用的键码,116有效u8cnt50ms;u8hour,minute,second;/RTC变量u8ye
25、ar,month,date;/日历变量u16msecond;u8 m;u8 flag=0;u8 flaging=1;u16 k=0;/*闹钟参数*/u8 u=34;u8 v=20;u8 w=19; unsigned char tt2=0x06,0x16; /15-06-17unsigned char tt01=0x23;unsigned char newtime3=0x55,0x19,0x19; /19:19:55/unsigned char Clk2=0x20,0x19;/*本地函数声明*/voidCalculateAdcKey(u16 adc);voidIO_KeyScan(void);/
26、50ms callvoidWriteNbyte(u8 addr, u8 *p, u8 number);voidReadNbyte( u8 addr, u8 *p, u8 number);voidDisplayRTC(void);voidDisplayCadendar(void);void DisplayAlarm(void);voidReadRTC(void);voidWriteRTC(void);voidReadCadendar(void);voidWriteCadendar(void);void delay_ms(u8 ms);/*外部函数声明和外部变量声明 */void main(voi
27、d)u8i;P0M1 = 0;P0M0 = 0;/设置为准双向口P1M1 = 0;P1M0 = 0;/设置为准双向口P2M1 = 0;P2M0 = 0;/设置为准双向口P3M1 = 0;P3M0 = 0;/设置为准双向口P4M1 = 0;P4M0 = 0;/设置为准双向口P5M1 = 0;P5M0 = 0;/设置为准双向口P6M1 = 0;P6M0 = 0;/设置为准双向口P7M1 = 0;P7M0 = 0;/设置为准双向口display_index = 0;AUXR = 0x80;/Timer0 set as 1T, 16 bits timer auto-reload, TH0 = (u8)
28、(Timer0_Reload / 256);TL0 = (u8)(Timer0_Reload % 256);ET0 = 1;/Timer0 interrupt enableTR0 = 1;/Tiner0 runEA = 1;/打开总中断for(i=0; i<8; i+)LED8i = 0x10;/上电消隐WriteNbyte(2,newtime,3);ReadRTC();WriteNbyte(5,tt0,1);WriteNbyte(7,tt,2);ReadCadendar();F0 = 0;if(second >= 60)F0 = 1;if(minute >= 60)F0 =
29、 1;if(hour >= 24)F0 = 1;if(date >= 31)F0 = 1;if(month >= 12)F0 = 1;if(year >= 99)F0 = 1;if(F0)/ 初始时间12:00:00 15-1-1second = 0;minute = 0;hour = 12;WriteRTC();date = 1 ;month= 1 ;year = 15 ;WriteCadendar(); DisplayRTC();LED82 = DIS_;LED85 = DIS_;KeyHoldCnt = 0;KeyCode = 0;IO_KeyState = 0;
30、IO_KeyState1 = 0;IO_KeyHoldCnt = 0;cnt50ms = 0;while(1) while(flag=0) if(B_1ms)/1msB_1ms = 0;if(u=second)&&(v=minute)&&(w=hour)for(m=0;m<3;m+)DisplayAlarm();if(+msecond >= 500)/1Ãëµ½msecond = 0;ReadRTC();DisplayRTC();if(+cnt50ms >= 50)/50ms扫描一次行列键盘cnt50ms
31、 = 0;IO_KeyScan();if(KeyCode != 0)/有键按下if(KeyCode = 17)/hour +1if(+hour >= 24)hour = 0;WriteRTC();DisplayRTC();if(KeyCode = 18)/hour -1if(-hour >= 24)hour = 23;WriteRTC();DisplayRTC();if(KeyCode = 19)/minute +1second = 0;if(+minute >= 60)minute = 0;WriteRTC();DisplayRTC();if(KeyCode = 20)/m
32、inute -1second = 0;if(-minute >= 60)minute = 59;WriteRTC();DisplayRTC();if(KeyCode = 21)flag=1;KeyCode = 0; while(flag =1) if(k>202) DisplayCadendar(); k=0; if(+cnt50ms >= 50)cnt50ms = 0;IO_KeyScan();if(KeyCode !=0) if(KeyCode = 22) flag=0; if(KeyCode = 25)/year +1 KeyCode =0;if(+year >=
33、 99)year = 0;WriteCadendar();DisplayCadendar();/while(1); if(KeyCode = 26)/year -1 KeyCode =0;if(-year >= 100)year =99;WriteCadendar();DisplayCadendar(); if(KeyCode = 27)/month +1 KeyCode =0;if(+month >= 13)month = 1;WriteCadendar();DisplayCadendar(); if(KeyCode = 28)/month -1 KeyCode =0;if(-m
34、onth >= 13)month = 12;WriteCadendar();DisplayCadendar(); if(KeyCode = 29)/date +1 KeyCode =0;if(+date >= 32)date = 1;WriteCadendar();DisplayCadendar(); if(KeyCode = 30)/date -1 KeyCode =0;if(-date >= 32)date = 31;WriteCadendar();DisplayCadendar(); k+; /*/* 显示时钟函数*/voidDisplayRTC(void)if(hou
35、r >= 10)LED80 = hour / 10;elseLED80 = DIS_BLACK;LED81 = hour % 10;LED82 = DIS_;LED83 = minute / 10;LED84 = minute % 10;LED86 = second / 10;LED87 = second % 10;/* 显示日历函数 */voidDisplayCadendar(void)if(year >= 10)LED80 = year / 10;elseLED80 = DIS_BLACK;LED81 = year % 10;LED82 = DIS_;LED83 = month
36、 / 10;LED84 = month % 10;LED86 = date / 10;LED87 = date % 10;/*显示闹钟函数*/void DisplayAlarm(void)LED80 = DIS_;LED81 = DIS_;LED82 = DIS_;LED83 = DIS_;LED84 = DIS_;LED86 = DIS_;LED87 = DIS_;delay_ms(1);LED80 = DIS_BLACK;LED81 = DIS_BLACK;LED82 = DIS_BLACK;LED83 = DIS_BLACK;LED84 = DIS_BLACK;LED86 = DIS_B
37、LACK;LED87 = DIS_BLACK;/*读RTC函数*/voidReadRTC(void)u8tmp3;ReadNbyte(2, tmp, 3);second = (tmp0 >> 4) & 0x07) * 10 + (tmp0 & 0x0f);minute = (tmp1 >> 4) & 0x07) * 10 + (tmp1 & 0x0f);hour = (tmp2 >> 4) & 0x03) * 10 + (tmp2 & 0x0f);/*写RTC函数*/voidWriteRTC(void)u8tm
38、p3;tmp0 = (second / 10) << 4) + (second % 10);tmp1 = (minute / 10) << 4) + (minute % 10);tmp2 = (hour / 10) << 4) + (hour % 10);WriteNbyte(2, tmp, 3);/* 读Cadendar函数 */voidReadCadendar(void)u8cad3;ReadNbyte(5, cad, 1);ReadNbyte(7, cad+1, 2);date = (cad0 >> 4) & 0x03) * 10
39、+ (cad0 & 0x0f);month = (cad1 >> 4) & 0x01) * 10 + (cad1 & 0x0f);year = (cad2 >> 4) * 10 + (cad2 & 0x0f);/*写Cadendar函数*/voidWriteCadendar(void)u8cad3;cad0 = (date / 10) << 4) + (date % 10);cad1 = (month / 10) << 4) + (month % 10);cad2 = (year / 10) << 4)
40、 + (year % 10);WriteNbyte(5, cad, 1); WriteNbyte(7, cad+1, 2);/*行列键扫描函数使用XY查找4x4键的方法,只能单键,速度快 Y P04 P05 P06 P07 | | | |X | | | |P00 - K00 - K01 - K02 - K03 - | | | |P01 - K04 - K05 - K06 - K07 - | | | |P02 - K08 - K09 - K10 - K11 - | | | |P03 - K12 - K13 - K14 - K15 - | | | |*/u8 code T_KeyTable16 =
41、 0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0;void IO_KeyDelay(void)u8 i;i = 60;while(-i);voidIO_KeyScan(void)/50ms callu8j;j = IO_KeyState1;/保存上一次状态P0 = 0xf0;/X低,读YIO_KeyDelay();IO_KeyState1 = P0 & 0xf0;P0 = 0x0f;/Y低,读XIO_KeyDelay();IO_KeyState1 |= (P0 & 0x0f);IO_KeyState1 = 0xff;/取反if(j = IO_KeyState1)
42、/连续两次读相等j = IO_KeyState;IO_KeyState = IO_KeyState1;if(IO_KeyState != 0)/有键按下F0 = 0;if(j = 0)F0 = 1;/第一次按下else if(j = IO_KeyState)if(+IO_KeyHoldCnt >= 20)/1s后重建IO_KeyHoldCnt = 18;F0 = 1;if(F0)j = T_KeyTableIO_KeyState >> 4;if(j != 0) && (T_KeyTableIO_KeyState& 0x0f != 0) KeyCode
43、= (j - 1) * 4 + T_KeyTableIO_KeyState & 0x0f + 16;/计算键码1732elseIO_KeyHoldCnt = 0;P0 = 0xff;/* 向HC595发送一个字节的函数 */void Send_595(u8 dat)u8i;for(i=0; i<8; i+)dat <<= 1;P_HC595_SER = CY;P_HC595_SRCLK = 1;P_HC595_SRCLK = 0;/* 显示扫描函数*/void DisplayScan(void)Send_595(T_COMdisplay_index);/输出位码Sen
44、d_595(t_displayLED8display_index);/输出段码P_HC595_RCLK = 1;P_HC595_RCLK = 0;/锁存输出数据if(+display_index >= 8)display_index = 0;/8位结束回0/* Timer0 1ms中断函数 */void timer0 (void) interrupt TIMER0_VECTORDisplayScan();/1ms扫描显示一位B_1ms = 1;/1ms标志#define SLAW0xA2#define SLAR0xA3sbitSDA= P11;/定义SDA PIN5sbitSCL= P10;/定义SCL PIN6/*/voidI2C_Delay(void)/for normal MCS51,delay (2 * dly + 4) T, for S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 架线维护工安全宣贯模拟考核试卷含答案
- 兽医化验员岗前实操效果考核试卷含答案
- 钢水罐准备工安全生产能力强化考核试卷含答案
- 木屋架工操作管理考核试卷含答案
- 26年VEGFR表达检测与用药适配
- 26年ECOG评分关联核心要点
- 2025年医保知识考试题库及答案:医保患者权益保障政策解读试题答案
- 八年级地理下册期末测试卷
- 2023年军队文职人员公开招聘笔试《戏剧与影视》押题卷(含答案)
- 2026年测绘无人机操作员高级工模拟试卷及参考答案
- 垃圾清运服务投标方案技术方案
- 海运公司船员合同
- JT-GQB-008-1996公路桥涵标准图整体式钢筋混凝土连续板桥上部构造
- 跳远 教案(大学体育专业)
- 23悬挑花架梁悬挑支模架专项施工方案
- (高清版)DZT 0279.32-2016 区域地球化学样品分析方法 第32部分:镧、铈等15个稀土元素量测定 封闭酸溶-电感耦合等离子体质谱法
- 工程管理的前沿研究方向
- 脑机接口在医疗中的应用
- ISO27001-2022信息安全管理体系内审全套记录表格
- NY/T 388-1999畜禽场环境质量标准
- LY/T 1000-2013容器育苗技术
评论
0/150
提交评论