01A BC 0X0F,0 ;CLEAR TCC_INT 001B RETI ;TABLE 7 SEGEMENT------------------------------------------------------ T7: 001C ADD PC,A ; GFE DCBA 001D RETL @0B01000000 ;0 0100 0000 001E RETL @0B01111001 ;1 0111 1001 001F RETL @0B00100100 ;2 0010 0100 0020 RETL @0B00110000 ;3 0011 0000 0021 RETL @0B00011001 ;4 0001 1001 0022 RETL @0B00010010 ;5 0001 0010 0023 RETL @0B00000010 ;6 0000 0010 0024 RETL @0B01011000 ;7 0101 1000 0025 RETL @0B00000000 ;8 0000 0000 0026 RETL @0B00010000 ;9 0001 0000 ;DELAY ------------------------------------------------------------------------ DELAY: 0027 MOV P5,A 0028 MOV A,@20 0029 MOV DL,A D_1: 002A DJZ DL 002B JMP D_1 002C MOV A,@0XFF 002D IOW P6 002E RET ;INIT ------------------------------------------------------------------------------ INIT: 002F MOV A,@0X00 0030 MOV MIN,A 0031 MOV SEC,A 0032 IOW 0X0E ;DISABLE WDT 0033 IOW P5 ;PORT 5 OUTPUT 0034 IOW P6 ;PORT 6 OUTPUT 0035 MOV A,@0X01 0036 IOW 0X0F ;ENABLE TCC_INT 0037 MOV A,@0X05 ;1/64 0038 CONTW 0039 ENI ;SCAN --------------------------------------------------------------------------- SCAN: 003A MOV A,MIN HTD: 003B CLR DDH H_H: 003C ADD A,@246 ;A=A-10 003D JBS RF,FC 003E JMP H_L 003F INC DDH 0040 JMP H_H H_L: 0041 ADD A,@10 0042 CALL T7 0043 IOW P6 0044 MOV P6,A 0045 MOV A,@255 ;DISPLAY DIGIT 0 0046 CALL DELAY 0047 MOV A,DDH 0048 CALL T7 0049 IOW P6 004A XOR A,@0XFF 004B MOV P6,A 004C MOV A,@00 ;DISPLAY DIGIT 1 004D CALL DELAY 004E JMP SCAN 程序说明: 程序就像日常说话一样,只要能够表达清楚意思,那么,愈短愈受人欢迎(当然得在保证有正常功能的情况下而言)。此次DIY制作的软件程序长度仅有78个指令,够短了吧,相信看懂也不难。整个程序可以分成5个段落来做说明,寄存器使用说明: DL ----- 子程序用寄存器 MIN ----- 存放分钟资料寄存器 SEC ----- 存放秒钟资料寄存器 DD ----- 存放显示位数资料寄存器 DDH ----- 存放显示资料寄存器 AB ----- 存放ACC的副本 RFB ----- 存放STATUS的副本 TCC中断子程序: 从0000--001B行为每秒发生一次的TCC中断子程序,其中0008--000B及0017--0019行为进入及离开中断子程序的ACC及STATUS保留动作。其中000C为每进入一次中断子程序就将SEC这寄存器予以进位。其中000D--0012为判断SEC寄存器是否大于59,是则将MIN寄存器予以进位并清除SEC寄存器。其中0013--0016为判断MIN寄存器是否大于99,是则将MIN寄存器予以清除,其中001A为清除TCC中断旗标。 LED字型转换程序: 从001C--0026行存放了字型转换表,可将0--9的数字转成相对的LED七字显示器的资料。 显示时间长度延迟程序: 从0028--002B延迟程序,而0027及002C--002D为启动显示及关掉显示之指令。 微控制器启始设定程序: 从002F--0039行对微控制器内部相关硬件做了必要性的设定动作。值得特别一提的是0035--0039行对TCC中断记数器予以设定成每秒中断一次。计算式如下: 系统时基/(2周期模式×1秒×256进位)而得预除数为64。 5.LED七字显示器扫描主程序: 从003A--004E行为本软件程序之主程序部份,又可分三部份。003C--0040行为取得MIN的拾位数之值。0042--0046行显示MIN的个位数资料到共阳极的LED七字显示器上。0047--004D行为显示MIN的拾位数资料到共阴极的LED七字显示器上。希望这短短的程序难不倒您才是。
程序撰写步骤: 许多人习惯上撰写程序的过程是依照「先小而大」,「先难后繁」,「边测边写」 等三项原则来从事的,底下便将电话使用计时器程序分成八个段落来完成。 1.先给予心跳:
一般撰写程序碰到计时的工作时不外乎三个方式来解决:
「用TIMER计数器来产生中断来计时」「用POLLING TIMER计数器来计时」 「用计算程序指令个数来计时」 这三个方式中以方式一最为简单也最为准确,故这里打算最重要之秒的进位问题就交给TIMER计数器中断方式来解决了。 TC0.ICE ; ; FILE NAME:TC0.DT ; DATE :1999,5,5 ; BY :HWANG JYN_GUO ; ; FUNCTION DESCRIPTION: ; USING TCC TO GET 1 SEC INTERRUPT ; 32768/(2*64*256)= 1 SEC ; CRYSTAL MODE 32768 Hz ; 2 CYCLE AND 2 CLOCK MODE ; P5 == 0X05 ;PORT 5 P6 == 0X06 ;PORT 6 ORG 0 0000 JMP INIT ;PROGRAM START ORG 8 ;TCC INTERRUPT------------------------------------------------------- TCCI: 0008 COM P6 TCCE: 0009 BC 0X0F,0 ;CLEAR TCC_INT 000A RETI ;INIT ------------------------------------------------------------------------- INIT: 000B MOV A,@0X00 000C MOV P6,A ;PORT 6 = 0 000D IOW 0X0E ;DISABLE WDT 000E IOW P5 ;PORT 5 OUTPUT 000F IOW P6 ;PORT 6 OUTPUT 0010 MOV A,@0X01 0011 IOW 0X0F ;ENABLE TCC_INT 0012 MOV A,@0X05 ;1/64 0013 CONTW 0014 ENI ;SCAN ----------------------------------------------------------------------- SCAN: 0015 JMP SCAN 这程序的目的是欲了解TCC中断能否满足秒的进位问题。 程序说明: 中断子程序: 从0008--000 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
Tags:
|