凌阳十位单片机电子时钟程序_第1页
凌阳十位单片机电子时钟程序_第2页
凌阳十位单片机电子时钟程序_第3页
免费预览已结束,剩余31页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ / The information contained herein is the exclusive property of/ Sunnnorth Technology Co. And shall not be distributed, reproduced,/ or disclosed in whole in part without prior written permission./ (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO./ ALL RIGHTS RESERVED/ The entire notice above must be rep

2、roduced on all authorized copies. /=/=/工程名称:ex3_Clock/功能描述 :实验指导书综合实验/电子时钟/通过按键设置时钟,按确认键后,时钟运行。/IDE 环境:SUNPLUS u'nSPTM IDE 1.8.0 ( or later)/涉及的库:CMacro1016.lib/组成文件:main.c/isr.asm/Dig.asm/Key.asm/system.asm/Dig.inc/SPCE061A.inc/Key.inc/Dig.h/SPCE061A.h/Key.h/硬件连接:IOA 口低 8 位连接 1*8 数码管的段选/IOB 口 I

3、OB15 、 IOB14 、 IOB13 、 IOB12 、 IOB2 、 IOB1 、 IOB0 连接位选/IOA 口高 8 位连接 4*4 键盘/日期:2005-10-14 v1.0/=/=/ 文件名称:main.c/功能描述:时钟时间设置和显示/维护记录:2005-10-14 v1.0/=#include "Key.h"#include "Dig.h"#include "SPCE061A.h" typedef unsigned char uchar;#define KEY_DEL11#define KEY_ENT12#defin

4、e YESCarryFlag 1#define ClearCarryFlag 0#define YESIntFlag 1#define ClearIntFlag 0#define true 1#define false 0unsigned int INTflag;unsigned int KeyVal;unsigned int KeyDownTimes;unsigned int KeycodeLED6 ; unsigned int EnterFg ;下 0 无确认键按下unsigned int secFlag,minFlag,hourFlag; void clockPro(void);/保存按

5、键次数/ 保存显示的 LED 数字/ 按确认键标识 1、有确认键按/ 时钟处理函数unsigned int SetKeyValPro(void);unsigned int KeyDataChange(unsigned int Key_Data); 值转换成程序所需要的/设置时钟值的合法性检测函数/键值转换子程序, 把 4X4 键盘的键unsigned int g_Data11 0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f;/0, 1, 2, 3, 4, 5, 6,7,/8,9/=/语法格式:int m

6、ain(void)/实现功能:时钟设置及显示/参数:无/返回值:无/= int main()unsigned int i;KeyDownTimes = 0;INTflag = 0;EnterFg = 0;i = 0;Key_Init();括 IRQ6 的 TMB2 128Hz 中断 DIG_Init();口以及 IRQ4 的 1KHz 中断/键盘扫描初始化,包/显示初始化,初始端while(1)if(EnterFg = 0)/ 判断是否已按下过 "确认 "键? KeyVal = Key_Get();/获取键值/转换键值,无键按下/返回 0xffswitch(KeyVal)c

7、ase KEY_DEL:/删除键处理if(KeyDownTimes>0) KeyDownTimes-; break;case 0xff:/无效的键值break;case KEY_ENT: if(KeyDownTimes=6)SP_INT_IRQ5();EnterFg = true; break; default:if(KeyDownTimes<6) KeycodeLEDKeyDownTimes = KeyVal; if(SetKeyValPro()= true) KeyDownTimes+;break;/确认键处理/数字键处理for(i=0;i<6;i+)DIG_Set(i+

8、1,g_DataKeycodeLEDi);/ 显示所有键值即时钟clockPro();F_ClearWatchdog();/=/时钟数据处理/清看门狗/语法格式:unsigned int KeyDataChange(unsigned int Key_Data)/实现功能:键值转换子程序/参数: Key_Data- 机器码/返回值: 012,其中 09 为数字键, 10、 11、 12 为功能键; / 0xff ,不合法的键输入KeyVal = KeyDataChange(KeyVal);或对于本程序无用的键按下时/ unsigned int KeyDataChange(unsigned int

9、 Key_Data) switch(Key_Data) case KEY_0Key_Data =7;break;case KEY_1Key_Data =8;break;case KEY_2Key_Data =9;break;case KEY_3Key_Data =0xff;break;case KEY_4Key_Data =4;break;case KEY_5Key_Data =5;break;case KEY_6Key_Data =6;break;case KEY_7Key_Data =0xff;break;case KEY_8Key_Data =1;break;case KEY_9Key_

10、Data =2;break;case KEY_A: Key_Data = 3;break; case KEY_B: Key_Data = 0xff;break; case KEY_C: Key_Data = 11;break;case KEY_D: Key_Data = 0;break; case KEY_E: Key_Data = 0xff;break;case KEY_F: Key_Data = 12;break; default: Key_Data = 0xff;break; return Key_Data;/ /语法格式: void SetKeyValPro(void)/实现功能: 设

11、置时钟数据和发行检测函数名称/参数: 无/返回值:1-合法;/0-不合法;/= unsigned int SetKeyValPro(void)uchar flag; switch(KeyDownTimes)/小时高位case 0 : if(KeycodeLEDKeyDownTimes<3) flag = true;else flag = false;break;case 1: if(KeycodeLEDKeyDownTimes-1=2 )if(KeycodeLEDKeyDownTimes<5) flag = true;elseflag = false;else flag = tru

12、e;break;case 2:case 4:if(KeycodeLEDKeyDownTimes<6)位flag = true;else flag = false;break;case 3:case 5:flag = true;break;位default: flag = false;break;return(flag);/小时低位/秒和分的高/秒和分的地/= /语法格式: void clockPro()/描述功能: 时钟处理函数/参数: 无/返回值: 无/= void clockPro(void)/秒处理while(INTflag=1)INTflag = ClearIntFlag;if(

13、KeycodeLED4 = 5 && KeycodeLED5 = 9) 否需回零KeycodeLED4 = 0; 回零KeycodeLED5 = 0; secFlag = YESCarryFlag; 标识else if(KeycodeLED5=9) KeycodeLED5= 0;KeycodeLED4+;else KeycodeLED5+;/判断秒是/ 如果为 59/设置秒进位/否则秒加while(secFlag=1)secFlag = ClearCarryFlag;if(KeycodeLED2 = 5 && KeycodeLED3 =9) 否需回零Keycod

14、eLED2 = 0; 回零KeycodeLED3 = 0; minFlag = YESCarryFlag;/分处理/判断分是/ 如果为 59/设置分进位标识 elseif(KeycodeLED3=9) KeycodeLED3= 0;KeycodeLED2+;/否则分加/时处理/判断时是/ 如果为 23/设置时进位/否则时加else KeycodeLED3+;while(minFlag=1)minFlag = ClearCarryFlag;if(KeycodeLED0=2 && KeycodeLED1 =3) 否需回零KeycodeLED0 = 0; 回零KeycodeLED1

15、= 0; hourFlag = YESCarryFlag; 标识 elseif(KeycodeLED1=9)KeycodeLED1= 0;KeycodeLED0+;else KeycodeLED1+;中断服务函数.INCLUDE SPCE061A.inc.INCLUDE key.inc.INCLUDE Dig.inc.IRAM/ 进入中断的计数器.PUBLIC sum;.VAR sum=0.TEXT .PUBLIC _IRQ5;.PUBLIC _IRQ6;/.external sum;.external _INTflag;.external F_Key_Scan/= /函数: FIQ() ,

16、IRQ0(),IRQ1(),IRQ2(),IRQ3(),IRQ4(),IRQ5(),IRQ6(),IRQ7()/语法: void FIQ(void ),void IRQ0(void ),void IRQ1(void ),void IRQ2(void ),void IRQ3(void ),/void IRQ4(void ),void IRQ5(void ),void IRQ6(void ),void IRQ7(void )/描述: FIQ() ,IRQ0(),IRQ1(),IRQ2(),IRQ3(),IRQ4(),IRQ5(),IRQ6(),IRQ7()中断服务子程序/参数:无/返回:无 /=

17、.PUBLIC _IRQ4_IRQ4:/ 数码管显示, F_DIG_Drive 函数在push r1,r5 to sp r1 = C_IRQ4_1KHz test r1,P_INT_Ctrl jnz ?L_IRQ4_1KHz r1 = C_IRQ4_2KHz test r1,P_INT_Ctrl jnz ?L_IRQ4_2KHz ?L_IRQ4_4KHz:call F_DIG_DriveDig.asm 中定义r1 = C_IRQ4_4KHz P_INT_Clear = r1pop r1,r5 from sp reti?L_IRQ4_2KHz: P_INT_Clear = r1 pop r1,r

18、5 from sp reti?L_IRQ4_1KHz: P_INT_Clear = r1 pop r1,r5 from sp reti/ _IRQ5:push r1,r4 to sp;r1 =0x0008; test r1,P_INT_Ctrl; jnz L_4Hz;/定时 1 秒的中断程序/ Timer A FIQ entrencer1 = 0x0004; P_INT_Clear = r1;r1 = sum r1 += 1;/清中断/取时基信号量cmp r1,2; je loop0;sum=r1pop r1,r4 from sp; reti;/保存时基信号量loop0:r1 = 0x0001

19、; _INTflag = r1;r1 = 0 sum = r1 pop r1,r4 from sp; reti;L_4Hz: r1 = 0x0008;/设置中断标识/清中断P_INT_Clear = r1; pop r1,r4 from sp; reti;/_IRQ6:push r1,r4 to sp; r1=0x0001;test r1,P_INT_Ctrl;jnz _IRQ6_TMB2; r1=0x0002;P_INT_Clear=r1;pop r1,r4 from sp;reti;_IRQ6_TMB2:P_INT_Clear=r1;call F_Key_Scan;/扫描键盘pop r1,

20、r4 from sp;reti;/= / isr.asm 结束/=/=/ The information contained herein is the exclusive property of/ Sunnnorth Technology Co. And shall not be distributed, reproduced,/ or disclosed in whole in part without prior written permission./ (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO. / ALL RIGHTS RESERVED/ T

21、he entire notice above must be reproduced on all authorized copies. /= / 文件名称: Dig.asm/ 实现功能:共阴数码管显示驱动程序,使用 IRQ4_4KHz 中断 / 日期: 2005/12/2 / /=/ LED 段控制端口设定/=.DEFINE SEG_IO_Port/.DEFINE SEG_IO_Port.DEFINE SEG_IO_HighByte /.DEFINE SEG_IO_HighByte 定义0 / 若 LED 段选使用 IOA 口则采用该行定义1 / 若 LED 段选使用 IOB 口则采用该行定义

22、0 / 若 LED 段选使用 IO 口低 8 位则采用该行定义1 / 若 LED 段选使用 IO 口高 8 位则采用该行/=/ LED 位控制端口设定/=/.DEFINE DIG_IO_Port0/ 若 LED 位选使用IOA 口则采用该行定义.DEFINE DIG_IO_Port1/ 若 LED 位选使用 IOB口则采用该行定义/ 数码管的位数/.DEFINE DIG_Count6/ 数码管每一位的控制脚设定/.DATAPIN_DIG:.DW 0x8000,0x4000,0x2000,0x1000,0x0004,0x0002,0x0001/ 数码管所有位的控制脚设定,应等于PIN_DIG 所

23、有数之和.DEFINE PIN_DIG_ALL 0xf007/=/ 不必修改下面的定义/= .IF SEG_IO_Port=0.DEFINE P_SEG_Data0x7000.DEFINE P_SEG_Buf0x7001.DEFINE P_SEG_Dir0x7002.DEFINE P_SEG_Attrib 0x7003 .ELSE.DEFINE P_SEG_Data0x7005.DEFINE P_SEG_Buf0x7006.DEFINE P_SEG_Dir0x7007.DEFINE P_SEG_Attrib 0x7008 .ENDIF .IF SEG_IO_HighByte=0.DEFINE

24、PIN_SEG_ALL0x00ff.ELSE.DEFINE PIN_SEG_ALL0xff00.ENDIF .IF DIG_IO_Port=0.DEFINE P_DIG_Data0x7000.DEFINE P_DIG_Buf0x7001.DEFINE P_DIG_Dir0x7002.DEFINE P_DIG_Attrib 0x7003 .ELSE.DEFINE P_DIG_Data0x7005.DEFINE P_DIG_Buf0x7006.DEFINE P_DIG_Dir0x7007.DEFINE P_DIG_Attrib 0x7008.ENDIF/=/ 中断常量定义/=0x702d0x004

25、0.DEFINE P_INT_Mask.DEFINE C_IRQ4_4KHz/=/ 变量定义/=.RAMR_DIG_Buf:.IRAM.DWDIG_Count DUP (?)/ 数码管显示缓冲区R_CurDIG: 不显示.DW0xffff/ 当前显示的数码管位, 0xffff 表示/=/ 公有函数声明/=.PUBLIC F_DIG_Init.PUBLIC _DIG_Init.PUBLIC F_DIG_Set.PUBLIC _DIG_Set.PUBLIC F_DIG_SetAll.PUBLIC _DIG_SetAll.PUBLIC F_DIG_Get.PUBLIC _DIG_Get.PUBLIC

26、 F_DIG_GetAll.PUBLIC _DIG_GetAll.PUBLIC F_DIG_Clear.PUBLIC _DIG_Clear.PUBLIC F_DIG_Drive.PUBLIC _DIG_Drive.PUBLIC F_DIG_Off.PUBLIC _DIG_Off.PUBLIC F_DIG_On.PUBLIC _DIG_On.code /=/ 函数名称:DIG_Init/ C 调用:void DIG_Init(void)/ 汇编调用:F_DIG_Init/ 实现功能: 数码管显示初始化,该函数将开启 IRQ4_4KHz 中断 / 入口参数:无/ 出口参数:无/ 破坏寄存器: 无/

27、= _DIG_Init:F_DIG_Init:push r1,bp to spINT Offr1 = DIG_Count r2 = 0x0000 bp = R_DIG_Buf ?DIG_InitBuf:bp+ = r2 r1 -= 1 jnz ?DIG_InitBuf R_CurDIG = r2r1 = P_SEG_Attrib r1 |= PIN_SEG_ALL P_SEG_Attrib = r1 r1 = P_SEG_Buf r1 &= PIN_SEG_ALL P_SEG_Data = r1 r1 = P_SEG_Dir r1 |= PIN_SEG_ALL P_SEG_Dir =

28、r1/ 清除显示缓冲区/ 当前显示的位设置为 0/ 初始化段选 IOr1 = P_DIG_Attrib r1 |= PIN_DIG_ALL P_DIG_Attrib = r1 r1 = P_DIG_Buf r1 &= PIN_DIG_ALL P_DIG_Buf = r1 r1 = P_DIG_Dir r1 |= PIN_DIG_ALL P_DIG_Dir = r1/ 初始化位选 IOr1 = P_INT_Mask r1 |= C_IRQ4_4KHz P_INT_Mask = r1 INT FIQ,IRQ/ 开启 IRQ4_4KHz 中断pop r1,bp from sp retf/=/

29、 函数名称:/ C 调用:DIG_Setvoid DIG_Set(unsigned DigPos, unsigned DigBuffer)F_DIG_Set/汇编调用:/实现功能:设置数码管某一位的显示内容/入口参数:DigPos(r1) - 设置的数码管位( 1DIG_Count )/DigBuffer(r2) - 数码管的显示内容/出口参数:无/破坏寄存器:无/=_DIG_Set:push r1,r2 to spr1 = sp + 5r1 = r1r2 = sp+6r2 = r2call F_DIG_Setpop r1,r2 from sp retfF_DIG_Set:push bp to

30、 sp.IF SEG_IO_HighByte=1r2 = r2 lsl 4r2 = r2 lsl 4.ENDIF/ 如果 "位"值超出范围则退出/ 将 R_DIG_Buf 的相应元素修改为设定值r1 -= 1cmp r1,DIG_Countja ?Exitbp = R_DIG_Bufbp += r1bp = r2?Exit:pop bp from sp retf /=/ 函数名称:DIG_SetAll/ C 调用:void DIG_SetAll(unsigned *DigBuffer)/ 汇编调用:/ 实现功能:/ 入口参数:/ 出口参数:/ 破坏寄存器:F_DIG_Set

31、All 设置所有数码管的显示内容DigBuffer(r1) - 数码管显示内容的起始地址 无无/ _DIG_SetAll: push bp to sp bp = sp r1 = bp+4 call F_DIG_SetAll pop bp from sp retfF_DIG_SetAll: push r2,bp to sp bp = r1 r2 = DIG_Count r3 = R_DIG_Buf/ 将 R_DIG_Buf 修改为设定值?DIG_Set_Loop: r1 = bp+.IF SEG_IO_HighByte=1 r1 = r1 lsl 4 r1 = r1 lsl 4.ENDIFr3+

32、 = r1 r2 -= 1 jnz ?DIG_Set_Loop pop r2,bp from sp retf /= / 函数名称: DIG_Get/ C 调用:unsigned DIG_Get(unsigned DigPos) / 汇编调用: F_DIG_Get/ 实现功能: 获取所有数码管的显示内容/ 入口参数:DigPos(r1) - 要获取显示内容的位/ 出口参数:该位数码管的显示内容/ 破坏寄存器: 无/= _DIG_Get:push bp to sp bp = sp r1 = bp+4 call F_DIG_Get pop bp from sp retfF_DIG_Get: push

33、 r2 to sp r2 = R_DIG_Buf r2 += r1 r1 = r2.IF SEG_IO_HighByte=1r1 = r1 lsr 4r1 = r1 lsr 4.ENDIFpop r2 from sp retf/=/ 函数名称:DIG_GetAll/ C 调用:unsigned *DIG_GetAll(unsigned *DigBuffer)/ 汇编调用:F_DIG_GetAll/ 实现功能:获取所有数码管的显示内容/ 入口参数:DigBuffer(r1) - 保存数码管显示内容的起始地址/ 出口参数:保存数码管显示内容的起始地址/ 破坏寄存器:/无/=_DIG_GetAll:

34、push bp to spbp = spr1 = bp+4call F_DIG_GetAllpop bp from sp retfF_DIG_GetAll: push r2,bp to sp bp = r1 r2 = DIG_Count r3 = R_DIG_Buf?DIG_Get_Loop: r4 = r3+.IF SEG_IO_HighByte=1 r4 = r4 lsr 4 r4 = r4 lsr 4.ENDIFbp+ = r4 r2 -= 1 jnz ?DIG_Get_Loop pop r2,bp from sp retf/=/ 函数名称:/ C 调用: 汇编调用: 实现功能: 入口参

35、数: 出口参数: 破坏寄存器:DIG_Clear/void DIG_Clear(void)F_DIG_Clear 清空所有数码管显示内容无无无/= _DIG_Clear:F_DIG_Clear:push r1, r2 to sp r1 = R_DIG_Buf r2 = 0x00?L:r1 = r2r1 += 1cmp r1, R_DIG_Buf+DIG_Count jb ?Lpop r1, r2 from spretf/=/ 函数名称:DIG_Drive/ C 调用:void DIG_Drive(void)/ 汇编调用:/ 实现功能:/ 入口参数:/ 出口参数:/ 破坏寄存器:F_DIG_Dr

36、ive数码管显示函数,由 IRQ4_4KHz 中断服务程序调用 无无无/= _DIG_Drive:/ 如果不显示则直接退出F_DIG_Drive: push r1,r4 to sp r1 = R_CurDIG cmp r1,0xffff je ?DIG_Exit r2 = r1 + R_DIG_Buf r2 = r2 r2 &= PIN_SEG_ALLr3 = P_DIG_Buf/ 清除当前位显示r3 &= PIN_DIG_ALL P_DIG_Data = r3r4 = P_SEG_Buf r4 &= PIN_SEG_ALL r4 |= r2 P_SEG_Data =

37、r4r3 = P_DIG_Buf r4 = r1 + PIN_DIGr3 |= r4 P_DIG_Data = r3r1 += 1cmp r1,DIG_Count jb ?DIG_Next ?DIG_Reverse:r1 = 0?DIG_Next:R_CurDIG = r1 ?DIG_Exit:pop r1,r4 from sp retf/ 段数据设置/ 位数据设置/ R_CurDIG 指向下一位/ 若已显示到最后一位则 R_CurDIG 指向第一位/=/ 函数名称:/ C 调用:/ 汇编调用:/ 实现功能:/ 入口参数:/ 出口参数:/ 破坏寄存器:/=DIG_Offvoid DIG_Off

38、(void) F_DIG_Off 停止数码管显示无无无_DIG_Off:F_DIG_Off: push r1 to sp r1 = P_DIG_Buf r1 &= PIN_DIG_ALL P_DIG_Buf = r1 r1 = 0xffff R_CurDIG = r1 pop r1 from sp retfDIG_Onvoid DIG_On(void) F_DIG_On 恢复数码管显示无无无/=/ 函数名称:/ C 调用:/ 汇编调用:/ 实现功能:/ 入口参数:/ 出口参数:/ 破坏寄存器:/= _DIG_On: F_DIG_On:push r1 to sp r1 = 0 R_Cur

39、DIG = r1 pop r1 from sp retf/=/ The information contained herein is the exclusive property of/ Sunnnorth Technology Co. And shall not be distributed, reproduced,/ or disclosed in whole in part without prior written permission./ (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO. / ALL RIGHTS RESERVED/ The en

40、tire notice above must be reproduced on all authorized copies. /= /=/ 文件名称: Key.asm/ 实现功能: 4*4 按键扫描程序,使用 IRQ6_TMB2 中断 (128Hz)/ 日期: 2005/6/18/= /= / 按键去抖动时间设定,单位为 1/128 秒 /=.DEFINE Key_Debou nee 4/(4/128)秒=31ms/= / 持续按键时间间隔设定,单位 1/128 秒/=.DEFINE Key_TimeOut 64/(64/128)秒=0.5s /=/ 按键使用端口设定/=.DEFINE Key

41、_IO_Port0/.DEFINE Key_IO_Port1/.DEFINE Key_IO_HighByte0.DEFINE Key_IO_HighByte1/ 若按键使用 IOA 口则采用该行定义/ 若按键使用 IOB 口则采用该行定义/ 若按键使用 IO 口低 8位则采用该行定义/ 若按键使用 IO 口高 8位则采用该行定义/ 不必修改下面的定义 /.IF Key_IO_HighByte=0 .DEFINE Key_ALL0x00ff.define Key_NibbleL0x000f.define Key_NibbleH0x00f0.ELSE.DEFINE Key_ALL0xff00.de

42、fine Key_NibbleL0x0f00.define Key_NibbleH0xf000.ENDIF/ 不必修改下面的定义 / .IF Key_IO_Port=0.DEFINE P_Key_Data0x7000.DEFINE P_Key_Buf0x7001.DEFINE P_Key_Dir0x7002.DEFINE P_Key_Attrib 0x7003.ELSE.DEFINE P_Key_Data0x7005.DEFINE P_Key_Buf0x7006.DEFINE P_Key_Dir0x7007.DEFINE P_Key_Attrib 0x7008.ENDIF.DEFINE P_INT_Mask 0x702d.DEFINE P_TimeBase_Setup 0x700e.DEFINE C_IRQ6_TMB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论