4*8点led阵图,每个亮led显示一秒内亮灭循环单片机程序

控制4个led灯循环点亮程序_中华文本库
4 编写一个LED灯流水灯程序_二年级数学_数学_小学教育_教育专区。4 编写一个...馍计数器模式控制 LED 闪烁 # include&iocc2530.4& # define unchar un...
4-4矩阵键盘控制16个LED灯_电子/电路_工程科技_专业资料。单片机实现4*4矩阵键盘控制16个LED灯,当按下某个按钮时对应灯发光 C语言程序电子...
单片机控制LED流水灯从中间向两边_计算机硬件及网络_...形式循环点亮) ORG 0000H ;伪指 令, 指定程序从...() interrupt 1 /*第四步骤,中断时间函数这个相当...
心形花样LED流水灯(带程序) - 心形花样 LED 流水灯(带程序) 3 使用 89C52 做的,原理图如下: 总共有 32 个 LED 灯,4 个 I/O 全部用...
下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯...调用延时子程序 SETB P1.3 ;P1.3输出高电平,使LED4熄灭 CLR P1.4 ;P1.4...
使能中断 }// TA0 中断服务程序 #pragma vector=...[360]) //循环输出正弦波 {sin_data_pr = &sin...用八个按键控制八个LED灯...
暂无评价 4页 1下载...
控制P0口 输出 电平,控制LED亮灭 SJMP L1 ;返回L1,循环执行程序 END ;结束...P3.3、P3.4、P3.5分别控制P0.2、P0.3、 P0.4、P0.5引脚连接的LED灯...
电路由 8086CPU 芯片、8255A 芯片、8 只 LED 发光二极管和一只开关 K0 等组成。 图 5-4 4. 项目程序设计 1) 程序流程图 用 8255A 控制 LED 灯循环亮的...
循环闪烁周期 led 灯按键杂谈 一、设计题目 二、程序功能: 开机复位后,LED0 ...实验说明:用按键 S4 控制 LED3 和 LED4 的亮灭:按下 S4 不动时,LED3 ...
使用单片机点亮led灯的初级简单程序_电子/电路_工程科技_专业资料。使用单片机点亮led灯的初级简单程序,循环,单亮 /***/ /******/ /***write by...跪求大神,51定时器控制一个led灯,1秒亮,1秒灭的程序,哪里出错啦,坐等回复 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
跪求大神,51定时器控制一个led灯,1秒亮,1秒灭的程序,哪里出错啦,坐等回复
14:08:54  
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& & & &&&{
& & & && &if(tt==20)
& & & && & {& & & &
& & & & & & & & tt=0;
& & & && &&&D1=1;
& & & && & }
& & & &&&& & & & D1=0;
& & & && &}
& & & & & & & & & & & & & & & &
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& & & & tt++;
unsigned char&&
sbit D1=P2^0;
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=~D1;
& && && &&&}
& && && && && &
& && && & }
& && && && && && && && && && &&&
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& && &&&tt++;
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }中D1=~D1;
试想一下程序中只有当tt=20时候才有高电平,那么tt=0~19的时间段D1为低电平,灭亮比为19:1,根本就看不见;
另外这样写代码,效率不高!
14:08:55  
unsigned char&&
sbit D1=P2^0;
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=~D1;
& && && &&&}
& && && && && &
& && && & }
& && && && && && && && && && &&&
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& && &&&tt++;
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }中D1=~D1;
试想一下程序中只有当tt=20时候才有高电平,那么tt=0~19的时间段D1为低电平,灭亮比为19:1,根本就看不见;
另外这样写代码,效率不高!
14:11:49  
弄了几天啦,一直没有发现问题吖
14:23:51  
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1);& && && &&&
void display()
&&if(tt=20)
&&D1=~D1;
void InitTimer()
& & TMOD = 0x01;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& & display();
等待验证会员
14:25:39  
我想问下tt的初始值是多少
14:42:43  
#include &reg51.h&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1);& && && &&&
void display()
&&if(tt==20)
void InitTimer()
& & TMOD = 0x01;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& &TL0 = 0xb0;
& &display();
调试通过了!你那个
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }
程序在中间一直循环,跳不出来的,
16:30:54  
while 有问题,还有你的晶振是多少初值给对了吗?while就是存在楼上说的问题,你的程序不是1s 亮1s灭……嘿嘿,没事初学都易犯这个错,多想想怎么编吧
17:30:03  
问题应该是D1=~D1,这样就行了,你那样,低电平时间和高电平时间同吗?
08:37:52  
我想问下tt的初始值是多少
tt=0& && &
08:40:32  
unsigned char&&
sbit D1=P2^0;
我 下载去看看然后再想想,大神阿,跪谢吖
08:53:39  
while 有问题,还有你的晶振是多少初值给对了吗?while就是存在楼上说的问题,你的程序不是1s 亮1s灭……嘿嘿,没事初学都易犯这个错,多想想怎么编吧
晶振是11.0592Mhz,对阿,当时忘记考虑机器周期啦,谢谢提醒
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司当前位置: >>
合泰 单片机 AD Flash HT66Fxx 应用实例程序
5-1A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5进阶实验篇5经过基础实验篇的洗礼, 相信读者对于HT66F50单片机及其周边单元、 程序写 作技巧以及开发环境的使用,都已经有初步的认识!程序其实要多写、多错、多除 错,然后方能由错误中累积经验,增强本身的逻辑观念及程序写作功力。延续上一 章的学习成果,本章将继续介绍几个更深入的实验,DC Motor控制、LCD接口、 LCM模块、多颗七段显示器与点矩阵LED扫描、TM接口应用…等等,另外,除了 HT66F50内建E2PROM的读写控制外,有关I2C-Bus及MicroWire-Bus E2PROM的 读写本章也将涉猎。 通过这些实验, 相信必定能让读者对于HT66Fx0单片机的应用 能有更深一层的了解!本章的实验内容包括:5-1 5-2 5-3 5-4 5-5 5-6 5-7 5-8 5-9 直流马达控制实验 马表- 马表-多颗七段显示器控制实验 静态点矩阵 LED 控制实验 动态点矩阵 LED 控制实验 LCD 界面实验 LCM 字型显示实验 LCM 自建字型实验 LCM 与 4×4 键盘控制实验 LCM 的 DD/CG RAM 读取控制实验 5-10 5-11 5-12 5-13 5-14 5-15 5-16 5-17 LCM 的四位控制模式实验 比大小游戏实验 单元脉冲测量与 脉冲测量 STM 单元脉冲测量与 LCM 控制实验 ETM“单一脉冲输出”模式与脉冲测量实验 ETM“单一脉冲输出”模式与脉冲测量实验 脉冲测量 中文显示型 LCM 控制实验 半矩阵式键盘与 LCM 控制实验2 HT66F40 内建 E PROM 内存读写实验 2I C 接口 E PROM 读写控制实验2222 MicroWire5-18 MicroWire-BUS 接口 E PROM 读写控制实验 5-2A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5-15-1-1直流马达控制实验目 的:本实验将利用脉冲宽度调制(PWM)的技巧,让直流马达呈现不同的转速; 辅以按键的搭配使用,让使用者控制直流马达加速、减速与转向。5-1-2学习重点: 学习重点:通过本实验,读者应了解如何使用以PWM方法控制直流马达转速的快慢;同 时,对于HT66F50 ETM单元的“PWM Output Mode”及其跨脚位功能(Cross-Pin Function)的使用应更加熟悉。5-1-3电路图: 电路图:5PS:若使能PA[2:0]Pull-high功能,则三个10k 电阻可省略。【图5-1-1】直流马达控制电路“马达(Motor;又称电动机)”被广泛运用于各种电器用品,其可将电能转 换为机械能,以驱动机械作旋转运动、直线运动或振动。作旋转运动的马达,其应 用更遍及各种行业、办公室、家庭等,生活周遭几乎随处可见;作直线运动的马达 称为线型马达(Linear Motor),适用于半导体工业、自动化工业、工具机、产业 机器及仪器工业等。马达构造大致上包含两大单元:一是“转子(Rotor;或电枢 Armature)”为马达旋转的部份,材质为永久磁铁、线圈(外接电源)、导线(无 外接电源)特殊形状的导磁材料;其二为“定子(Stator;场绕组Field)”,定子 则是固定不动的部分,主要是提供周围的磁场,材质为永久磁铁或是线圈。虽然马 达的种类相当多,不过其基本操作原理都相同,基本上都是利用电流流过定子产生 磁场, 当转子也通上电流时由于切割定子所产生的磁力线而生成旋转扭矩造成电动 机转子的转动。电动马达是利用电磁感应方式,以同性磁场互斥原理,推动转轴旋 第五章 进阶实验篇5-3转,而将电能转换成为机械能。 马达如依其使用的目的来分类,则种类相当繁杂,一般马达因其使用的电源有 交流及直流的差异,而有所谓的交流马达和直流马达,在使用马达前需先了解其使 用的电源是直流电还是交流电,如果是交流电,尚需考虑它是三相还是单相的交流 电,接错电源会导致不必要的损失和危险。(a)(b)(c)【图 5-1-2】直流马达工作原理【图5-1-2】是直流马达工作示意图: (a)当线圈通电后,转子周围产生磁场, 转子的左侧被推离左侧的磁铁,并被吸引到右侧,从而产生转动;(b)转子依靠 惯性继续转动; (c)当转子运行至水平位置时电流变换器将线圈的电流方向逆转, 线圈所产生的磁场也同时逆转,使这一过程得以重复。如此说来,直流马达的控制 似乎只在于电压(或说是电流)的提供与否,但若单单仅是如此则只能控制其转动 或停止,并无法控制其转速!直流马达转动速度的快慢,是由马达的电动势大小来 决定,其转动方向则取决于电压极性。一般转速大小和马达两端电压成线性,其电 压愈大转速愈快, 反之则愈小。 在电路上以多级的电压来控制马达的转速虽属可行; 但若转速变化是多样、精细的控制时,这样的设计方式似乎有些不切实际! 直流马达一般是以“脉冲宽度调制(Pulse Width Modulation;PWM)”方式 来达成转速的控制,其原理如【图5-1-3】所示,图中TOn(高电平部份)是马达动 作(Active)时间,TOff(低电平部份)则为马达停止(Inactive)时间,两者之和 即为一“PWM周期(PWM Period)”。虽然流经马达的电压不断在ON-OFF之间 切换, 但马达线圈为电感元件, 流过电感元件的电流为电压的积分, 有一个类似 “惯 性”的作用,实际流经马达电流变化不大,其正比于【图5-1-3】中脉冲的面积和。 因此当使用者想降低马达转速时,只要减少动作的时间(TOn)、增加停止的时间 (TOff)、并保持周期不变,即可降低平均电流,如【图5-1-3】所示的PWM1波形; 反之,若想加快马达的转速,则需要加长动作的时间、缩短停止的时间、并维持周 期不变,即可升高平均电流,如【图5-1-3】所示的PWM2波形。由于改变转速是 通过改变动作的时间比例,也就是一周期的输出波形中,处于高电平状态的相对时 间宽度 (Width) 因此这种的控制方式称作 , “脉冲宽度调制” 而动作时间在PWM ; 周期所占的比例称为“Duty Cycle(占空比)”,即 。5【图5-1-3】中的脉冲宽度变化需要相当的快,频率经常超过1kHz!因此,若要精 确控制直流马达的驱动信号,最好使用具有内嵌PWM输出功能的微处理器。 5-4A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明【图 5-1-3】改变直流马达转速的 PWM 波形在了解以PWM方式改变马达转速之后,接下来要探讨的是直流马达的正、反 转控制,【图5-1-2】中若将电压的极性反接就可产生方向相反的磁场变化,进而 使转子改变旋转方向达到反转的目的。【图5-1-4】为直流马达的正、反转控制的 示意图:(a)未供电直流马达,故为停止状态;(b)S1、S4开关On,马达左侧为正、 右侧为负,开始转动;(c)S2、S3开关On,马达右侧为正、左侧为负,转动方向与 (b)相反。5(a) (b) (c)【图 5-1-4】直流马达的正、反转控制选用马达时,必须注意其工作电压,一般常见的直流马达电源规格为DC-12V、 DC-24V;另外还要知道“输出转矩(Toque)”的大小(单位:g.cm、k.gm), 以及转速(Rotate Per Minute;RPM),最好能取得代表马达特性的曲线作为选 用时的参考。【图5-1-5】为典型的DC-12V永磁式(PM)马达的特性曲线图,其 横坐标为马达输出转矩,纵坐标则包括转速、电流、输出功率、效率等四条曲线。 观察【图5-1-5】可知这颗马达最大效率约为40%,此时马达输出转矩为100g.cm、 输出功率为2.1瓦特、转速为2000rpm,而所需电流则为440mA。由图中也可看出: 电流供应量越大,输出转矩越大;而转数越高,输出转矩越小,而且大致呈一线性 关系。 第五章 进阶实验篇5-5【图 5-1-5】直流马达的特性曲线马达的规格与外观琳琅满目,在此实在无法一一列出说明,本实验仅就一般常 见的小型5V直流马达为例介绍其控制方式。为了能使单片机直接控制马达的正、 反转,可将【图5-1-4】中S1~S4开关以Q1~Q4取代,并在晶体管的C-E(集极射极)接面并联了一颗二极管(Diode),这主要是因为马达为电感元件,当马达 停止转动的瞬间会产生反向的感应电动势( ),此一电压可能烧毁晶体管甚至对单片机造成损害,故以二极管提供此反向感应电动势的放电回路,以避免瞬 间大电压的产生而损坏电路,以确保电路与芯片的安全;这类用在对电感性负载保 护的二极管一般称为“续流二极管(Free-Wheeling Diode)”。如【图5-1-1】是 常见的直流马达控制电路,请读者观察Q1~Q4晶体管与马达的回路是否很像英文 字母的“H”?因此,此一电路结构被称为“H-Bridge”。在控制过程中,必须注意 不可让Q1与Q3(或Q2与Q4)同时导通,请参考【图5-1-1】,此现象发生在PC0、 PC1输出同时为“1”时,这将导致VCC至地(Ground)之间呈现近乎短路的现象, 造成电流瞬间的暴增,可能造成的结果是晶体管的烧毁,或电源因电流不足造成电 压瞬间下降影响了单片机的正常操作。 HT66F50 ETM单元的PWM输出功能,曾经在【实验4-13】运用来控制LED的 亮度;本实验仍采用ETM单元的PWM输出模式,并配合Cross-Pin Function与四个 3055晶体管组成的H-Bridge结构,控制直流马达的加速、减速与转向。有关ETM 单元的详细说明请参考【2-5-3节】,Cross-Pin Function请参阅【2-5节】;在此 仅将本实验相关控制寄存器简列于【表5-1-1】。【表 5-1-1】本实验相关控制寄存器【2-5-3 节】 TM1C0 TM1C1 TM1C2 TM1DL TM1DH TM1AL T1PAU T1AM1 T1BM1 T1CK2 T1AM0 T1BM0 T1CK1 T1AIO1 T1BIO1 - TM1A[7:0] T1CK0 T1ON T1AIO0 T1AOC T1BIO0 T1BOC TM1D[7:0] T1RP2 T1APOL T1BPOL T1RP1 T1CDN T1PWM1 T1RP0 T1CCLR T1PWM05TM1D[9:8] 5-6A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明TM1AH TM1BL TM1BH 【2-6-9 节】 TMPC0Bit- TM1B[7:0] - T1ACP07TM1A[9:8] TM1B[9:8] T1BCP04T1BCP26T1BCP15-3-2T0CP11T0CP005-1-4程序及流程图: 程序及流程图:5程序5-11 2 3 4 5ETM PWM Output Mode直流马达控制实验;PROGRAM:5-1 PROGRAM (5-1.PJT) ;FUNCTION: ETM PWM DC MOTOR CONTROL PROGRAM #INCLUDE #INCLUDE ============ HT66F50.INC 5-1.INC
By Steven;============================================================================ MY_DATA DEL1 DB DEL2 DB DEL3 DB INDEX DB ============ .SECTION ? ? ? ? 'DATA' ;==DATA SECTION== ;DELAY LOOP COUNT1 ;DELAY LOOP COUNT2 ;DELAY LOOP COUNT3 ;TABLE INDEX6 7 8 9 10 11 12 13 14;============================================================================ MY_CODE ORG MOV .SECTION 00H A,B AT 0 'CODE' ;==PROGRAM SECTION== ;HT-66FX0 RESET VECTOR 第五章 进阶实验篇5-715 16 17 18 19 20 21 22 23 24 25 26 27 MATCH 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 MAIN:MOV MOV CLR CLR CLR MOV ORM ORM MOV MOV CLR MOV MOV MOV MOV MOV MOV MOV MOV MOV ANDM ANDM CLR SET MOV CALL MOV MOV ADD MOV TABRDL MOV MOV CALL WAIT_KEY: SNZ JMP SNZ JMP SZ JMP SNZ JMP CLR CALLCP0C,A CP1C,A ACERL SCOMEN SEG_PORTC A,B A,PAC A,PAPU A,B TMPC0,A TM1C0 A,B TM1C1,A A,B TM1C2,A A,LOW 1024-1 TM1AL,A A,HIGH 1024-1 TM1AH,A A,B A,PC A,PCC INDEX T1ON A,INDEX TRANS_SEG SEG_PORT,A A,INDEX A,TAB_PWM TBLP,A TM1BL A,TBLH TM1BH,A DELAY SPUP_SW SPEED_UP SPDN_SW SPEED_DN DIRE_SW WAIT_KEY T1BCP0 DIRECTION T1BCP0 DELAY;Disable Comparator 0 FDisable Comparator 1 FDigital I/O Pin is assigned as a I/ODisable LCD FCONFIG SEG_PORT AS OUTPUT PWM MODE ;CONFIG PA[2:0] AS I/P MODE ;ENABLE PA[2:0] PULL-HIGH ;CONTROL TP1B_0 AS TP1B FUNCTION ;fINT=fSYS/4 (4MHz/4) ;SET ETPU TP1A AS PWM MODE AND ;COUNTER IS CLEARDE BY TP1CCRA COMPARE ;SET ETPU TP1B AS PWM MODE ;SET PWM PERIOD 1023/fINT;SET PC0,PC1 TO 0 ;CONFIG PC0,PC1 O/P MODE ;SET INDEX=0 ;START ETPU5;GET 7 SEG CODE ;DISPLAY;GET DUTY CYCLE ;SET TP1CCRB ;DELAY 0.25 SEC ;SPEED UP SW PRESSED? ;YES,JUMP TO SPEED_UP ;SPEED DOWN PRESSED? ;YES,JUMP TO SPEED_DOWN ;SPEED DIRECTION SW PRESSED? ;NO,KEEP CURRENT SPEED ;WHICH STATE THE DC MOTOR ;NO,JMP TO SPEED_DIRECTION ;PREVENT Q1-Q3(OR Q2-Q4) TURN AT THE SAME 5-8A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明TIME 61 62 63 64 65 TIME 66 67 68 69 70 71 72 73 74 75 76 77 78 ============ SET JMP SPEED_DN: SZA DEC JMP SPEED_UP: INCA SUB SNZ INC JMP INDEX A,10 C INDEX MAIN ;ACC=INDEX+1 ;ACC&10? ;YES. ;NO,INCREASE INDEX BY 1 ;JUMP TO MAIN INDEX INDEX MAIN ;IS INDEX=0? ;NO,INDEX=INDEX-1 ;JUMP TO MAIN T1BCP0 MAIN ;JUMP TO MAIN SET JMP DIRECTION: CLR CALL T1BCP1 DELAY ;NO,CHANGE DC MOTOR'S STATE ;;PREVENT Q1-Q3(OR Q2-Q4) TURN AT THE SAME T1BCP1 MAIN ;YES,CHANGE DC MOTOR'S STATE ;JUMP TO MAIN;============================================================================ ; ============ RETURN THE TABLE VALUE INDEX BY A579 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 ============ 95 96 97 98 ============ 99 100 101;============================================================================ TRANS_SEG PROC ADDM A,PCL RET RET RET RET RET RET RET RET RET RET TRANS_SEG ENDP ;============================================================================ ; PROC ; FUNC : DELAY : DEALY ABOUT 25*10mS @fSYS=4MHz A,B A,B A,B A,B A,B A,B A,B A,B A,B A,B ;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9; REG : DEL1,DEL2,DEL3 ;============================================================================ DELAY PROC MOV MOV A,25 DEL1,A ;SET DEL1 COUNTER 第五章 进阶实验篇5-9102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126DEL_1: MOV DEL_2: MOV MOV DEL_3: SDZ JMP SDZ JMP SDZ JMP RET DELAY ENDP ORG TAB_PWM: DC DC DC DC DC DC DC DC DC DC ENDMOV DEL2,A A,110 DEL3,A DEL3 DEL_3 DEL2 DEL_2 DEL1 DEL_1A,30 ;SET DEL2 COUNTER ;SET DEL3 COUNTER ;DEL3 DOWN COUNT ;DEL2 DOWN COUNT ;DEL1 DOWN COUNTLASTPAGE ;TM1B TABLE 100 200 300 400 500 600 700 800 900 1000 ;HIGH ;LOW5程序 解说: 程序 解说:4 7~10 13 14~18 19~22 23~24 25~29 载入”5-1.INC”定义档,其内容请参考随书光盘中的档案。 依序定义变量地址。 声明内存地址由 000h 开始(HT66Fx0 复位向量)。 关闭 CP0、CP1 与 LCD 功能,并设定 ADC 脚位输入为 I/O 功能。 将 SEG_PORT 定义成输出模式, 定义 PA[2:0]为输入模式并使能其 Pull-high 功能。 定义 TP1B_0、TP1B_1 为 TP1B 功能。 定义 TM1C0、TM1C1、TM1C2 控制寄存器: T1CK[2:0]:000,设定 fINT=fSYS/4; T1AM[1:0]:10,设定为 PWM 或 Single Pulse 输出模式; T1AIO[1:0]:10,设定 TP1A 为 PWM Output; T1AOC:1,选择 PWM 输出为 Active High; T1CCLR:0,设定当 TM1D=TM1A 时(即比较器 A 比较匹配时)清除计数器; 5-10A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明T1BM[1:0]:10,设定为 PWM 或 Single Pulse 输出模式; T1BIO[1:0]:10,设定 TP1B 为 PWM Output; T1BOC:1,选择 PWM 输出为 Active High。 30~33 34~36 37~38 40~42 43~48 设定 PWM 周期为 1023×(fINT )。 定义 PC0(TP1B_0)、PC1(TP1B_1)为输出模式,并选择 TP1B 为同相输出。 清除 INDEX 值,并启动 ETM 开始计数。 显示目前的转速值(“9”:最快~“0”:最慢)。 依据 INDEX 值进行查表,并将查表结果存入 TM1BL、TM1BH 寄存器;此举即改 变输出波形的 Duty Cycle,进而达到改变马达转速的目的。 49 51~56 延迟 250mS。 检查加速(Speed_UP)、减速(Speed_DN)与方向(Direction)按键,以判断 是否要改变马达的转速、转向。 57~67 此段是使用者按下方向键(Direction)的处理程序,即正转改反转、或反转改正转 的程序;57 行先检查 TP1B_0 是否指定为 TP1B 的 PWM 输出脚位,若是则停止 PWM 输出, 恢复为 I/O 脚位功能并输出 Low (请注意在 35 行已将 PC.0 设为 “0” , ) 延迟 250ms 后启动 TP1B_1 的 PWM 输出功能,并回到 MAIN 执行程序。如果 TP1B_0 必非指定为 TP1B 的 PWM 输出脚位,则关闭 TP1B_1 的 PWM 输出功能 并输出 Low(请注意在 35 行已将 PC.1 设为“0”),延迟 250ms 后启动 TP1B_0 的 PWM 输出功能,并回到 MAIN 执行程序。 68~71 此段程序是使用者按下减速键(Speed_DN)的处理程序,首先判断 INDEX 是否为 “0”,若是,代表马达转速已经达到最低指数,维持 INDEX 的值;反之,表示马 达尚有减速空间,将 INDEX 减一以降低转速。 72~71 此段是使用者按下加速键 (Speed_UP) 的处理程序, 首先判断 INDEX 是否为 “10” , 若是,代表马达转速已经达到最高指数,维持 INDEX 之值;反之,表示马达尚有加 速空间,将 INDEX 加一以提高转速。 81~93 99~113 115~125 七段显示器显示码查表子程序。 DELAY 子程序,延迟 250mS;延迟时间的计算请参考【实验 4-1】。 TON 时间建表区。-15 第五章 进阶实验篇5-11关于直流马达的PWM控制方式,其实与【实验4-13】中控制LED亮度的原理 差不多,只是针对不同的装置特性要稍微有些不同。关于马达的控制,就必须了解 其特性,马达毕竟是个机械装置,无法在瞬间达到其应有的转速!本实验中只是很 简单的利用按键来控制其转速、转向,读者可以发现当按下按键时,需要一段时间 马达方能达到定速,这就如同惯性一般;同理,由转动而静止时,也是需要一段时 间。而马达由静止启动时,也需要耗费较大的电力。一般精确的马达控制,必须要 考虑加速、减速的问题,有兴趣的读者可以多参考这方面的书籍。此外,在进行本 实验时,可将控制芯片电路与马达的电源分开,可避免电源互相干扰。甚至可以用 光隔离(如PC817、PC847)方式使正电源、地线与控制线全部分开,互不相连, 以避免出现不正常动作。 请读者特别留意【程序5-1】中的转向控制程序片段(57~67行),读者应该 不难发现笔者是以TP1B_0与TP1B_1的脚位功能切换来达成改变马达转向的目 的; 在第35行将PC[1:0]设为 “00” 的作用不仅是在选择TP1B的输出同相 (参考 【实 验4-13】),其另外一个功能是在保证当TP1B_0、TP1B_1由PWM输出功能转换 为I/O时,PC.0、PC.1的输出状态为Low,以确保马达得以顺利完成转向的变换。 此外, 在切换的过程加入了250ms的延迟, 其主要目的是避免 【图5-1-1】 中的Q1-Q3 (或Q2-Q4)晶体管瞬间同时导通,使电流激增而造成电路动作不正常。或许读者 会质疑:“程序明明是先、后以TP1B_0、TP1B_1控制Q1-Q3(或Q2-Q4)的关、 开,应该不会有同时导通的现象吧?”;由于晶体管由饱和区切换为截止区需要一 所以若不在切换间加上延 定的时间, 而单片机执行指令的等级是约数百ns至数?s, 迟时间,的确有瞬间同时导通的疑虑存在;电路中瞬间的电流增加,除了易造成噪 声之外,万一电源的电流不足,也会造成电路电压的瞬间下降,这些现象都可能造 成单片机的不正常动作,使用上一定要小心!55-1-5动动脑+动动手: 动动脑 动动手: 动动手试着改写【程序 5-1】 ,使马达的转速能有更多种变化。 试着让 Duty Cycle 再降低,观察马达在何种 Duty Cycle 下就无法转动了。 将【程序 5-1】中的 35 行指令删除,重新执行程序后与原来是否不同? 试着修改【程序 5-1】中的 PWM 周期,并更改 115~125 行 TON 时间建表区 的数据, 使其与原程序维持一样的 Duty Cycle, 感受一下当 PWM 周期改变、 占空比维持不变的情形下,马达的转速、扭力、甚至产生的干扰或杂音有何 差异。 5-12A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5-25-2-1马表-多颗七段显示器控制实验目 的:本实验利用人类视觉暂留的特性, 让依序逐一点亮的七段显示器呈现同时点亮 的错觉,以解决I/O口不足的情况。本实验承接【实验4-3】单颗七段显示器控制实 验,但增加为四位数的计数器,配合HT66F50的STM单元与外部中断的控制 (INT0),制作一个计时分辨率为0.1秒的马表。5-2-2学习重点: 学习重点:通过本实验,读者能了解如何以扫描的方式来控制多颗七段显示器的显示;同 时对于HT66F50的间接寻址(Indirect Addressing)、外部中断与STM单元的计时 功能,都应有更深一层的认识。5-2-3电路图: 电路图:5PS:若使能PA0的Pull-high功能,则R1电阻可省略。【图 5-2-1】多颗七段显示器控制电路在一个系统中为了能够达到显示更多信息的目的, 通常会有多颗七段显示器并 排使用的情况。若以【实验4-3】的方法来驱动七段显示器,就需要耗费很多个I/O 口。例如,一个显示“时”和“分”的定时器就需要四颗七段显示器,这表示单片 机就需有四组I/O口用在显示器各节段(Segment)的驱动上,这个对I/O资源极为 珍贵的小型控制器而言,无疑是一种浪费!解决之道,就是采用“动态扫描”的驱 动方式以节省I/O引脚。所谓“动态扫描”,乃是利用人类视觉暂留的现象(约 30~45ms)并配合程序的控制,以分时(Time Devision)的方式来依序点亮每一 颗七段显示器,只要轮流显示的速度控制得当,那么虽然是一次只点亮一颗七段显 示器,但是在视觉效果上却是所有显示器都同时亮着,而且也达到了节省I/O引脚 的目的。本实验使用TM单元(STM)中断与外部中断(INT0)配合,设计一个计 时马表的功能,本实验相关控制寄存器仅列于【表5-2-1】,其设定方式请读者参 第五章 进阶实验篇5-13考相关章节。【表 5-2-1】本实验相关控制寄存器INTEG 【2-4 节】 INTC0 INTC1 MFI0 TM2C0 TM2C1 【2-5-2 节】 TM2DL TM2DH TM2AL TM2AHBit 7 6 5- - ADF T2AF T2PAU T2M1- CP0F MF1F T2PF T2CK2 T2M0- INT1F MF0F T0AF T2CK1 T2IO1- INT0F CP1F T0PF T2CK0 T2IO0 TM2D[7:0]INT1S1 CP0E ADE T2AE T2ON T2OCINT1S0 INT1E MF1E T2PE - T2POLINT0S1 INT0E MF0E T0AE - T2DPXINT0S0 EMI CP1E T0PE - T2CCLRTM2D[15:8] TM2A[7:0] TM2A[15:8]4 3 2 1 05-2-4程序及流程图: 程序及流程图:5 5-14A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明程序5-21多颗七段显示器控制实验(5-2.PJT)
By Steven;PROGRAM : 5-2.ASM #INCLUDE #INCLUDE MY_DATA SCAN DIGIT R_100MS STACK_A STACK_PSW FG_GO_STOP FG_100MS MY_CODE ORG JMP ORG JMP ORG JMP MAIN: CLR MOV MOV CLR CLR52 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27;FUNCTION: MULTI 7-SEG LED DEMO PROGRAM HT66F50.INC 5-2.INC .SECTION DB DB DB DB DB DBIT DBIT .SECTION 00H MAIN 04H ISR_EXTINT0 14H ISR_STM ACERL A,08h CP0C,A SCAN_PORT SEG_PORT ;CP0 DISABLE ;AD AT 0 'CODE' ? 4 DUP(?) ? ? ? 'DATA';======================================================================================== ;== DATA SECTION == ;SCAN DATA BUFFER ;BUFFER FOR DIGIT 0~3 ;BUFFER FOR 100mSEC ;STACK BUFFER FOR ACC ;STACK BUFFER FOR STATUS ;FLAG FOR GO/STOP ;FLAG FOR 100mS TIME-OUT ;== PROGRAM SECTION == ;HT66FX0 RESET VECTOR ;HT66FX0 EXTERNAL INTERRUPT 0 VECTOR ;HT66FX0 STM INTERRUPT VECTOR;========================================================================================DISABLE;CLEAR SCAN_PORT ;CLEAR SEG_PORT 第五章 进阶实验篇5-1528 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74CLR CLR MOV MOV MOV MOV MOV MOV MOV MOV SET SET SET SET MOV MOV SET MOV MOV MOV MOV MOV MOV CLR SET SET CLR RE_START: CLR CLR CLR CLR WAIT_100MS: SNZ JMP CLR INC MOV SUB SNZ JMP CLR INC MOV SUB SNZ JMPSCAN_PORTC SEG_PORTC A,B TM2C0,A A,B TM2C1,A A,LOW TM2AL,A A,HIGH 5000 TM2AH,A MF0E T2AE PAPU.3 PAC.3 A,B INTEG,A INT0E A,B SCAN,A A,OFFSET DIGIT MP0,A A,20 R_100MS,A FG_100MS EMI T2ON FG_GO_STOP DIGIT[0] DIGIT[1] DIGIT[2] DIGIT[3] FG_100MS WAIT_100MS FG_100MS DIGIT[0] A,DIGIT[0] A,10 Z WAIT_100MS DIGIT[0] DIGIT[1] A,DIGIT[1] A,10 Z WAIT_100MS 5000;CONFIG SCAN_PORT AS OUTPUT MODE ;CONFIG SEG_PORT AS OUTPUT MODE ;CLOCK SOURCE=fSYS/4 ;TIMER/COUNTER MODE, ;CLEAR BY CCRA COMPARE MATCH ;SET CCRA=5000 FOR 5mS TIME-OUT PERIOD;ENABLE MF0 INTERRUPT ;ENABLE TM2 CCRA MATCH INTERRUPT ;ENABLE PA3 PULL-UP;;;;;;;; ;CONFIG PA.3(INT0B) AS INPUT ;SELECT INT0 FALLING EDGE TRIGGER ;ENABLE EXTERNAL INTERRUPT 0;GET START ADDRESS OF DIG BUFFER ;RE-LOAD INITIAL VALUE5;ENABLE GLOBAL INTERRUPT ;START TIMER ;CLEAR GO_STOP_FLAG ;INITIAL DIG3~DIG0;100 mS TIME-OUT ;NO. ;100 mS TIME-OUT ;INCREASE DIGIT[0];DIGIT[0] = 10? ;NO. ;YES, RESET DIGIT[0] ;INCREASE DIGIT[1] BY 1;DIGIT[1] = 10? ;NO. 5-16A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ;CLR INC MOV SUB SNZ JMP CLR INC MOV SUB SNZ JMP JMPDIGIT[1] DIGIT[2] A,DIGIT[2] A,6 Z WAIT_100MS DIGIT[2] DIGIT[3] A,DIGIT[3] A,10 Z WAIT_100MS RE_START;YES, RESET DIGIT[1] ;INCREASE DIG2 BY 1;DIGIT[2] = 6? ;NO. ;YES, RESET DIGIT[2] ;INCREASE DIGIT[3] BY 1;DIGIT[3] = 10? ;NO. ;YES.;======================================================================================== STM INTERRUPT SERVICE ROUTINE ;======================================================================================== ISR_STM: MOV MOV MOV CLR RLA SNZ JMP MOV MOV MOV MOV MOV MOV CALL SZ SET MOV INC SNZ JMP SDZ JMP SET MOV MOV CLR MOV MOV MOV RETI STACK_A,A A,STATUS STACK_PSW,A SEG_PORT SCAN ACC.4 $+4 A,OFFSET DIGIT MP0,A A,B SCAN,A SCAN_PORT,A A,IAR0 TRANS SCAN.1 ACC.7 SEG_PORT,A MP0 FG_GO_STOP $+6 R_100MS $+4 FG_100MS A,20 R_100MS,A T2AF A,STACK_PSW STATUS,A A,STACK_A ;POP STATUS ;POP A ;CLEAR TM2 COMPARE MATCH FLAG ;YSE. RE-LOAD INITIAL DATA ;UPDATE SCAN BUFFER ;SACN DATA OUT ;INDIRECT ADDRESSING ;GET DISPLAY CODE ;IS DIG1 LIGHT? ;YES. SET DOT ;SEND DISPLAY CODE ;NEXT DIGIT ;FLAG = STOP ? ;YES. ;CHECK 100mS TIME-OUT ;NO. ;YES. SET 100mS FLAG ;RE-LOAD INITIAL VALUE ;ALL DIGIT HAVE BEEN SCANNED? ;NO. ;ET START ADDRESS OF DIG BUFFER ;PUSH STATUS ;GHOST EFFECT ;PUSH A596 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 第五章 进阶实验篇5-17122 ;======================================================================================== 123 ; 125 ISR_EXTINT0: 126 127 128 129 130 131 132 134 ; 136 TRANS PROC 137 138 139 140 141 142 143 144 145 146 147 149 ADDM RET RET RET RET RET RET RET RET RET RET END A,PCL A,3FH A,06H A,5BH A,4FH A,66H A,6DH A,7DH A,07H A,7FH A,67H ;COMMON CATHOD 7-SEG LED CODE ;'0' ;'1' ;'2' ;'3' ;'4' ;'5' ;'6' ;'7' ;'8' ;'9' SZ JMP SET JMP CLR CLR RETI RETURN THE TABLE VALUE INDEX BY A FG_GO_STOP $+3 FG_GO_STOP $+2 FG_GO_STOP INT0F ;SET FLAG=0 ;CLEAR FLAG ;FLAG=0 ? ;NO. ;YES. SET FLAG=1 EXTERNAL INTERRUPT SERVICE ROUTINE 124 ;========================================================================================133 ;======================================================================================== 135 ;========================================================================================5148 TRANS ENDP程序 解说: 程序 解说:4 7~13 16 18 20 23~25 26~29 30~33 载入”5-2.INC”定义档,其内容请参考随书光盘中的档案。 依序定义变量地址。 声明内存地址由 00h 开始(HT66Fx0 复位向量)。 声明内存地址由 04h 开始(HT66Fx0 外部中断 0 向量地址)。 声明内存地址由 14h 开始(HT66Fx0 STM 中断向量地址)。 关闭 CP0 功能,并设定 ADC 脚位输入为 I/O 功能。 将 SCAN_PORT、SEG_PORT 定义成输出模式,并将其状态设为 Low。 定义 TM2C0、TM2C1 控制寄存器: T2CK[2:0]:000,设定 fINT=fSYS/4; 5-18A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明T2M[1:0]:11,设定为 Timer/Counter 模式; T2CCLR:0,设定当 TM2D=TM2A 时(即比较器 A 比较匹配时)清除计数器。 34~37 38~39 40~44 设定 TM2A=5000; STM 计时中断时间为 5000× fSYS/4 故 (5ms @ fSYS=4MHz) 。 使能 MF0 与 STM 中断。 定义 INT0(PA.3)为输入模式,并使能其 Pull-high 功能。 设定 INT0 的为下降沿 触发形式,且使能其中断功能。 45~48 49~51 52~54 设定扫描寄存器(SCAN)初值,并将 MP0 指向 DIGIT 存储器的地址。 设定 100ms 计数器初值为 20,并清除代表已计时 100ms 的 FG_100MS 标志。 使能中断总开关(EMI),HT66F50 可开始接受外部中断;启动 STM 计时功能并 清除 FG_GO_STOP 标志(此标志在 STM 中断服务子程序中,是用来判断是否计 时的依据)。 56~59 清除存储器 DIGIT[0]~DIGIT[3],这四个存储器在程序中分别储存 1/10 秒、秒的个 位数、秒的十位数及分钟的计数值。561~62 63~87等待 100ms 的计数时间。 此段程序为计时达 100ms 的处理程序,首先清除 FG_100MS 标志;接着按计时的 规则逐一更新 DIGIT[0]~DIGIT[3]存储器的数值;若计时已到达“9:59.9”则重新 将 DIGIT[0]~DIGIT[3]清除后继续执行(JMP RE_START)。91~121STM 中断服务子程序,其主要功能是每隔 5ms 更新扫描的显示器与显示值,每中 断 20 次后需设定 FG_100MS 标志,以提供主程序做为是否已计时 100ms 的判断 依据;但若 FG_GO_STOP 标志为“0”代表暂停计数,此时扫描动作继续运行, 但会停止 FG_100MS 标志的设定。 95~109 行的程序是逐一点亮 (扫描) DIGIT[0]~ DIGIT[3];其中是以间接寻址法(MP0 配合 IAR0),循序将 DIGIT[0]~DIGIT[3] 的数值经由 TRANS 子程序转换为七段显示码后输出至 SEG_PORT,并配合 SCAN_PORT 的左移动作点亮对应的显示器。同时,每个显示器被点亮的时间由 STM 的中断时间所控制(为 7ms)。125~132外部中断服务子程序,此段程序的目的是将控制是否计时的 FG_GO_STOP 标志加 以反向。136~148七段显示器查表子程序。本实验的重点就在于扫描时间的掌握, 如果每一颗七段显示器点亮的时间不够 第五章 进阶实验篇5-19长(扫描时间过短),显示的数字就不清楚(因为LED通电之后要达到相对的亮度 需要一定的时间);反之,若每个位数停留的时间太久(扫描时间过长),就会看 到数字闪烁,甚至看到数字是逐一点亮的情形。由于视觉暂留的时间约30~45ms, 而【程序5-2】以STM的Timer/Counter模式控制,让每一个数字点亮约5ms(4×5 =20ms),不致超过视觉暂留时间,所以可以清楚看见七段显示器上的数字。而 刚好可以进行 以5ms为计时时间的另一个目的是在中断20次后即为100ms的时间, 显示数值的更新程序。在【程序5-2】执行时,使用者可以通过“GO/STOP”按键 来控制定时器开始或暂停计数,若想让时间归零的话,可以按下RESET按键达成 此一目的;当然褂糜布次还δ艿幕埃芭渲醚∠睢钡纳瓒ㄓPB0/RESB 脚位的连接要重新考虑,请参考【实验4-16】! 另外,在INT0_ISR的中断服务子程序中,因为只是单纯进行标志清除、设定, 没有涉及存储器值的运算,所以Acc、STATUS寄存器就不需像STM_ISR中还要先 做内存值保存的动作。5-2-5动动脑+动动手: 动动脑 动动手: 动动手试着将 STM 计时的时间延长,观察七段显示器的显示情形。 试着将 STM 计时的时间缩短,观察七段显示器的显示情形。 修改【程序 5-2】将其成为 00:00~23:59 的 24 小时定时器;以 SEG3、 SEG2 显示小时,SEG1、SEG0 显示分钟,秒针的跳动就以 SEG0 的“h” 字节闪、灭来表示。5 5-20A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5-35-3-1静态点矩阵LED控制实验目 的:本实验利用视觉暂留的特性,通过HT66F50的“时基计数器”(Time Base Counter;TB)单元控制扫描时间,在8×8点矩阵LED上显示字型。5-3-2学习重点: 学习重点:通过本实验,读者能了解如何以扫描的方式来控制8×8点矩阵LED的显示;并 应熟悉HT66F50 Time Base Counter的控制与其中断操作特性。5-3-3电路图: 电路图:5【图 5-3-1】8×8 点矩阵 LED 控制电路“点矩阵(Dot-Matrix)LED”在各式广告牌上都看的到,其控制方式其实与 【实验5-2】多颗七段显示器的扫描控制差不多,也是利用人类视觉暂留的特性, 让依序一排一排点亮点矩阵的LED,呈现同时发亮的错觉,只要适当的控制各排所 需点亮的字型码(Pattern)与点亮的时间,就可以看到各种的字型。 第五章 进阶实验篇5-21【图 5-3-2】8×8 点矩阵 LED 内部结构【图5-3-2】 为8×8点矩阵LED的内部电路, 一般应用上是将其分成行 (Column; C0~C7)、列(Row;R0~R7)加以控制。例如本实验的电路中(【图5-3-1】), 是将HT66F50的Port D作为列扫描的控制;而Port E则作为字型输出的行控制。举 例来说,如果要显示如【图5-3-3】的“↑”符号,则就需依【图5-3-4】的顺序逐 一送出字型码并配合Port E的扫描序列,并给予每列适当的停留时间;如果分为八 列扫描,且取16ms的视觉暂留时间,则每列仅能停留大约2ms的时间。5【图 5-3-3】“↑”字型 5-22A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明(a)(b)(c)(d)(e)(f)(g)(h)【图 5-3-4】欲显示“↑”字型所需依序送出的字型码5本范例程序利用HT66F50的“时基计数器(Time Base Counter;TB)”产生 所需的控制信号,大约每2.048ms中断一次,在其中断服务程序中切换扫描列并送 出对应的图样,完成显示的动作。HT66F50的Time Base Counter界面架构如【图 5-3-5】所示,其内含两组定时器: TB0与 TB1。其主要功能是根据计数频率源 (fTB)提供一个规律性的内部中断(Regular Internal Interrupt),两者的操作方 式完全相同,只是TB0计数周期的时间比TB1多了四种不同的选择。TB0计时溢位 所产生的中断周期时间范围为28/fTB~215/fTB,可由TB0[2:0]三个位加以选定;当计 数时间结束时,TB会设定TB0F标志,若此时TB0E=“1”且EMI=“1”,则CPU 将至24h执行ISR。TB1计时溢位所产生的中断周期时间范围为212/fTB~215/fTB,可 由TB1[1:0]两位选定;当计数时间结束时,TBC会设定TB1F标志,若此时TB1E= “1”且EMI=“1”,则CPU将至28h执行ISR。以下将本实验相关控制寄存器简 列于【表5-3-1】,详细说明请读者参考各相关章节。【图 5-3-5】HT66F50 的 TBC 内部结构 【表 5-3-1】本实验相关控制寄存器【2-4 节】 【2-13 节】 INTC0 INTC2 TBCBit- MF3F TBON7CP0F TB1F TBCK6INT1F TB0F TB115INT0F MF2F TB104CP0E MF3E LXTLP3INT1E TB1E TB022INT0E TB0E TB011EMI MF2E TB000 第五章 进阶实验篇5-235-3-4程序及流程图: 程序及流程图:5程序5-31 2 3 4 5 6 7 8TBC静态点矩阵LED扫描控制 By Steven;PROGRAM: 5-3.ASM (5-3.PJT) ;FUNCTION: STATIC 8*8 DOT-MATRIX LED DEMO PROGRAM ;NOTE: CONFIG. OPTION : TB CLOCK SOURCE fTb: fSYS/4 #INCLUDE #INCLUDE MY_DATA DEL1 HT66F50.INC 5-3.INC .SECTION DB ? 'DATA' ;==DATA SECTION==;======================================================================================== ;DELAY LOOP COUNT 1 5-24A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29DEL2 DEL3 COUNT COUNT1 COUNT2 BUFFER SCAN STACK_A STACK_PSW MY_CODE ORG JMP ORG JMP INIT: CLR CLR CLR CLR MOV MOV SET SET MAIN: MOV MOV MOV MOV MAIN_1: CALL MOV MOV MOV MOV SET MOV CALL CLR SDZ JMP JMP ; PROC : COPYDB DB DB DB DB DB DB DB DB? ? ? ? ? 8 DUP (?) ? ? ? AT 0 'CODE';DELAY LOOP COUNT 2 ;DELAY LOOP COUNT 3 ;TABLE INDEX;STACK BUFFER FOR ACC ;STACK BUFFER FOR STATUS ;==PROGRAM SECTION== ;HT-66FX0 RESET VECTOR ;HT-66F50 TB0 INTERRUPT VECTOR ;TURN OFF ALL SCAN LINE ;CLEAR DISPLAY DATA ;CONFIG SCAN_PORT AS OUTPUT MODE ;CONFIG DOT_PORT AS OUTPUT MODE ;TB0 TIME-OUT PERIOD IS 2048/fTB ;fTB=fSYS/4, TBON=1 ;ENABLE TB0 INTERRUPT ;ENABLE GLOBAL INTERRUPT ;COUNT1 FOR PATTERN NUMBER ;SET TABLE POINTER ;COPY ROM DATA TO RAM ;INITIAL MEMORY POINTER 0;======================================================================================== .SECTION 00H INIT 24H ISR_TB0 SCAN_PORT DOT_PORT SCAN_PORTC DOT_PORTC A,B TBC,A TB0E EMI A,2 COUNT1,A A,TAB_MATRIX TBLP,A COPY A,OFFSET BUFFER MP0,A A,B SCAN,A TBON A,200 DELAY TBON COUNT1 MAIN_1 MAIN ;NEXT PATTERN ;YES.RE-START530 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55;======================================================================================== ; FUNC : COPY DISPLAY CODE(POINTER BY TBLP) TO DISPLAY BUFFER[7:0] ; PARA ; REG COPY : TBLP :POINT TO TABLE START ADDRESS : ACC,MP0,IAR0,COUNT PROC MOV A,OFFSET BUFFER;======================================================================================== 第五章 进阶实验篇5-2556 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 DEL_3: 101 102 DEL_2: DEL_1: COPYMOV MOV MOV COPY_1: TABRDL INC INC SDZ JMP RET ENDPMP0,A A,8 COUNT,A IAR0 TBLP MP0 COUNT COPY_1;INITIAL MEMORY POINTER 0 ;SET BYTE COUNTER ;READ TABLE DATA AND COPY TO BUFFER ;INCREASE TABLE POINTER ;POINT TO NEXT BUFFER ADDRESS ;COUNT-1 = 0? ;NO, COPY NEXT BYTE ;YES, RETURN;======================================================================================== ; TB0 INTERRUPT SERVICE ROUTINE ;======================================================================================== ISR_TB0: MOV MOV MOV CLR MOV MOV MOV MOV INC RL SNZ JMP MOV MOV MOV MOV MOV RETI ; PROC : DELAY ; FUNC : DEALY ABOUT ACC*10mS @fSYS=4MH PARA ; REG DELAY : ACC : DELAY FACTOR : DEL1,DEL2,DEL3 PROC MOV MOV MOV MOV MOV SDZ JMP SDZ DEL1,A A,30 DEL2,A A,110 DEL3,A DEL3 DEL_3 DEL2 ;DEL2 DOWN COUNT ;SET DEL3 COUNTER ;DEL3 DOWN COUNT ;SET DEL2 COUNTER ;SET DEL1 COUNTER STACK_A,A A,STATUS STACK_PSW,A DOT_PORT A,SCAN SCAN_PORT,A A,IAR0 DOT_PORT,A MP0 SCAN SCAN.0 $+3 A,OFFSET BUFFER MP0,A A,STACK_PSW STATUS,A A,STACK_A ;POP STATUS ;POP A ;YES, RETURN ;ALL DIGIT HAVE BEEN SCANNED? ;NO. ;YES.GET START ADDRESS OF DIG BUFFER ;POINT TO NEXT BUFFER ADDRESS ;PUSH STATUS ;GHOST EFFECT ;UPDATE SCAN BUFFER ;SACN DATA OUT ;PUSH A5;========================================================================================;======================================================================================== 5-26A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明103 104 105 106 107 DELAY 108 110 111 112 113 114 115 116 117 118 119 120 121 122 123JMP SDZ JMP RET ENDP ORG DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC ENDDEL_2 DEL1 DEL_1 ;DEL1 DOWN COUNTLASTPAGE 010000B109 TAB_MATRIX:5124 125 126 127程序 解说: 程序 解说:5 8~17 20 22 24~27 28~29 载入”5-3.INC”定义档,其内容请参考随书光盘中的档案。 依序定义变量地址。 声明内存地址由 00h 开始(HT66Fx0 复位向量)。 声明内存地址由 24h 开始(HT66F50 TB0 中断向量地址)。 将 SCAN_PORT、DOT_PORT 定义成输出模式,并熄灭所有灯号。 定义 TBC 控制寄存器: TBCK:1,选择计数频率来源为 fSYS/4; TB0[2:0]:011,设定 Time Base Interrupt 周期时间为 2048×(fSYS/4)P2.048ms @fSYS=4MHz。 30~31 32~33 34~35 使能中断总开关(EMI)与 TB0(TB0E),HT66F50 可开始接受 TB0 中断。 设定 COUNT1 为 2,代表有两组点矩阵图案要显示。 将 TBLP 指向第一组要显示的点矩阵图案的起始地址。 第五章 进阶实验篇5-2736调用 COPY 子程序,将一组点矩阵图案复制到 BUFFER[]数组,以便进入 TB0_ISR 后送出显示数据。37~40 41 42~43 44~47将 MP0 指向 BUFFER[]数组的起始地址, 并设定 SCAN 扫描存储器为 B。 设定 TBON 为“1”,TBC 开始计数。 调用 DELAY 子程序,延迟两秒钟;延迟时间的计算请参考【实验 4-1】。 设定 TBON 为“0”,停止 TBC 计数;判断 COUNT 减一是否为 0,成立则重新执 行程序(JMP MAIN);反之,则显示下一个点矩阵图案(JMP MAIN_1)。54~65COPY 子程序,根据 TBLP 指定的位置,将连续八个地址所存放的点阵数据由程序 存储器复制到 BUFFER[]数组。69~87TB0 中断服务子程序,根据 SCAN 存储器之值送出扫描列的信号,并依 MP0 指定 的地址送出对应的位图案。将 SCAN 存储器左移之后判断是否已完成八列的扫描, 若是则重新将 MP0 指向 BUFFER[]数组的起始地址;否则继续下一列扫描。94~107 109~126DELAY 子程序,延迟时间的计算请参考【实验 4-1】。 两组点矩阵图案数据建表区。5【程序5-3】是以Port E负责字型码的输出,而以Port D做为列扫描的控制。TB 模块的中断功能则用来掌控每列点亮的时间,而每个图案呈现的时间长短,则由 DELAY子程序的延迟时间决定。有时为了获得更高分辨率的字型、或同时显示多 个字型,就必须增加LED的列数及行数,此时每列扫描时停留的时间势必将缩短! 过短的停留时间会使LED无法进入完全导通的状态,致使其亮度大打折扣!解决的 方式是:增加通过LED的电流,使LED能在导通的瞬间达到应有的亮度。不过此时 要特别注意,因为这时候的大电流是针对瞬间导通时所设计的,切记勿让此电流长 时间流经LED,否则将会造成电路的损害;尤其在以ICE测试时,务必避免单步执 行或断点停留在某列LED点亮的指令上! 另外,【程序5-3】的设计方式是先将程序存储器中的点矩阵图案先复制到 BUFFER[]数组后再交予TB0_ISR程序进行扫描;读者当然也可以省略此步骤而直 接以程序存储器的点阵数据进行显示, 笔者的目的无非是让读者多熟悉间接寻址方 式的使用,以便在【实验5-4】能更灵活的运用。5-3-5动动脑+动动手: 动动脑 动动手: 动动手若修改 5-3.INC 定义档的设定, SCAN_PORT、 使 DOT_PORT 的定义调换; 请问执行结果有何不同? 5-28A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明若修改【程序 5-3】中 TB0_ISR 程序的扫描顺序,使 SCAN 存储器是由左 移改为右移;请问执行结果有何不同? 若将【程序 5-3】第 43 行指令(CALL DELAY)删除,是否仍可看到两组 图案的交替显示?为什么? 试想若将【程序 5-3】的列扫描时间控制由 TB0 更替为 TB1,是否可行?有 何限制呢?5 5-29A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5-45-4-1动态点矩阵LED控制实验目 的:承续【实验5-3】静态点矩阵LED图案显示,本实验在8×8点矩阵LED上显示动 态的移动字型。5-4-2学习重点: 学习重点:通过本实验,读者能运用程序的技巧,在8×8点矩阵LED上做动态显示,并应 更熟悉HT66F50“间接寻址法(Indirect Addressing Mode)”的运用。5-4-3电路图: 电路图:5【图 5-4-1】8×8 点矩阵 LED 控制电路【实验5-3】中在点矩阵LED上显示静态的字型,相信读者已经十分清楚该如 何控制。若果真如此,那么只需要再使用一点程序上的技巧,就可以让字型达到移 动的效果。参考【图5-4-2】,如果在程序存储器(ROM)中建立图中所需的十六 程序存储器( 程序存储器 ) 种图案的字型码,然后再让每个字型重复显示几次,也就是说依序由(1)到(16) 让字型在点矩阵上停留80ms(5次×8列×2ms/列),应该就可以看到“↑”符号移 出点矩阵后再移回原位置的效果!至于移动速度的快慢,则是取决于每个图案重复 5-30A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明显示的次数 (在程序中, 笔者是以DELAY子程序的延迟时间决定图案跑动的速度) 。(1)(2)(3)(4)(5)(6)(7)(8)5(9)(10)(11)(12)(13)(14)(15)(16)【图 5-4-2】产生字型移动效果所需依序送出的字型问题是这种作法,一个字型码需要约八个Bytes的程序存储空间,光是一个字 型的移动效果就必须耗费掉128 Bytes(8×16),万一要多几个字型的移动特效, 耗费掉大半的程序内存不说, 光是建表的工程就可能浪费掉许多宝贵的时光! 所以, 上述控制字型移动的观念虽然正确,但是否有其它的替代方案可行,以避免耗费内 存并节省建表工程所需时间呢?答案当然是肯定的!读者可以再仔细观察【图 5-4-2】,如果我们将原来的字型先搬到数据存储器(RAM)中,然后再将数据存 数据存储器( 数据存储器 ) 储器中的字型依序移位、显示,是不是就达到一样的效果了呢?简而言之,就是以 程序技巧来换取程序所需的空间。 第五章 进阶实验篇5-31(1)(2)(3)(4)5(5) (6) (7) (8)(9)(10)(11)(12) 5-32A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明(13)(14)(15)(16)【图 5-4-3】以 BUFFER 产生字型移动效果5首先,在数据存储器中保留16 Bytes做为字型移动缓冲区(BUFFER[0]~ BUFFER[15]);要显示字型时,将八个Bytes的字型码由程序存储器 程序存储器先复制到 程序存储器 BUFFER[0]~BUFFER[7]的数据存储器 数据存储器中,并将BUFFER[8]~BUFFER[15]清除为0 数据存储器 (如【图5-4-3】中(1))。紧接着把BUFFER[0]~BUFFER[7]循序送出显示后,再 将BUFFER[0]~ BUFFER[15]中的数据“循环移位(Circular Shift)”一次(如【图 5-4-3】中(2)),然后再一次将BUFFER[0]~BUFFER[7]循序送出显示;如此重复 循环移位与显示的动作,就可获得字型移动的效果了。本实验相关控制寄存器,请 参阅【表5-4-1】。【表 5-4-1】本实验相关控制寄存器【2-4 节】 【2-13 节】 INTC0 INTC2 TBCBit- MF3F TBON7CP0F TB1F TBCK6INT1F TB0F TB115INT0F MF2F TB104CP0E MF3E LXTLP3INT1E TB1E TB022INT0E TB0E TB011EMI MF2E TB000 第五章 进阶实验篇5-335-4-4程序及流程图: 程序及流程图:COPY子程序SHIFT子程序TBLP指向ROM的数据起始地址 MP0指向BUFFE[0]的地址 MP1指向BUFFE[8]的地址TEMP=BUFFER[0]Set COUNT=15 i=1 Set COUNT=85依TBLP读取数据 并存在MP0所指的地址 清除MP1所指的地址热 TBLP=TBLP+1 MP0=MP0+1 MP1=MP1+1BUFFER[i]=BUFFER[i+1]i=i+1NONO COUNT-1=0 ? YES RETUTNCOUNT-1=0 ? YES BUFFER[15]=TEMPRETUTN 5-34A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明ISR_TB0子程序Push Acc、PSW SCAN左移一位 MP0=MP0+1YESSCAN.0= 1 ? NO MP0指向DIGIT[0] 设定SCAN=b SCAN_PORT=SCANSCAN.0= 1 ? YES MP0重新指向 BUFFER[0]NOPOP Acc、PSW 依IAR0查表 并将送到DOT_PORTRETUTN程序5-41 2 3动态点矩阵LED(5-4.PJT)
By Steven;PROGRAM : 5-4.ASM;FUNCTION: DYNAMIC 8X8 DOT-MATRIX LED DEMO PROGRAM ;NOTE: CONFIG. OPTION : TB CLOCK SOURCE fTb: fSYS/4 #INCLUDE #INCLUDE MY_DATA DEL1 DEL2 DEL3 COUNT SCAN BUFFER STACK_A STACK_PSW MY_CODE ORG JMP ORG JMP MAIN: CLR CLR CLR CLR MOV MOV SET SET HT66F50.INC 5-4.INC .SECTION DB DB DB DB DB DB DB DB ? ? ? ? ? 16 DUP(?) ? ? AT 0 'CODE' 'DATA' ;== DATA SECTION == ;DELAY LOOP COUNT 1 ;DELAY LOOP COUNT 2 ;DELAY LOOP COUNT 3 ;UNIVERSAL COUNTER ;BUFFER FOR SCAN DATA54 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29;========================================================================================;BUFFER FOR DISPLAY DATA ;STACK BUFFER FOR A ;STACK BUFFER FOR PSW ;== PROGRAM SECTION == ;HT66FX0 RESET VECTOR ;HT66FX0 TB0 INTERRUPT VECTOR ;TURN OFF ALL SCAN LINE ;CLEAR DISPLAY DATA ;CONFIG SCAN_PORT AS OUTPUT MODE ;CONFIG DOT_PORT AS OUTPUT MODE ;TB0 TIME-OUT PERIOD IS 2048/fTB ;fTB=fSYS/4, TBON=1 ;ENABLE TB0 INTERRUPT ;ENABLE GLOBAL INTERRUPT;======================================================================================== .SECTION 00H MAIN 024H ISR_TB0 SCAN_PORT DOT_PORT SCAN_PORTC DOT_PORTC A,B TBC,A TB0E EMI 第五章 进阶实验篇5-3530 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 ; ISR_TB0: MAIN_1:CALL MOV MOV MOV MOV SET MOV CALL CLR CALL JMPCOPY A,OFFSET BUFFER MP0,A A,B SCAN,A TBON A,10 DELAY TBON SHIFT MAIN_1;COPY PATTERN TO BUFFER[] ;GET DISPLAY START ADDRESS ;INITIAL SCAN DATA ;START SCANNING ;DELAY 100STOP SCANNING ;SHIFT BUFFER 1 BYTE ;RE DO;======================================================================================== TB0 INTERRUPT SERVICE ROUTINE ;======================================================================================== MOV MOV MOV CLR MOV MOV MOV MOV INC RL SNZ JMP MOV MOV MOV MOV MOV RETI ;======================================================================================== ; PROC : SHIFT ; FUNC : SHIFT DISPLAY BUFFER BY 1 LOCATION ; REG SHIFT : ACC,MP0,IAR0,MP1,IAR1,TEMP,COUNT PROC MOV MOV MOV MOV MOV INC MOV A, OFFSET BUFFER MP0,A MP1,A A,IAR0 SCAN,A MP0 A,16-1 ;SAVE FIRST DATA ;INCREASE MP0 BY 1 ;CIRCULAR SHIFT DATA IN BUFFER BY ONE ;TOTAL 16 BYTES ;INITIAL MEMORY POINTER 0 ;INITIAL MEMORY POINTER 1 ;======================================================================================== STACK_A,A A,STATUS STACK_PSW,A DOT_PORT A,SCAN SCAN_PORT,A A,IAR0 DOT_PORT,A MP0 SCAN SCAN.0 $+3 A,OFFSET BUFFER MP0,A A,STACK_PSW STATUS,A A,STACK_A ;POP STATUS ;POP A ;ALL DIGIT HAVE BEEN SCANNED? ;NO. ;YES.GET START ADDRESS OF DIG BUFFER ;POINT TO NEXT BUFFER ADDRESS ;PUSH STATUS ;GHOST EFFECT ;UPDATE SCAN BUFFER ;SACN DATA OUT ;PUSH A5 5-36A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 SHIFT SHIFT_1:MOV MOV MOV INC INC SDZ JMP MOV MOV RET ENDPCOUNT,A A,IAR0 IAR1,A MP0 MP1 COUNT SHIFT_1 A,SCAN IAR1,A;SET COUNT ;GET BUFFER+1 DATA ;COPY TO BUFFER ;INCREASE MP0 BY 1 ;INCREASE MP1 BY 1 ;COUNT-1 = 0? ;NO, NEXT BYTE ;YES. ;RE-LOAD FIRST DATA TO BUFFER END;======================================================================================== ; PROC : COPY ; FUNC : COPY DISPLAY CODE TO DISPLAY BUFFER[7:0] AND CLEAR BUFFER[15:8] ; REG COPY MOV MOV MOV MOV MOV MOV MOV MOV TABRDL INC INC INC SDZ JMP RET ENDP : ACC,MP0,IAR0,MP1,IAR1,TBLP,COUNT PROC A,OFFSET BUFFER MP0,A A,OFFSET BUFFER+8 MP1,A A,8 COUNT,A A,OFFSET TABLE TBLP,A IAR1 IAR0 TBLP MP0 MP1 COUNT COPY_1 ;CLEAR BUFFER ;READ TABLE DATA AND COPY TO BUFFER ;INCREASE TABLE POINTER ;POINT TO NEXT BUFFER ADDRESS ;POINT TO NEXT BUFFER ADDRESS ;COUNT-1 = 0? ;NO, COPY NEXT BYTE ;YES, RETURN ;SET BYTE COUNTER ;INITIAL TABLE POINTER ;INITIAL MEMORY POINTER 1 ;INITIAL MEMORY POINTER 0 ;========================================================================================598 99 100 101 102 104 105 106 107 108 109 110 111 COPY103 COPY_1: CLR112 ;======================================================================================== 113 ; PROC : DELAY 114 ; FUNC : DEALY ABOUT ACC*10mS @fSYS=4MHz 115 ; PARA 116 ; REG 118 DELAY 119 120 DEL_1: 121 122 DEL_2: 123 : ACC : DELAY FACTOR : DEL1,DEL2,DEL3 PROC MOV MOV MOV MOV MOV DEL1,A A,30 DEL2,A A,110 DEL3,A ;SET DEL3 COUNTER ;SET DEL2 COUNTER ;SET DEL1 COUNTER117 ;======================================================================================== 第五章 进阶实验篇5-37124 DEL_3: 125 126 127 128 129 130 131 DELAY 132 134 135 136 137 138 139 140 141SDZ JMP SDZ JMP SDZ JMP RET ENDP ORG DC DC DC DC DC DC DC ENDDEL3 DEL_3 DEL2 DEL_2 DEL1 DEL_1;DEL3 DOWN COUNT ;DEL2 DOWN COUNT ;DEL1 DOWN COUNTLASTPAGE 011000B133 TABLE: DC程序 解说: 程序 解说:5 8~15 18 20 22~25 26~27 载入”5-4.INC”定义档,其内容请参考随书光盘中的档案。 依序定义变量地址。 声明内存地址由 00h 开始(HT66Fx0 复位向量)。 声明内存地址由 24h 开始(HT66F50 TB0 中断向量地址)。 将 SCAN_PORT、DOT_PORT 定义成输出模式,并熄灭所有灯号。 定义 TBC 控制寄存器: TBCK:1,选择计数频率来源为 fSYS/4; TB0[2:0]:011,设定 Time Base Interrupt 周期时间为 2048×(fSYS/4)P2.048ms @fSYS=4MHz。 28~29 30 使能中断总开关(EMI)与 TB0(TB0E),HT66F50 可开始接受 TB0 中断。 调用 COPY 子程序,将点矩阵图案复制到 BUFFER[0]~BUFFER[7],以便进入 ISR_TB0 后送出显示数据; COPY 子程序会同时将 BUFFER[8]~BUFFER[15]的内 容清除。 32~35 36 37~38 将 MP0 指向 BUFFER[]数组的起始地址, 并设定 SCAN 扫描存储器为 B。 设定 TBON 为“1”,TBC 开始计数。 调用 DELAY 子程序,延迟 100ms;延迟时间的计算请参考【实验 4-1】。5 5-38A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明39 40~41设定 TBON 为“0”,停止 TBC 计数。 调用 SHIFT 子程序,将 BUFFER[0]~BUFFER[15]的数据循环移位一次;并重新显 示点矩阵图案(JMP MAIN_1)。45~63TB0 中断服务子程序,根据 SCAN 存储器之值送出扫描列的信号,并依 MP0 指定 的地址送出对应的位图案。将 SCAN 存储器左移之后判断是否已完成八列的扫描, 若是则重新将 MP0 指向 BUFFER[]数组的起始地址;否则继续下一列扫描。69~88SHIFT 子程序,运用间接寻址法将存储器 BUFFER[0]~BUFFER[15]内的数据循环 移位一次,如下图:94~111COPY 子程序,根据 TBLP 指定的位置,将连续八个地址所存放的点阵数据由程序 存储器复制到 BUFFER[0]~BUFFER[7]数组; 并将 BUFFER[8]~BUFFER[15]清除 为零。5118~131 133~140DELAY 子程序,延迟时间的计算请参考【实验 4-1】。 两组点矩阵图案数据建表区。COPY子程序的功能, 是运用间接寻址法将8 Bytes的字型码由程序存储器复制 到数据存储器BUFFER[0]~BUFFER[7], 且同时将BUFFER[8]~BUFFER[15]的内 容清除为零。SHIFT子程序则担负起将BUFFER中的数据循环移位一次的工作,以 制造字型移动的显示效果。程序中每次都将BUFFER[0]~BUFFER[7]的字型码重复 显示100ms, 所以字型是以每列100ms的速度向上移动, 读者可以试着调整DELAY 时间来改变字型移动的快慢。5-4-5动动脑+动动手: 动动脑 动动手: 动动手试着改写【程序 5-4】 ,使图案的移动由向上移变成往下移。 是否可以试着写出向左、向右移动的控制程序呢? 若修改 5-3.INC 定义档的设定, SCAN_PORT、 使 DOT_PORT 的定义调换; 请问执行结果有何不同?请读者先由分析中预测其结果再与实际的执行结 果比对。 试着增加另一组图案并改写【程序 5-4】 ,使两个图案交替移动。 第五章 进阶实验篇5-395-55-5-1LCD界面实验目 的:本实验介绍液晶显示器(LCD)的基本构造与驱动原理,并利用HT66F50的 LCD输出接口与I/O脚位控制,配合STM Timer/Counter模式的运作,达到在LCD 上显示计时的功能。5-5-2学习重点: 学习重点:通过本实验,读者应了解LCD的驱动原理,并学习如何以HT66F50 COM0~ COM3配合I/O脚位,进行LCD所提供的各项图案与数值显示;另外,对于STM的 计时功能运用应更加熟练。5-5-3电路图: 电路图:5【图 5-5-1】LCD 控制电路在单片机的应用中,人机界面占据相当重要的地位;其主要包括事件输入以及 结果指示,结果指示通常包括LED/LCD显示、通信接口、外围设备操控等等。而 在这些人机界面当中,LCD 显示技术由于其具有显示多样化、成本较低、省电等 特点而得以广泛使用于各式应用场合。 5-40A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明讲解LCD驱动之前,先就其显示原理做一简单的介绍。“LCD(Liquid Crystal Display)”是利用液晶分子的物理结构与光学特性进行显示的一种技术。液晶分 子是介于固体和液体之间的一种棒状结构的大分子物质。在自然状态下,其具有光 学各向异性的特点;而在电(磁)场作用下,则呈现各向同性的特性,以下以TN (Twisted Nematic1)LCD面板的基本结构说明其基本显示原理。(a)玻璃基板间未加电压偏光板 玻璃基板 液晶分子涂层 玻璃基板 偏光板5螺旋结构 AC(b)玻璃基板间加上电压【图 5-5-2】LCD 控制电路如【图5-5-2】所示,LCD面板由上、下玻璃基板与偏光板组成,在两玻璃基 板之间,按照螺旋结构将液晶分子有规律的进行涂层。液晶面板的电极是通过一种 ITO(Indium Tin Oxide)的金属化合物蚀刻在两层玻璃基板上。液晶分子的排列 为螺旋结构,对光线具有“旋光性 (Rotation of Polarization)”,上、下偏光板的 偏振角度相互垂直。当上下基板间未加电压时,自然光通过偏光板后,只有与偏光 板方向相同的光线得以进入液晶分子的螺旋结构涂层中,由于螺旋结构的旋光性, 将入射光线方向旋转九十度后照射到另一端的偏光板上。由于上、下偏光板的偏振 角度相互垂直,入射光线通过另一端的偏光板完全反射,光线完全进入观察者的眼 中,看到的效果就为白色(亮的状态)。若在上、下基板间施加电压时,液晶分子 的螺旋结构在电(磁)场的作用下,变成了同向排列的结构,对入射光线方向未产 生任何旋转作用。然而,由于上、下偏光板的偏振角度相互垂直,入射光线无法经 由另一端的偏光板反射,导致光线无法进入观察者的眼中,此时看到的效果就为黑 色(暗的状态)。如此通过在上、下玻璃基板电极间施加不同的电压,即可实现液 晶显示的两种基本状态:亮(未加偏压)和暗(施加偏压)。在实际的LCD驱动电 压中,有几个参数相当重要: 交流电压,液晶分子是需要交流信号来驱动的,直1 向列型液晶:液晶分子大致以长轴方向平行配置,因此具有一度空间的规则性排列。此类型液晶的黏度小、反应速 度快,是最早被应用的液晶;普遍使用于液晶电视、膝上型计算机以及各类型显示装置上。 第五章 进阶实验篇5-41流电压长时间的加在液晶分子两端,将会影响液晶分子的电气与化学特性,引起显 示模糊以及寿命的减短,其破坏性为不可恢复; 扫描频率,驱动液晶分子的交流 电压频率一般在60~100Hz之间,具体的频率是依LCD面板的面积与设计而定。频 率过高,会增加驱动所需的功耗;频率太低,将导致显示闪烁的情形。 液晶分子是一种电压积分型材料,它的扭曲程度(透光性)仅仅和极板间电压 的有效值2有关,和充电波形无关。LCD显示亮、暗的分界电压称为Vth,当电压有 效值超过Vth,螺旋结构的旋光角度加大;透光率急剧变化、透明度急剧上升。反 之,则透明度急剧下降。光线的透射率与交流电压的有效值关系如【图5-5-3】:【图 5-5-3】光线的透射率与交流电压的有效值的关系图5(a)外观(b)背板-COM 端布线(c)SEG 端布线【图 5-5-4】简易型 LCD 面板布线范例市面上有许多LCD专用的驱动IC (LCD Driver) 或内建LCD驱动接口的单片机, 正是经由系统的控制, 依照使用者定义的显示图案, 产生点亮LCD所需的驱动波形, 点亮对应的图样(Pattern)而达到显示的效果。然而这类芯片能驱动的点数一般 比较多,在需要少量点数显示的应用场合就显得浪费。单片机的I/O通过适当的程 控与硬件分压的设计,也可以达到驱动LCD的效果;这在一般少点数的LCD应用上 是十分普遍的应用。如【图5-5-4】是一个3 COMs×6 SEGs的简单型LCD面板范 例,厂商除了提供布线图之外,通常也会一并提供如【表5-5-1】的LCD区段码对 应表。读者可将SEG与COM视为【图5-5-2】的上、下玻璃基板电极,所以只要于 两端提供适当的偏压,即可控制各个节段的亮和暗。注意,如前所述,为了避免液 晶分子的寿命减短,此一偏压必须是交流电压!此类LCD是以区段(Segment)方2此有效值是指电压的均方根值(Root-Mean-Square;RMS)。 5-42A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明式控制显现图案的,故一般称为“Segment Type”LCD Pannel。【表 5-5-1】COMs×6 SEGs LCD 对应表COM0 COM1 COM2 SEG0 1e 1b 1g SEG1 1d 1a 1f SEG2 1c SEG3 2e 2b 2g SEG4 2d 3a 4f SEG5 2c -【图 5-5-5】以单片机 I/O 引脚驱动 LCD 范例5【图5-5-5】是直接以HT46R22单片机的I/O引脚驱动LCD的范例,请注意在 PB[7:6]与PB3引脚上连接了39K 的电阻至地,由于HT46R22 I/O引脚的内部上拉 电阻约在30K ~50K 之间(工作于5V时),通过输出电位的改变与输入/输出模 式的切换, 即可提供LCD COM端三组不同的电压: 当PB为输出模式且输出High, COM端电压为VDD; 当PB为输出模式且输出Low,COM端电压为0V(即VSS); 当PB为输入模式时,COM端电压为 。只要能配合程序的控制,在适当时机送 出SEG端与COM端的信号, 即可达到LCD显示的效果。 【图5-5-6】 是COM端电压、 SEG端电压与LCD亮点的关系,请读者参考图中的相关说明;请注意,图中COM 端与SEG端电位差的平均值恒为零,这就达到了“液晶分子需以交流信号驱动”的 基本原则! 第五章 进阶实验篇5-435【图 5-5-6】LCD 面板的驱动信号送至SEG端的电压有两种:VA(即VDD)或VSS(即0V);当COM端输出电压 是在VB(即VDD/2)时, 由于上、下玻璃基板电极间的偏压仅可能为VDD/2或-VDD/2, 其有效值小于LCD的临界电压Vth,所以此时LCD呈现亮的状态。然而,当COM电 压为VA或VSS时,玻璃基板电极两端的偏压可能为VDD、-VDD或0V。毫无疑问的, 当偏压为0V时, LCD为亮的状态; 而若两端电压为VDD或-VDD时, 其有效值大于Vth, 故LCD呈现暗的状态。通过如【图5-5-6】的信号机制,在1、2、3三个不同时间区 段分别让COM0~COM2逐一到达VA、VSS的值,再通过SEG电压的配合,可以让 对应的节段在适当时机呈现亮、暗的状态,进而显示出对应的图案或字型。另外, 在1、2、3三个时间区段点亮各节段时,是在COM与SEG端先提供VDD的电压后再 转为-VDD,此方式将可延长LCD的使用寿命。不过,请读者注意,在此所指的“暗” 状态,是指可以看到图样的情况。请参考【图5-5-7】的显示范例;图中所显现的 区段是在电极偏压有效值大于Vth时,各区段呈现暗的状态。【图 5-5-7】Segment Type LCD 面板应用范例 5-44A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明【图5-5-6】中,在1、2、3三个不同时间区段分别让COM0~COM2逐一输出 VA、VSS的值,让LCD面板呈现一次图案的显现称之为“帧(Frame)”。帧扫描 频率一般在60~100Hz之间,实际的频率是依LCD面板的面积与设计而定。频率过 高,会增加驱动所需的功耗;频率太低,将导致显示图案产生闪烁的情形。LCD的 “占空比(Duty)”是指每个COM的有效选通时间(如【图5-5-6】中COM电压维 持在VA以及VSS的区间)与整个扫描周期的比值;由于 STN/TN的LCD一般是采用 分时动态扫描的驱动模式,其Duty是固定为 。例如【图5-5-4】的简易型LCD面板,其占空比为 。LCD的偏压是指SEG/COM的电位差,而“偏压比(Bias)” 通常是以最低与最高电位差的比值来表示,如【图5-5-6】所示的驱动波形,其偏 压比为 。一般而言,Bias和Duty之间是有一定关系的;COM数越多,则每根COM 对应的扫描时间变短,若要达到同样的显示亮度和显示对比度,VA电压就要提高, 亮与暗的电位差亦需加大!5【图 5-5-8】HT66F50 LCD 驱动接口架构【图5-5-8】是HT66F50内建的LCD界面,由架构上不难看出它是将一般以单 片机I/O产生LCD驱动信号所需外加的偏压电阻纳入MCU内部,其可提供 、四个COM(Common)端,至于SEG(Segment)端的段数就取决于使用者对于整 体I/O脚位的定义。通过SCOMC控制寄存器的设定,尚可调整LCD的驱动电流,详 细的说明请读者参阅【2-10节】。【表 5-5-2】本实验相关控制寄存器【2-10 节】 【2-4 节】 SCOMC INTC0 INTC1 MFI0 TM2C0 TM2C1 【2-5-2 节】 TM2DL TM2DH TM2AL TM2AHBit 7 6 5D7 - ADF T2AF T2PAU T2M1ISEL1 CP0F MF1F T2PF T2CK2 T2M0ISEL0 INT1F MF0F T0AF T2CK1 T2IO1SCOMEN COM3EN COM2EN COM1EN COM0EN INT0F CP1F T0PF T2CK0 T2IO0 TM2D[7:0] TM2D[15:8] TM2A[7:0] TM2A[15:8]4 3 2 1 0CP0E ADE T2AE T2ON T2OCINT1E MF1E T2PE - T2POLINT0E MF0E T0AE - T2DPXEMI CP1E T0PE - T2CCLR 第五章 进阶实验篇5-45本实验的电路如【图5-5-1】所示,LCD的外观与COM/SEG结构请参考【图 5-5-9】与【表5-5-3】。根据【图5-5-5】范例电路的说明,欲产生如【表5-5-3】 规格的LCD驱动信号,需四个不同时间区段(以下简称“Phase”)分别将VDD、 0V的电压送至COM0~COM3以完成一次帧扫描,至于扫描过程中对应的字节 (Segment)是亮或暗,就取决于在SEG0~SEG8所给予的信号电平而定了。【表 5-5-3】4 COMs×9 SEGs LCD 对应表SEG0 COM0 COM1 COM2 COM3 1a 1f 1g 1e SEG1 1b 1c 1d COL SEG2 2a 2f 2g 2e SEG3 2b 2c 2d ℃ SEG4 3a 3f 3g 3e SEG5 3b 3c 3d AM SEG6 4a 4f 4g 4e SEG7 4b 4c 4d PM SEG8 P1 P2 P3 P4【图 5-5-9】本实验采用的 LCD 字节对应 【表 5-5-4】本实验 LCD 驱动信号定义Phase0 PhaseCount COM0 COM1 COM2 COM3 005Phase3 6 7Phase1 2 3Phase2 4 51VDDVDDVDDV VDDV VDDV V VDDV V VDD202VDD2DD2DD2DD2DDV V VDDV V VDD2DD2DD202VDD2DD2DDV VDDV VDD2DD2DD2DD2DD202VDDVDDVDD222222信号电平 送至 Segment 信号电平 Segment 不显现 Segment 显现0 VDD VDD 0 0 VDD VDD 0 0 VDD VDD 0 0 VDD VDD 0 5-46A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明5-5-4程序及流程图: 程序及流程图:5 第五章 进阶实验篇5-47程序5-51 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46LCD控制实验 By Steven;PROGRAM: 5-5.ASM (5-5.PJT) ;FUNCTION: LCD DEMO PROGRAM ;NOTE: USING STM AS A 16-BIT TIMER #INCLUDE MY_DATA DEL1 DEL2 DEL3 COUNT SECOND MINUTE DISPBUF DIGIT PhaseCount SecCounter FG_HalfSEC STACK_A STACK_STATUS #INCLUDE MY_CODE ORG JMP ORG JMP INIT: CLR MOV MOV MOV CLR CLR CLR CLR CLR CLR MOV MOV SET SET CLR MOV MOV MOV MOV 5-5.INC .SECTION 00H INIT 14H ISR_STM ACERL A,B CP0C,A CP1C,A SEGBYTEC SEG9C COM0C COM1C COM2C COM3C A,B SCOMC,A MF0E T2AE TM2C0 A,B TM2C1,A A,LOW TM2AL,A 4000 AT 0 'CODE' HT66F50.INC .SECTION DB DB DB DB DB DB DB DB DB DB DBIT DB DB ? ? 'DATA' ? ? ? ? ? ? 5 DUP (?) 4 DUP (?) ? ?;======================================================================================== ;==DATA SECTION== ;DELAY LOOP COUNT 1 ;DELAY LOOP COUNT 2 ;DELAY LOOP COUNT 3 ;COUNTER ;SECOND BUFFER ;MINUTE BUFFER ;LCD DISPLAY BUFFER ;DISPLAY DATA 1 ;LCD PHASE COUNT ;COUNTER FOR 0.5 SECOND ;FLAG FOR 0.5 SECOND ;STACK BUFFER FOR ACC ;STACK BUFFER FOR PSW;======================================================================================== ;======================================================================================== ;==PROGRAM SECTION== ;HT-66FX0 RESET VECTOR ;HT-66F50 TB0 INTERRUPT VECTOR ;Digital I/O Pin is assigned as a I/ODisable Comparator 0 FDisable Comparator 1 FCONFIG SEGBYTE PORT AS OUTPUT MODE ;CONFIG SEG9 PORT AS OUTPUT MODE ;CONFIG COM0 PORT AS OUTPUT MODE ;CONFIG COM1 PORT AS OUTPUT MODE ;CONFIG COM2 PORT AS OUTPUT MODE ;CONFIG COM3 PORT AS OUTPUT MODE ;ENABLE LCD FUNCTION AND, ;SET COM0~COM3 1/2 BIAS OUTPUT ;ENABLE STM INTERRUPT ;ENABLE T2CCRA COMPARE INTERRUPT ;fINT=fSYS/4=1MHSTM IS IN THE TIMER/COUNTER MODE, ;AND TM2D IS CLEARED BY CCRA COMPARE MATCH ;SET 4ms STM TIMER INTERRUPT5 5-48A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67MOV MOV CLR CLR SET CLR CLR MOV MOV CLR CLR CLR CLR CLR CLR CLR CLR CLR CLR CLR SET SET SET MAIN: LOOP: MOV MOV SNZ JMP CLR SZ JMP MOV XORM SDZ JMP MOV ADD DAA MOV XOR SNZ JMP CLR MOV ADD DAA MOV XORA,HIGH 4000 TM2AH,A T2AF MF0F EMI PhaseCount FG_HalfSEC A,125 SecCounter,A DISPBUF[0] DISPBUF[1] DISPBUF[2] DISPBUF[3] DISPBUF[4] SECOND MINUTE DIGIT[0] DIGIT[1] DIGIT[2] DIGIT[3] COL AM T2ON A,2 COUNT,A FG_HalfSEC $-1 FG_HalfSEC PhaseCount $-1 A,B A,DISPBUF[0] COUNT LOOP A,1 A,SECOND SECOND A,60H A,SECOND Z UPDATE SECOND A,1 A,MINUTE MINUTE A,60H A,MINUTE ;1 HOUR? ;BCD ADJUST ;NO. ;YES,RESET SECOND BUFFER ;UPDATE MINUTE BUFFER ;1 MINUTE? ;BCD ADJUST ;REACH 1 SEC ? ;NO ;UPDATE SECOND BUFFER ;WAIT FOR 0.5 SECOND ;RESET 0.5 SECOND FLAG ;PHASE COUNT=0 ? ;NO. WAIT ;TOGGLE LCD &COL(:)& SEGMENT ;DISPLAY &:& ;DISPLAY &AM& ;START STM ;SET COUNT=2 ;2*0.5SEC = 1SEC ;INITIAL DIGIT BUFFER ;INITIAL TIMER BUFFER ;CLEAR ALL DISPLAY BUFFER ;CLEAR T2AF ;CLEAR MF0F ;ENABLE GLOBAL INTERRUPT ;INITIAL PHASE COUNTER ;CLEAR FLAG ;INITIAL COUNTER FOR 1 SECOND COUNTING568 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 第五章 进阶实验篇5-4994 95 96 97 98 99 101 102 103 104 105 106 107 108 109 110 111 112 113 115 ; 116 ;SNZ JMP CLR MOV XORM XORM AND MOV MOV AND MOV SWAPA AND MOV MOV AND MOV JMP ORGZ UPDATE MINUTE A,B A,DISPBUF[2] A,DISPBUF[3] MINUTE A,0FH DIGIT[0],A A,MINUTE A,0FH DIGIT[1],A SECOND A,0FH DIGIT[2],A A,SECOND A,0FH DIGIT[3],A MAIN LASTPAGE-100H ;RE-DO ;UPDATE LOW NIBBLE ;UPDATE HIGH NIBBLE ;UPDATE LOW NIBBLE ;TOGGLE LCD &AM& SEGMENT ;TOGGLE LCD &PM& SEGMENT ;UPDATE HIGH NIBBLE ;NO. ;YES.RESET MINUTE BUFFER100 UPDATE:SWAPA114 ;======================================================================================== STM INTERRUPT SERVICE ROUTINE 4 COMs x 13 SEGMENTs LCD SCANNING PROCEDURE STACK_A,A A,STATUS STACK_STATUS,A T2AF A,PhaseCount A,0 Z $+3 UPDATE_DISPALY ISR_STM_1 PhaseCount.0 $+6 DISPBUF[0] DISPBUF[1] DISPBUF[2] DISPBUF[3] DISPBUF[4] DISPBUF[0] DISPBUF[1] DISPBUF[2] DISPBUF[3] DISPBUF[4] ;COMPLEMENT DISPBUF[] ;NO.CHECK IF PhaseCount=2,4,6 ? ;NO. ;YES,ROTATE LEFT DISPBUF[] ;CHECK IF PhaseCount=0 ;NO ;YES. ;PUSH STATUS ;PUSH A117 ;======================================================================================== 118 ISR_STM:MOV 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 MOV MOV CLR MOV XOR SNZ JMP CALL JMP SZ JMP RR RR RR RR RR CPL CPL CPL CPL CPL5140 ISR_STM_1: 5-50A/D Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明141 142 143 144 145 146 147 148 149 150 151 153 154 156 157 159 160CALL MOV ADDM JMP JMP JMP JMP JMP JMP JMP JMP CLR JMP SET JMP CLR JMP SET JMP CLR JMP SET JMP CLR INC JMP SET CLR RR SWAP CPL RR SWAP CPL RR SWAP CPL RR SWAPSEGMENTOUT A,PhaseCount A,PCL COM0_0 COM0_1 COM1_0 COM1_1 COM2_0 COM2_1 COM3_0 COM3_1 COM0EN COM0 COM3_0+2 COM0EN COM0 COM3_0+2 COM1EN COM1 COM3_0+2 COM1EN COM1 COM3_0+2 COM2EN COM2 COM3_0+2 COM2EN COM2 COM3_0+2 COM3EN COM3 PhaseCount $+19 COM3EN COM3 PhaseCount DISPBUF[0] DISPBUF[0] DISPBUF[0] DISPBUF[1] DISPBUF[1] DISPBUF[1] DISPBUF[2] DISPBUF[2] DISPBUF[2] DISPBUF[3] DISPBUF[3];SET SEGMENT 1~9 STATE ;COMPUTATIONAL JUMP ;JUMP COM0 LOW PROCESS ;JUMP COM0 HIGH PROCESS ;JUMP COM1 LOW PROCESS ;JUMP COM1 HIGH PROCESS ;JUMP COM2 LOW PROCESS ;JUMP COM2 HIGH PROCESS ;JUMP COM3 LOW PROCESS ;JUMP COM3 HIGH PROCESS ;DISABLE COM0 PORT 1/2 BIAS OUTPUT ;SET COM0 PORT LOW ;DISABLE COM0 PORT 1/2 BIAS OUTPUT ;SET COM0 PORT HIGH ;DISABLE COM1 PORT 1/2 BIAS OUTPUT ;SET COM1 PORT LOW ;DISABLE COM1 PORT 1/2 BIAS OUTPUT ;SET COM1 PORT HIGH ;DISABLE COM2 PORT 1/2 BIAS OUTPUT ;SET COM2 PORT LOW ;DISABLE COM2 PORT 1/2 BIAS OUTPUT ;SET COM2 PORT HIGH ;DISABLE COM3 PORT 1/2 BIAS OUTPUT ;SET COM3 PORT LOW152 COM0_0: CLR155 COM0_1: CLR158 COM1_0: CLR161 COM1_1: CLR5162 163 165 166 168 169 171 172 173 175 176 177 178 179 180 181 182 183 184 185 186 187164 COM2_0: CLR167 COM2_1: CLR170 COM3_0: CLR174 COM3_1: CLR;DISABLE COM3 PORT 1/2 BIAS OUTPUT ;SET COM3 PORT HIGH ;RESET PHASE COUNTER TO RE-START ;RESTORE DISPLAY BUFFER 第五章 进阶实验篇5-51188 189 190 191 192 193 194 195 196 197 198 199 200CPL RR SWAP CPL SDZ JMP MOV MOV SET MOV MOV MOV RETIDISPBUF[3] DISPBUF[4] DISPBUF[4] DISPBUF[4] SecCounter $+4 A,125 SecCounter,A FG_HalfSEC A,STACK_STATUS STATUS,A A,STACK_A ;POP STATUS ;POP A ;SET FLAG ;RELOAD COUNTER ;CHECK IF 0.5 SECOND201 ;===============================================================

我要回帖

更多关于 16x16led点阵 电路图 的文章

 

随机推荐