Holtek(合泰)单片机指令介绍

合集下载

合泰单片机总结

合泰单片机总结
fun()
{
}
void ISR_tmr0(void)
{
#asm
call _fun;
#endasm
}
7.宏定义
#define_pa0_12_0//bit 0 of RAM address 0x12
8.位变量定义
对于有多个bank的MCU,位变量只能定义在bank0,使用如下方式
#内嵌汇编
#asm
[label:] opcode [operands]
...
#endasm
Eg:
char a;
int b;
voidfun(char p1,int p2)
{
a = p1;
#asm // b = p2;
MOV A,fun1
MOV _b,A
MOV A,fun1[1]
mov _b[1],A
}
int (*const p)() =fun; // global and initialization required
void main()
{
int a;
a=(*p)();
}
(3)不支持取得const常量的地址
const int ldc = 0;
void main(){
int *a;
a = &ldc; // cannot pass
MOV A,CR2
MOV fun0,A ; p1 = d2
MOV A,CR1
MOV fun1,A
MOV A,CR1[1]
MOV fun1[1],A ; p2 = d1
CALL _fun
#endasm
}
11.预编译指令
12.编译器特殊选项

HOLTEK HT47C10L 8 位 R-F 型低电压 Mask 单片机 说明书

HOLTEK HT47C10L 8 位 R-F 型低电压 Mask 单片机 说明书

HT47C10L8位R-F 型低电压Mask 单片机特性工作电压1.2V~2.2V 8个双向输入/输出口内置32kHz/128kHz RC 振荡器(掩膜选项128kHz 振荡只提供给EL 输出) 看门狗定时器1K×16程序存储器ROM 32×8数据存储器RAM 一个时基(Time Base) 一组蜂鸣器输出一组EL 输出电压可调的低电压检测功能HALT 和唤醒功能可降低功耗9×4段1/4duty 1/2bias 的液晶显示驱动电路RC 型A/D 转换通道2层硬件堆栈位操作指令查表指令表格内容字长16位当系统时钟为32768Hz 时指令周期为122µs 指令执行时间为1或2个指令周期63条指令44-pin QFP 封装概述HT47C10L 是8位高性能精简指令集单片机单指令周期和两级流水线结构使其适合高速应用的场合特别适用于体温计产品方框图Pad图*IC的衬底要连接到PCB板上的VSS低电平有效输出口每一位都可以作为唤醒输入输出共用引脚一旦PA0/PA1设置为蜂鸣器输出自内部蜂鸣器时钟发生器输出或带上拉电阻的斯密特输入输出口每一位都可以作为唤醒输入输出共用引脚一旦输出其信号来自可由软件设置为输出或带上拉电阻的位双向输入输出口每一位都可以作为唤醒输入输出或带上拉电阻的斯密特输入负电源VCCC1倍压电路VCC=2×VDDVCC LCD 工作电压需要在 C1C2VCC 开关引脚SEG8~SEG0LCD 驱动的和Common 输出正电源 LVD B 低电压检测A/D 转换转换参考电阻连接引脚转换传感器电阻连接引脚带上拉电阻正常使用时不必连接正常使用时不必连接极限参数电源供应电压………….-0.3V~2.5V 储存温度………….-50~125 端口输入电压………….V SS -0.3V~V DD +0.3V 工作温度………..….-40~85注这里只强调额定功率超过极限参数所规定的范围将对芯片造成损害无法预期芯片在上述标示范围外的工作状态而且若长期在标示范围外的条件下工作可能影响芯片的可靠性f=32kHzLVD关闭f OSC=128kHz=32kHzLVD关闭Ω*C=2200pFf OSC=32kHzLVD关闭f OSC=32kHz=32kHzLVD关闭Ω*C=2200pFLVD打开无负载系统关闭f OSC=32kHzLVD关闭f OSC=32kHz=32kHzLVD关闭1.5V — PA0(BZ))PA2(EL1)PA3(EL2)PA4~PA7PA0(BZ))PA2(EL1)PA3(EL2)PA4~PA7口灌电流LVD测试条件最小标准最大单位符号参数V DD条件f32k振荡器时钟(32kHz) 1.5V 26 32 40 kHz f128k振荡器时钟(128kHz) 1.5V 102 128 160 kHz t RES外部复位低电平脉宽 1.5V 100 — — µsf AD A/D转换频率 1.5V — — 50 kHz 系统功能说明指令执行时序HT47C10L系统频率来自32kHz的内部RC振荡芯片将此频率分成四个互不重叠的时钟周期(T1T2T3T4)一个指令周期包括四个系统时钟周期指令的读取和执行是以流水线方式进行的, 这种方式在一个指令周期进行读取指令操作而在下一个指令周期进行解码与执行该指令因此流水线方式使多数指令能在一个周期内执行完成但如果渉及到的指令要改变程序计数器的值就需要花两个指令周期来完成这一条指令指令执行时序程序计数器 — PC10位的程序计数器(PC)用来控制程序存储器ROM中指令执行的顺序最大可以访问1024个地址取得指令码以后程序计数器会自动加一指向下一个指令码的地址但如果执行跳转条件跳跃向PCL赋值子程序调用初始化复位内部中断外部中断子程序返回等操作时PC会载入与指令相关的地址而非下一条指令地址当遇到条件跳跃指令且符合条件时当前指令执行过程中读取的下一条指令会被丢弃取而代之的是一个空指令周期随后才能取得正确的指令反之就会顺序执行下一条指令程序计数器的低字节(PCL)是一个可读写的寄存器(06H)对PCL赋值将产生一个短跳转动作跳转的范围为当前页256个地址当遇到控制转移指令时系统也会插入一个空指令周期程序计数器模式*9 *8 *7 *6 *5 *4 *3 *2 *1 *0 初始化复位0 0 0 0 0 0 0 0 0 0定时/计数器中断0 0 0 0 0 0 0 1 0 0时基中断0 0 0 0 0 0 1 0 0 0条件跳跃PC+2装载PCL *9 *8 @7 @6 @5 @4 @3 @2 @1 @0跳转子程序调用#9 #8 #7 #6 #5 #4 #3 #2 #1 #0从子程序返回S9 S8 S7 S6 S5 S4 S3 S2 S1 S0程序计数器注*9 ~ *0 程序计数器位#9 ~ #0 指令代码位S9 ~ S0 堆栈寄存器位@7 ~ @0 PCL位程序存储器 ROM程序存储器用来存放要执行的指令代码以及一些数据表格和中断入口程序存储器有1024×16位程序存储器空间可以用程序计数器或表格指针进行寻址以下列出的程序存储器地址是系统专为特殊用途而保留的地址000H该地址为程序初始化保留系统复位后程序总是从000H开始执行地址004H该地址为定时/计数器中断服务程序保留当定时/计数器发生溢出如果中断允许且堆栈未满则程序会跳转到004H地址开始执行地址 008H该地址为时基(Time Base)中断服务程序保留当时基发生溢出如果中断允许且堆栈未满则程序会跳转到008H地址开始执行表格区ROM空间的任何地址都可做为查表使用查表指令TABRDC [m](查当前页表格1页=256个字)和TABRDL[m](查最后页表格)会把表格内容低字节传送给[m]而表格内容高字节传送到TBLH寄存器(08H)只有表格内容的低字节被传送到目标地址中而高字节被传送到表格内容高字节寄存器TBLH表格内容高字节寄存器TBLH是只读寄存器表格指针(TBLP)是可读/写寄存器(07H)用来指明表格地址在查表之前要先将表格地址写入TBLP中如果主程序和中断服务程序(ISR)都用到查表指令主程序中TBLH的值可能会因为ISR中执行的查表指令而发生变化产生错误也就是说要避免在主程序和中断服务程序中都使用查表指令但如果必须这样做的话我们可以在查表指令前先将中断禁止在保存了TBLH的值后再开放中断以避免发生错误所有与表格有关的指令都需要两个指令周期的执行时间这里提到的表格区都可以做为正常的程序存储器来使用表格区指令*9 *8 *7 *6 *5 *4 *3 *2 *1 *0[m] P9 P8 @7 @6 @5 @4 @3 @2 @1 @0 TABRDC[m] 1 1 @7 @6 @5 @4 @3 @2 @1 @0 TABRDL表格区注*9~*0表格地址位@7~@0表格指针位P9~P8当前程序指针位堆栈寄存器 STACK堆栈寄存器是特殊的存储器空间用来保存PC的值HT47C10L有2级堆栈堆栈寄存器既不是数据存储器的一部分也不是程序存储器的一部分而且它既不能读出也不能写入堆栈的使用是通过堆栈指针(SP)来实现的堆栈指针也不能读出或写入当发生子程序调用或中断响应时程序计数器(PC)的值会被压入堆栈在子程序调用结束或中断响应结束时(执行指令RET或RETI)堆栈将原先压入堆栈的内容弹出重新装入程序计数器中在系统复位后堆栈指针会指向堆栈顶部如果堆栈已满并且发生了不可屏蔽的中断那么只有中断请求标志会被记录下来而中断响应会被抑制直到堆栈指针(执行RET或RETI指令)发生递减中断才会被响应这个功能可以防止堆栈溢出使得程序员易于使用这种结构同样如果堆栈已满并且发生了子程序调用那么堆栈会发生溢出首先进入堆栈的内容将会丢失只有最后的2个返回地址会被保留数据存储器 RAM数据存储器由548位组成分为两个功能区间特殊功能寄存器和通用数据存储器(328)数据存储器单元大多数是可读/写的但有些只读的特殊功能寄存器包括间接寻址寄存器0(00H)间接寻址指针寄存器0(MP001H)间接寻址寄存器1(02H)间接寻址指针寄存器1(MP103H)存储器段指针寄存器(BP04H)累加器(ACC05H)程序计数器低字节寄存器(PCL06H)表格指针寄存器(TBLP07H)表格内容高字节寄存器(TBLH08H)时基控制寄存器(TBC09H)状态标志寄存器(STATUS0AH)中断控制寄存器(INTC0BH)输入/输出寄存器(PA12H)计数器A高低位字节寄存器(TMRAH20H TMRAL21H)定时/计数器控制寄存器22H)定时计数器高低位字节寄存器(TMRBH23H TMRBL24H)RC型A/D转换控(ADCR25H)掩膜设置寄存器(OPT126H OPT227H)其余在之前的空间保留给系统以后扩展使用读取这些地址的返回值为00H通用数据寄存器地址从60H到用来存储数据和控制信息所有的数据存储器单元都能直接执行算术逻辑递减和循环操作除了一些特殊位外数据存储器的每一位都可由SET[m].i置位或由复位而且都可以通过间接寻址指针MP0和MP1进行间接寻址并无实际的物理区存在都是和单元间接读取00H地址得到的00H间接写入此地址不会产生任何操作间接寻址寄存器之间不支持数据传送功能间接寻址指针MP1用来指出间接寻址中RAM的地址只能用于数据存储器而能用于数据存储器和LCD显示存储器05H做为运算的立即数据存储器之间的数据传送必须经过累加器算术逻辑单元位算术逻辑运算的电路提供有以下功能(ADD ADC SUB SBC DAA)(AND OR XOR CPL)(PL RR RLC RRC)(INC DEC)分支判断(SZ SNZ SIZ SDZ…)ALU不仅可以储存数据运算的结果还会改变状态寄存器的值状态寄存器 STATUS8位的状态寄存器(0AH)由零标志位(Z)进位标志位(C)辅助进位标志位(AC)溢出标志位(OV)暂停标志位(PDF)和看门狗定时器溢出标志位(TO)组成该寄存器不仅记录状态信息而且还控制操作顺序除了PDF和TO标志外状态寄存器的其它位都可以用指令改变任何对状态寄存器的写操作都不会改变PDF和TO的值对状态寄存器的操作可能会导致与预期不一样的结果TO标志只受系统上电看门狗溢出CLR WDT指令或HALT指令的影响PDF标志只受系统上电CLR WDT指令或HALT指令的影响标志位Z OV AC和C反映的是最近一次操作的状态在进入中断程序或子程序调用时状态寄存器不会被自动压入堆栈如果状态寄存器的内容是重要的而且子程序会影响状态寄存器的内容那么程序员必须事先将STATUS的值保存好符号位功能C 0如果在加法运算中结果产生了进位或在减法运算中结果不产生借位,则C 被置位反之C 被清除它也可被循环移位指令影响AC 1如果在加法运算中低4位产生了进位或减法运算中低4位不产生借位则AC被置位反之AC 被清除Z 2 如果算术或逻辑运算的结果为零则Z 被置位反之Z 被清除OV 3如果运算结果向最高位进位但最高位并不产生进位输出则OV 被置位反之OV 被清除PDF 4系统上电或执行CLR WDT 指令PDF被清除执行HALT 指令PDF 被置位TO 5系统上电执行CLR WDT 或HALT 指令TO 被清除WDT定时溢出TO 被置位6 未用读出为07 未用读出为0状态寄存器中断HT47C10L 提供了一个定时器/计数器中断和一个时基中断中断控制寄存器(INTC 0BH) 包含了中断控制位和中断请求标志中断控制位用来设置中断允许/禁止寄存器 位 标志 功能0 EMI 总中断控制位(1=允许0=禁止) 1 ETI 定时/计数器中断控制位(1=允许0=禁止) 2 ETBI 时基中断控制位(1=允许0=禁止) 3 — 未用读出为04 TF 定时/计数器中断请求标志(1=有0=无)5 TBF 时基中断请求标志(1=有0=无)6 — 未用读出为0 INTC(0BH) 7 — 未用读出为0INTC 寄存器只要有中断子程序被服务其余的中断全部都被自动禁止(通过清除EMI 位)这种做法的目的在于防止中断嵌套这时如果有其它中断发生只有中断请求标志会被记录下来如果在中断服务程序中有另一个中断需要响应程序员可以置位EMI 和INTC 所对应的位以便进行中断嵌套如果堆栈已满则中断并不会被响应一直到堆栈指针(SP)发生递减后才会响应如果需要中断立即得到响应应避免堆栈饱和当有中断被服务系统会将程序计数器值压入堆栈然后再跳转至中断服务程序的入口但这时只有程序计数器的内容被压入堆栈如果其它寄存器和状态寄存器的内容会被中断程序改变从而会破坏主程序的控制流程的话程序员应该事先将这些数据保存起来内部定时/计数器中断是由定时/计数器溢出触发的其中断请求标志(TF INTC 的第4位)会被置位如果中断允许且堆栈未满当定时/计数器A 或定时/计数器B 发生中断时会产生地址04H 的子程序调用而中断请求标志TF 和总中断控制位EMI 会被清除以禁止其它中断响应时基中断是由置位时基溢出触发的其中断请求标志(TBF INTC 的第5位)会被置位如果中断允许且堆栈未满当发生时基中断时会产生地址08H 的子程序调用而中断请求标志TBF 和总中断控制位EMI 会被清除以禁止其它中断响应在执行中断子程序期间其它的中断请求会被屏蔽直到执行RETI 指令或EMI 和相关中断控制位被置位(当然此时堆栈未满)如果要从中断子程序返回只要执行RET 或RETI 指令即可其中RETI 指令会自动置位EMI 以允许中断服务而RET 则不会如果中断在两个连续的 T2脉冲的上升沿之间发生且中断响应允许那么在下两个T2脉冲之间该中断会被服务如果同时发生中断请求其优先级如下表示也可以通过设定各中断相关的控制位来改变优先级No. 中断源优先级中断向量a 定时/计数器中断 1 04Hb 时基中断 2 08H振荡电路HT47C10L提供32kHz或128kHz的内部RC振荡(由掩膜选项决定)但系统时钟只能用32kHz在HALT模式下可由掩膜选择RC振荡是否停止用户可以选择128kHz振荡频率作为EL输出看门狗定时器看门狗定时器的时钟来源有两种看门狗振荡器或指令时钟(系统时钟4分频)由掩膜选项设置看门狗定时器主要用来防止程序运行故障和程序跳入一死循环而导致不可预测的结果看门狗定时器可由掩膜选项设置为打开或关闭如果在关闭状态所有与WDT有关的指令操作都是没有作用的在HALT状态时如果RC振荡器继续工作WDT将继续计数而且WDT的计时溢出将导致系统从HALT模式中唤醒在正常运行时WDT溢出会使系统复位并置位TO标志但在HALT模式下WDT溢出只产生热复位只有程序计数器PC和堆栈指针SP被复位要清除WDT的值可以有三种方法外部复位(低电平输入到RES端)清除看门狗指令或HALT指令清除看门狗指令为CLR WDT只要执行CLR WDT指令就会清除WDT否则WDT会由于溢出而使系统复位WDT的溢出周期为f/215f s/216因为CLR WDT指令只能清除最后两级WDT分频器多功能计时器HT47C10L有一个多功能定时器提供看门狗定时器(WDT)和时基产生不同溢出周期此多功能定时器由一个8阶分频器及一个7位预分频器所组成使用的时钟源来自系统时钟多功能定时器同时为LCD 驱动电路和蜂鸣器提供时钟信号(fs/8)多功能计时器时基时基提供一个周期性溢出时间中断它的溢出时间范围为fs/28~fs/215由掩膜选项决定将数据写入RT2RT1和RT0(TBC第210位)之中会产生不同的溢出时间如果时基发生溢出现象则其对应的中断请求标志(TBF)会被置位如果中断允许且此时堆栈尚有空间则产生一个中断服务到08H的地址进入HALT模式后时基仍然工作并且可以唤醒HALT模式如果在进入HALT模式之前将TBF 置1的话则时基信号的溢出就不能唤醒系统RT2 RT1 RT0 Time Base分频级数0 0 0 280 0 1 290 1 0 2100 1 1 2111 0 0 2121 0 1 2131 1 0 2141 1 1 215暂停模式 HALT暂停模式是由HALT指令来实现的暂停模式时系统状态如下由STANDBY位(OPT1的第5位)设置f OSC和f SYS停止或继续振荡但T1将关闭RAM及寄存器的内容保持不变WDT被清除并重新计数所有的输入/输出口都保持其原先状态PDF标志位被置位TO标志位被清除由STANDBY位(OPT1的第5位)设置LCD开/关由STANDBY位(OPT1的第5位)设置时基停止或继续计数PA口唤醒和中断唤醒这两种方式可以视为正常运行的继续如果是输入/输出口唤醒程序即从下一条指令开始运行但如果是从中断唤醒的话此时可能会发生两种情况如果相关中断都被禁止或该中断被允许但堆栈已满程序会从下一条指令开始运行但如果该中断允许且堆栈尚未满则会产生中断响应当进入HALT状态以前某个中断请求位被置位那么系统不能用这个中断来唤醒如果唤醒是由于中断响应的话实际中断子程序的执行会延时一个以上的周期但是如果唤醒导致下一条指令执行那么在一个等待周期结束后指令就立即被执行另外为减少电源损耗在进入暂停模式之前应小心处理所有的输入/输出口复位总共有三种方法会产生初始复位正常运行时由RES引脚发生复位在暂停模式由RES引脚发生复位正常运行时由看门狗定时器溢出发生复位暂停模式中的看门狗定时器溢出与其它系统复位状况不同因为看门狗定时器溢出会执行热复位只有程序计数器PC和堆栈指针SP被复位而系统其它部分都保持原有状态在其它复位状态下某些寄存器不会改变在初始复位时大部分寄存器会复位成初始的状态通过检测PDF和TO标志即可判断出各种不同的复位原因系统复位时各功能单元的状态如下所示程序计数器(PC) 000H中断禁止预分频器清除看门狗定时器时基清除复位后定时器开始计数定时/计数器停止输入/输出口输入模式堆栈指针SP 指向堆栈的顶端定时/计数器HT47C10L提供一个16位定时/计数器可用作双通道的RC型A/D转换器ADC/TM位(ACDR寄存器的第1位)用来决定定时器A和定时器B是用作16位的定时/计数器还是用作RC型A/D转换器当ADC/TM为0时TMRAL TMRAH TMRBL TMRBH组成了16位的定时/计数器TMRBL 和TMRBH组成一个预置寄存器分别用来存放定时/计数器初始值的低字节和高字节定时计数器的时钟源可以是系统时钟(f SYS)或外部信号输入(RCIN引脚的A/D时钟)外部时钟输入允许用户去计算外部事件计数外部RC型的A/D时钟测量时间长度或脉宽或产生一个精确的时基信号总共有六个与定时/计数器有关的寄存器分别是TMRAH([20H])TMRAL([21H])TMRC([22H])TMRBH([23H])TMRBL([24H])和ADCR([25H])写入TMRBL只会将数据写入低字节内部缓冲器而写入TMRBH 则可把数据和低字节内部缓冲器的内容同时写到16位的定时计数器的预置寄存器定时计数器的预置寄存器在对TMRBH 写操作时改变而写TMRBL 将保持预置寄存器的值不变若读取TMRAH 则可将TMRAL 传送至低字节内部缓冲器之中以避免发生计时错误若读取TMRAL 则只读回低字节内部缓冲器的内容也就是说定时/计数器的低字节数据并不能直接读取若欲读取该低字节的数据必须先读取TMRAH 以便使定时/计数器的低字节数据锁存至内部低字节缓冲器之中TMRC 为定时/计数器的控制寄存器用来定义定时/计数器的某些选项定时/计数器的控制寄存器可以定义定时/计数器的工作模式计数允许/禁止以及计数的触发沿写入定时器B 就可以将定时/计数器的初始值放到预置寄存器中而读取定时器A 就可以得到定时/计数器的内容定时器B 是定时/计数器的初始值预置寄存器名称 位 功能0~2 未定义读取时为TE 3 定义定时/计数器TMR 作用沿(0=上升沿作用1=下降沿作用) TON 4 允许/禁止定时器计数(0=禁止1=允许)TN0 TN1 56 定义操作方式(TN1TN0)10=定时器模式(内部时钟f SYS ) 01=外部计数模式(外部时钟RCIN 引脚的A/D时钟输入) 11=脉冲宽度测量模式(RCINf SYS)00=未定义7 未定义读取时为0TMRC 寄存器TN0和TN1用来定义操作模式事件模式是用来计数外部事件这表示时钟来源(A/D 时钟)为外部RCIN 引脚的信号输入定时模式则作为普通定时器使用其时钟来源为内部系统时钟(f SYS )最后脉冲宽度测量模式能够对外部引脚RCIN 的高电平或低电平的持续时间进行测量计数的时钟来源为系统时钟在事件计数A/D 时钟或内部定时模式下一旦定时/计数器开始计数即从定时/计数器的现行内容(TMRAH 和TMRAL)开始计数至FFFFH 若发生溢出计数器即从定时/计数器预置寄存器(TMRBH 和TMRBL)重新装入加载值并同时置位中断请求标志(TF INTC 的第4位)在脉冲宽度测量模式下当TON 和TE 位的值都为1时如果引脚RCIN 接收到一个上升沿信号(如果TE 位的值为0则为下降沿信号)时计数器就会开始数直到RCIN 引脚回到原来的电平为止并且会将TON 位清零测量的结果会依然存放在定时/计数器之中也就是说一次只能计数一个脉冲的宽度而当TON 位重新置位为1只要RCIN 收到跳变脉冲测量就会再次执行下去在脉冲测量模式中定时/计数器并不会根据逻辑电压来计数其根据的标准为信号的转变沿一旦发生计数溢出计数器会从定时/计数器预置寄存器重新装入初值同时还会发出中断请求这种情况和其它两种模式一样若欲启动计数器运行只要将定时器启动位(TON TMRC 的第4位)的值设为1即可在脉冲宽度测量模式中TON 位在测量周期完成后会自动被清除但在其它两种模式中TON 位只可以用软件指令清除若在定时/计数器关闭的情况下将数据写入定时/计数器的预置寄存器同时也会将该数据重新载入定时/计数器之中但若定时/计数器已经开启写入定时/计数器的数据只会保存在定时/计数器的预置寄存器中这时定时/计数器并不会马上被改变而会继续计数下去直到发生溢出为止此时再由预置寄存器装入新的初始值一旦定时/计数器(读取TMRAH)的数据被读取会将时钟禁止以避免发生错误将可能会导致计数错误所以程序员必须考虑清楚才行我们强烈建议在打开定时/计数器前先将要加载的数据写入到TMRBL TMRBH TMRAL 和TMRAH 中去因为在系统初始化后TMRBL TMRBH TMRAL 和TMRAH 的值是未知的下例为定时/计数器的定时模式(禁止中断)clr tmrc clr adcr.1 ; 设置为定时/计数器模式 clr intc.4 ; 清除定时/计数器的中断请求标志位 mov a,low (65536-1000) ; 置定时器初值 mov tmrbl,a ; 计数1000然后定时器溢出mov a,high (65536-1000)mov tmrbh,a定时器时钟来源为f SYS并且允许定时器计数;mova,01010000bmov tmrc,ap10:clr wdt判断定时/计数器的中断请求标志位intc.4 ;snzjmp p10清除定时/计数器的中断请求标志位clr intc.4 ;; 程序继续RC型A/D转换HT47C10L有一个RC型的A/D转换通道包含两个可编程16位向上计数的计数器计数器A的时=32kHz)计数器B的时钟来源可以是外部RC振荡电路当ADC/TM位为1钟来源可以是系统时钟(f时(寄存器ADRC的第1位)TMRAL TMRAH TMRBL TMRBH组成了A/D转换器A/D转换定时器B的时钟来源为RSEN~RCIN振荡器或外部时钟输入(RCIN)定时器A的时钟来源可以通过TN1TN2来设置总共有六个与A/D转换器有关的寄存器分别是TMRAH TMRAL TMRC TMRBH TMRBL和ADRC内部定时器时钟输入到TMRAH和TMRAL中A/D时钟输入到TMRBH和TMRBL中OVB/OVA 位(ADCR寄存器的第0位)用来设置是否采用定时器A或定时器B溢出作为定时/计数器中断信号在A/D 转换模式下当定时器A或定时器B溢出时TON位被清除并且计数器停止计数写入TMRAH/TMRBH就是对定时器A/定时器B设置初值读取TMRAH/TMRBH就是读取定时器A/定时器B的内容写入TMRAL/TMRBL只能将数据写入内部缓冲器的低位字节但若写入的是TMRAH/TMRBH则可将数据和低字节内部缓冲器的内容同时写入定时器A/定时器B(16位)之中定时A/定时器B的内容只在写入TMRAH/TMRBH时改变但若写入TMRAL/TMRBL则可维持定时A/定时器B的内容不受改变若读取TMRAH/TMRBH则可将TMRAL/TMRBL传送至低字节内部缓冲器之中以避免发生计时错误然而若读取TMRAL/TMRBL则只读回低字节内部缓冲器的内容换言之定时器A/定时器B的低字节数据并不能直接读取若欲读取该低字节的数据必须先读取TMRAH/TMRBH以便将定时/计数器A B的低字节数据传送至内部低字节缓冲器之中。

合泰单片机ht46x65v220使用手册

合泰单片机ht46x65v220使用手册

注:这里只强调额定功率,超过极限参数所规定的范围将对芯片造成损害,无法预期芯片在上述标示范围外的工作状态,而 且若长期在标示范围外的条件下工作,可能影响芯片的可靠性。 Rev. 2.20 4 2014-06-06
HT46R65/HT46C65 直流电气特性
符号 VDD IDD1 IDD2 IDD3 ISTB1 ISTB2 参数 工作电压 工作电流 (晶体振荡、RC 振荡) 工作电流 (晶体振荡,RC 振荡) 工作电流 (fSYS=32768Hz) 静态电流 (*fS=T1) 静态电流 (*fS=RTC 振荡) 静态电流 (*fS=WDT 振荡) VDD — — 3V 5V 5V 3V 5V 3V 5V 3V 5V 3V 5V 3V 5V 3V 5V 3V 5V 3V 5V — 测试条件 条件 fSYS=4MHz fSYS=8MHz 无负载,ADC 关闭 fSYS=4MHz 无负载,ADC 关闭 fSYS=8MHz 无负载,ADC 关闭 无负载,系统 HALT, HALT 时 LCD 关闭 无负载,系统 HALT, HALT 时 LCD 打开, 电容型偏压 无负载,系统 HALT, HALT 时 LCD 打开, 电容型偏压 无负载,系统 HALT, HALT 时 LCD 打开, 电阻型偏压,1/2bias, VLCD=VDD (选择低电流偏压) 无负载,系统 HALT, HALT 时 LCD 打开, 电阻型偏压,1/3bias, VLCD=VDD (选择低电流偏压) 无负载,系统 HALT, HALT 时 LCD 打开, 电阻型偏压,1/2bias, VLCD=VDD (选择低电流偏压) 无负载,系统 HALT, HALT 时 LCD 打开, 电阻型偏压,1/3bias, VLCD=VDD (选择低电流偏压) — 最小 2.2 3.3 — — — — — — — — — — — — — — — — — — — 0 典型 — — 1 3 4 0.3 0.6 — — 2.5 10 2 6 17 34 13 28 14 26 10 19 —

合泰C语言用户手册

合泰C语言用户手册

函数 ....................................................................................................27
数组 ....................................................................................................28
注释 ......................................................................................................2
标识符..........................................................................................................3
位数据类型 ........................................................................................25
内嵌式汇编语言 ................................................................................26
条件运算符 ..........................................................................................9
逗号运算符 ..........................................................................................9

HOLTEK HT46RB50单片机 说明书

HOLTEK HT46RB50单片机 说明书

A/D 型八位USB 单片机盛群知识产权政策专利权盛群半导体公司在全球各地区已核准和申请中之专利权至少有160件以上,享有绝对之合法权益。

与盛群公司MCU 或其它产品有关的专利权并未被同意授权使用,任何经由不当手段侵害盛群公司专利权之公司、组织或个人,盛群将采取一切可能的法律行动,遏止侵权者不当的侵权行为,并追讨盛群公司因侵权行为所受之损失、或侵权者所得之不法利益。

商标商标权权盛群之名称和标识、Holtek 标识、HT-IDE 、HT-ICE 、Marvel Speech 、 Music Micro 、 Adlib Micro 、 Magic V oice 、 Green Dialer 、 PagerPro 、 Q-V oice 、 Turbo V oice 、 EasyV oice 和 HandyWriter 都是盛群半导体公司在台湾地区和其它国家的注册商标。

著作权Copyright © 2006 by HOLTEK SEMICONDUCTOR INC.规格书中所出现的信息在出版当时相信是正确的,然而盛群对于规格内容的使用不负责任。

文中提到的应用其目的仅仅是用来做说明,盛群不保证或不表示这些应用没有更深入的修改就能适用,也不推荐它的产品使用在会由于故障或其它原因可能会对人身造成危害的地方。

盛群产品不授权使用于救生、维生器件或系统中做为关键器件。

盛群拥有不事先通知而修改产品的权利,对于最新的信息,请参考我们的网址; 技术相关信息· 工具信息· FAQs· 应用范例特性• 工作电压:f SYS=6MHz:2.2V~5.5Vf SYS=12MHz:2.7V~5.5V• 最多可有38个双向输入/输出口• 1个与输入/输出口共用引脚的外部中断输入• 16位可编程定时/计数器,具有溢出中断• 8位可编程定时/计数器,具有溢出中断和7级预分频系数• 晶体振荡(6MHz或12MHz)• 看门狗定时器• 4096×15程序存储器ROM• 192×8数据存储器RAM• HALT和唤醒功能可降低功耗• 在V DD=5V,系统频率为12MHz时,指令周期为0.33µs• 6层硬件堆栈• 8通道10位解析度的A/D转换器• 2通道8位的PWM输出,与输入/输出口共用引脚• SIO(同步串行口)功能• 支持中断,控制和批量传输• 兼容USB1.1全速模式• 支持4个端点(包括端点0)• 88个字节FIFO(EP0到EP3分别为8、8、8和64)• 位操作指令• 查表指令,表格内容字长15位• 63条指令• 指令执行时间为1或2个指令周期• 低电压复位功能• 28-pin SOP/SKDIP,48-pin SSOP封装概述HT46RB50是8位高性能精简指令集单片机,专门为USB产品而设计。

Holtek HT32F12345 32位单片机产品规格书说明书

Holtek HT32F12345 32位单片机产品规格书说明书

HT32F12345产品规格书带Arm® Cortex®-M3内核以及1 MSPS ADC、USART、UART、SPI、I2C、I2S、MCTM、GPTM、BFTM、PDMA、CRC、RTC、WDT、EBI、SDIO和USB 2.0 FS高达64 KB Flash和16 KB SRAM的 Holtek 32-Bit单片机版本: V1.40 日期: 2020-08-03目录目录1 简介 (6)2 特性 (7)内核 (7)片上存储器 (7)Flash 存储器控制器 – FMC (7)复位控制单元 – RSTCU (7)时钟控制单元 – CKCU (8)电源管理 – PWRCU (8)外部中断/事件控制器 – EXTI (8)模数转换器 – ADC (8)模拟比较器 – CMP (9)I/O 端口 – GPIO (9)马达控制定时器 – MCTM (9)通用功能定时器 – GPTM (10)基本功能定时器 – BFTM (10)看门狗定时器 – WDT (10)实时时钟 – RTC .................................................................................................................................10内部集成电路 – I 2C . (11)串行外设接口 – SPI (11)通用同步异步收发器 – USART (11)通用异步收发器 – UART ..................................................................................................................12内置音频接口 – I 2S . (12)循环冗余校验 – CRC (12)外设直接访问内存 – PDMA (13)外部总线接口 – EBI (13)通用串行总线设备控制器 – USB (13)安全数字输入/输出 – SDIO (14)调试支持 (14)封装和工作温度 (14)3 概述 (15)单片机信息 (15)方框图 (16)存储器映射 (17)时钟结构 (20)4 引脚图 (21)目录5 电气特性 (28)极限参数 (28)建议直流工作条件 (28)片上LDO稳压器特性 (29)功耗 (29)复位和电源监控特性 (30)外部时钟特性 (31)内部时钟特性 (32)PLL特性 (32)USB PLL特性 (32)存储器特性 (33)I/O端口特性 (33)A/D转换器特性 (34)比较器特性 (35)GPTM/MCTM特性 (36)I2C特性 (36)SPI特性 (37)I2S特性 (39)SDIO特性 (41)USB特性 (42)6 封装信息 (44)SAW Type 46-pin QFN (6.5mm×4.5mm×0.75mm)外形尺寸 (45)48-pin LQFP (7mm×7mm) 外形尺寸 (46)64-pin LQFP (7mm×7mm) 外形尺寸 (47)表列表表列表表1. 特性及外设列表 (15)表2. 寄存器映射 (18)表3. 46-pin QFN ,48/64-pin LQFP 封装引脚图 (24)表4. 引脚描述 (26)表5. 极限参数 (28)表6. 建议直流工作条件 (28)表7. LDO 特性 (29)表8. 功耗特性 .........................................................................................................................................................29表9. V DD 电源复位特性 (30)表10. LVD/BOD 特性 (30)表11. 外部高速时钟 (HSE) 特性 (31)表12. 外部低速时钟 (LSE) 特性 (31)表13. 内部高速时钟 (HSI) 特性 (32)表14. 内部低速时钟 (LSI) 特性 (32)表15. PLL 特性 (32)表16. USB PLL 特性 (32)表17. Flash 存储器特性 (33)表18. I/O 端口特性 (33)表19. A/D 转换器特性 (34)表20. 比较器特性 (35)表21. GPTM/MCTM 特性......................................................................................................................................36表22. I 2C 特性 (36)表23. SPI 特性 ........................................................................................................................................................37表24. I 2S 特性 (39)表25. SDIO 特性 (41)表26. USB 直流电气特性 (42)表27. USB 交流电气特性 (43)图列表图列表图1. 方框图 (16)图2. 存储器映射 (17)图3. 时钟结构图 (20)图4. 46-pin QFN引脚图 (21)图5. 48-pin LQFP引脚图 (22)图6. 64-pin LQFP引脚图 (23)图7. A/D转换器采样网络模板 (35)图8. I2C时序图 (37)图9. SPI时序图 – SPI主机模式 (38)图10. SPI时序图 – SPI从机模式,CPHA = 1 (39)图11. I2S主机模式时序图 (40)图12. I2S从机模式时序图 (40)图13. SDIO默认模式 (41)图14. SDIO高速模式 (42)图15. USB信号上升时间、下降时间和交叉点电压(V CRS)定义 (43)1 简介1 简介HT32F12345的Holtek 单片机是一款基于Arm ®Cortex ®-M3处理器内核的32-bit 高性能低功耗单片机。

合泰单片机数码管显示控制程序

合泰单片机数码管显示控制程序

合泰单片机数码管显示控制程序;4 位共阴数码管显示0123;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7;数码管位码接法4-PC3;目的:;1.查表;2.间接寻址includeHT66F50.incORG0000HJMPA1ORG0020HQ1:DC03FH; 0DC006H; 1DC05BH; 2DC04FH; 3DC066H; 4DC06DH; 5DC07DH; 6DC007H; 7DC07FH; 8DC06FH; 9DC077H; ADC07CH; BDC039H; CDC05EH; DDC079H; EDC071H; FA1:MOVA,0;显示内容MOV[8AH],A;第一位数码管段码显示内容寄存器MOVA,1;显示内容MOV[8BH],A;第二位数码管段码显示内容寄存器MOVA,2;显示内容MOV[8CH],A;第三位数码管段码显示内容寄存器MOVA,3;显示内容MOV[8DH],A;第四位数码管显示内容寄存器MOVA,08H;跟CP1C 寄存器设置要求选择数据MOVCP1C,A;设置PC 口为I/0 口而不是中断口CLRPCC;设置pc口为输出口CLRPDC;设置PD 口为输出口MOVA,1;设置初始显示位码显示第一位MOV[80H],A;位码寄存器MOVA,8AH;设置对应第一位段码寄存器MOVMP0,A;间接寄存器指针A2:CLRPC;清PC(清屏幕)MOVA,Q1;数据表地址CLR TBHP ;清数据表地址高位否则出错ADDA,IAR0;利用间接寄存器找到要显示段码所在数据表的地址MOVTBLP,A;表格指针寄存器TBLPTABRDPD;查表并将数据存到PD 口寄存器MOVA,[80H];位码寄存器MOVPC,A;将位码寄存器的数存到PC 口寄存器;段码和位码的数都有了所以数码管被点亮INCMP0;间接寄存器指针加1 指向下一个段码寄存器RL[80H];左移位码寄存器控制下一个数码管SNZ[80H].5;判断是否控制完4 个数码管JMPA2;否返回继续MOVA,1;是则从新初始化寄存器数据MOV[80H],A;MOVA,8AH;MOVMP0,A;JMPA1;END 这里还有一个holtek 单片机的数码管程序供大家参考:51hei/mcu/1349.html,电路图与程序都一应俱全.tips:感谢大。

合泰指令教学

合泰指令教学

逻辑运算




AND OR XOR ANDM 器 ORM 器 XORM 储器 AND OR XOR CPL CPLA
A,[m] A,[m] A,[m] A,[m] A,[m]
;ACC与数据存储器做“与”运算,结果放入ACC ;ACC与数据存储器做“或”运算,结果放入ACC ;ACC与数据存储器做“异或”运算,结果放入ACC ;ACC与数据存储器做“与”运算,结果放入数据存储 ;ACC与数据存储器做“或”运算,结果放入数据存储

单片机的特点

小巧灵活、成本低、易于产品化。它能方便地组装成各种 智能式控制设备以及各种智能仪表。面向控制,能针对性 地解决从简单到复杂的各类控制任务,从而获得最佳性价 比。抗干扰能力强,适应温度范围宽,在各种恶劣条件下 都能可靠地工作,这是其它机型所无法比拟的。可以很方 便地实现多机和分布式控制,使整个系统的效率和可靠性 大为提高。
数据传送

MOV MOV MOV
A,[m] [m],A A, x
;将数据存储器送至ACC ;将ACC送至数据存储器 ;将立即数送至ACC
位运算

CLR SET
[m].i [m].i
;清除数据存储器的位 ;置位数据存储器的位
转移






JMP SZ SZA SZ SNZ SIZ SDZ SIZA 下一条指令 SDZA 下一条指令 CALL RET RET RETI
单片机指令概述
合泰单片机指令运用
了解指令,让编程序变得更容 易.
什么是单片机

单片机就是一块单片的计算机看起来就是一个黑块,他把计算机正常工 作所需要用的设备接口等全部集成在一个芯片上,并可以完成一些简 单的工作,这里举一个简单的例子让你了解单片机是什么是干什么功 能的,比如说你现在把一个led小灯,接在了单片机的P1.0引脚上,我 们要灯亮就给单片机一个 setb P1.0 的指令,我们要灯熄灭就给 clr p1.0 灯就熄了。 说到这里我们要问到底什么是单片机呢?他就是一个电脑,只不 过是微型的,麻雀虽小,五脏俱全:它内部也用和电脑功能类似的模 块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不 同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱就 相对便宜多了.

合泰单片机控制5线4相步进电机控制程序

合泰单片机控制5线4相步进电机控制程序

合泰单片机控制5线4相步进电机控制程序;步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!!; 28BYJ48 步进电机步进角为 5.625 度; A 组线圈对应PC.0; B 组线圈对应PC.1; C 组线圈对应PC.2; D 组线圈对应PC.3; 正转次序: AB 组--BC 组--CD 组--DA 组(即一个脉冲,正转5.625 度); 完整的源程序下载:51hei/f/htbjdj.rarinclude HT66F50.incORG0000HJMPA1ORG0014H ;多功能中断入口地址JMPZD1ORG002DHQ1:DC03H; 0ABDC06H; 1BCDC0CH; 2CDDC09H; 3DAA1: MOVA,08H;跟CP1C 寄存器设置要求选择数据MOVCP1C,A;设置PC 口为I/0 口而不是中断口CLRPCC;设置pc 口为输出口MOVA,0;设置初始脉冲MOV[80H],A;MOVA,00000000B;设置TM2 计数时钟位为fSYS/4MOVTM2C0,AMOVA,11000001B ;设置TM2 中断为定时/计数模式选择比较器A 匹配MOVTM2C1,AMOVA,LOW 5000;设置中断时间为5000 个时钟周期MOVTM2AL,A;低8 位MOVA,HIGH 5000;设置中断时间为5000 个时钟周期MOVTM2AH,A;高8 位不能少于3500 个时钟周期否则无法启动CLRMF0F;清多功能中断0 标志CLRT2AF;清定时器2 较器A 中断标志SETMF0E;使能多功能0 中断SETT2AE;使能定时器2 较器A 中断SETEMI;使能总中断SETT2ON;开始计数JMP$;;*******************************************************;中断服务子程序;*******************************************************ZD1:MOV[0F0H],A;压栈ACC 到0F0HMOVA,STATUS;MOV[0F1H],A;压栈status 标志寄存器。

单片机指令大全

单片机指令大全

引言概述:单片机指令是嵌入式系统设计中至关重要的一部分,它们定义了单片机的功能和操作。

本文是单片机指令大全系列的第二部分,旨在提供更多全面的单片机指令信息,帮助读者更好地理解和应用单片机指令。

正文内容:一、移位指令1.逻辑左移指令:将操作数的每一位向左移动一位,并且最低位填充0。

2.逻辑右移指令:将操作数的每一位向右移动一位,并且最高位填充0。

3.算术右移指令:将操作数的每一位向右移动一位,并且最高位保持不变。

4.循环左移指令:将操作数的每一位向左循环移动一位,即最高位移动到最低位。

5.循环右移指令:将操作数的每一位向右循环移动一位,即最低位移动到最高位。

二、逻辑运算指令1.逻辑与指令:对操作数进行逻辑与运算,将两个二进制数对应位上的值进行逻辑与操作。

2.逻辑或指令:对操作数进行逻辑或运算,将两个二进制数对应位上的值进行逻辑或操作。

3.逻辑非指令:对操作数进行逻辑非运算,将二进制数的每一位取反。

4.逻辑异或指令:对操作数进行逻辑异或运算,将两个二进制数对应位上的值进行逻辑异或操作。

5.逻辑移位指令:将操作数进行逻辑左移或右移。

三、算术运算指令1.加法指令:对操作数进行加法运算,并将运算结果保存到指定的寄存器或存储器中。

2.减法指令:对操作数进行减法运算,并将运算结果保存到指定的寄存器或存储器中。

3.乘法指令:对操作数进行乘法运算,并将运算结果保存到指定的寄存器或存储器中。

4.除法指令:对操作数进行除法运算,并将运算结果保存到指定的寄存器或存储器中。

5.移位指令:对操作数进行移位运算,包括算术左移、算术右移、循环左移和循环右移。

四、输入输出指令1.读取输入指令:从指定的输入设备读取数据,并将数据保存到指定的寄存器或存储器中。

2.输出显示指令:将指定的数据从寄存器或存储器中读取,并显示到指定的输出设备上。

3.端口输入指令:从指定的端口读取数据,并将数据保存到指定的寄存器或存储器中。

4.端口输出指令:将指定的数据从寄存器或存储器中读取,并输出到指定的端口上。

HOLTEK-3(指令集)

HOLTEK-3(指令集)
Date: October 18, 2012
Neusoft Institute of Information
盛群指令集简介
指令分类:
1. 2. 3. 4. 5. 6. 7. 8. 数据传送类 算术运算类 逻辑运算类 数据移位类 位运算类 转移类 查表类 其它类
IT Education & Training
IT Education & Training
1*
1 1*
C
Z Z
Date: October 18, 2012
Neusoft Institute of Information
逻辑运算类指令
助记符 AND A, [m] OR A, [m] XOR A, [m] ANDM A, [m] ORM A, [m] 指令简易描述 ACC 与数据存储器做“与”运算,结果放入ACC ACC 与数据存储器做“或”运算,结果放入ACC ACC 与数据存储器做“异或”运算,结果放入ACC ACC 与数据存储器做“与”运算,结果放入数据存储器 ACC 与数据存储器做“或”运算,结果放入数据存储器 ACC 与数据存储器做“异或”运算,结果放入数据存储 器 ACC 与立即数做“与”运算,结果放入ACC ACC 与立即数做“或”运算,结果放入ACC ACC 与立即数做“异或”运算,结果放入ACC 周期 1 1 1 1* 1* 影响标 志位 Z Z Z Z Z
位运算类指令
助记符 指令简易描述
影响标 周期 志位 1* 无
CLR [m].i
清除数据存储器的位
SET [m].i
设置数据存储器的位
1*

IT Education & Training
Date: October 18, 2012

HT指令集说明

HT指令集说明

HOLTEK指令集说明指令集说明注由于资源大小问题其中以下几款MCU只有62条指令其余均为63条指令HT48CA0/HT48RA0A 无RETI指令HT48R05A-1 无TABRDL指令指令寻址方式有下面5种立即寻址此一寻址法是将立即的常数值紧跟在运算码 (opcode) 后例如MOV A,33H33HADD A,直接寻址直接寻址的情況只允许在存储器之间作数据传送例如AMOV [33H],CLR [33H]间接寻址在间接寻址方式中必定要使用到间接寻址暂存器(R0R1)例如AMOV R0,MOV A,R0特殊暂存器寻址此一寻址方式完全是针对某一暂存器作运算例如CLR WDTCLR WDT1指针寻址指针寻址只适用在配合做查表指令例如02HMOV A,AMOV TBLP,指令集摘要助记符 说明指令周期影响标志位算术运算 ADD A, [m] 累加器与数据存储器相加结果放入累加器 1 Z,C,AC,OVADDM A, [m] 累加器与数据存储器相加结果放入数据存储器 11Z,C,AC,OVADD A, x 累加器与立即数相加结果放入累加器1 Z,C,AC,OV ADC A, [m] 累加器与数据存储器进位标志相加结果放入累加器 1 Z,C,AC,OVADCM A, [m] 累加器与数据存储器进位标志相加结果放入数据存储器 11Z,C,AC,OVSUB A, x 累加器与立即数相减结果放入累加器1 Z,C,AC,OV SUB A, [m] 累加器与数据存储器相减结果放入累加器 1 Z,C,AC,OVSUBM A, [m] 累加器与数据存储器相减结果放入数据存储器11Z,C,AC,OVSBC A, [m] 累加器与数据存储器进位标志相减结果放入累加器 1 Z,C,AC,OVSBCM A, [m] 累加器与数据存储器进位标志相减结果放入数据存储器 11 Z,C,AC,OVDAA[m]将加法运算后放入累加器的值调整为十进制数并将结果放入数据存储器11C逻辑运算AND A, [m] 累加器与数据存储器做与运算结果放入累加器 1 Z OR A, [m] 累加器与数据存储器做或运算结果放入累加器 1 Z XOR A, [m] 累加器与数据存储器做异或运算结果放入累加器 1 ZANDM A, [m] 累加器与数据存储器做与运算结果放入数据存储器 11ZORM A, [m] 累加器与数据存储器做或运算结果放入数据存储器 11ZXORM A, [m] 累加器与数据存储器做异或运算结果放入数据存储器 11ZAND A, x 累加器与立即数做与运算结果放入累加器 1 Z OR A, x 累加器与立即数做或运算结果放入累加器 1 Z XOR A, x 累加器与立即数做异或运算结果放入累加器 1 ZCPL [m] 对数据存储器取反结果放入数据存储器 11ZCPLA [m] 对数据存储器取反结果放入累加器 1 Z 递增和递减 INCA [m] 数据存储器的内容加1结果放入累加器 1 ZINC [m] 数据存储器的内容加1结果放入数据存储器 11ZDECA [m] 数据存储器的内容减1结果放入累加器 1 ZDEC [m] 数据存储器的内容减1结果放入数据存储器11Z移位 RRA [m] 数据存储器右移一位结果放入累加器1无RR [m] 数据存储器右移一位结果放入数据存储器 11无RRCA [m] 带进位将数据存储器右移一位结果放入累加器 1 CRRC [m] 带进位将数据存储器右移一位结果放入数据存储器 11CRLA [m] 数据存储器左移一位结果放入累加器1 无RL [m] 数据存储器左移一位结果放入数据存储器 11 无RLCA [m] 带进位将数据存储器左移一位结果放入累加器 1 CRLC [m] 带进位将数据存储器左移一位结果放入数据存储器 11C数据传送MOV A, [m] 将数据存储器送至累加器 1 无MOV [m], A 将累加器送至数据存储器 11无MOV A, x 将立即数送至累加器 1 无 位运算CLR [m]. i 将数据存储器的第i 位清0 11 无SET [m]. i 将数据存储器的第i 位置111无助记符 说明指令周期 影响标志位转移 JMP addr 无条件跳转2 无SZ [m] 如果数据存储器为0则跳过下一条指令 12 无SZA [m] 数据存储器送至累加器如果内容为0则跳过下一条指令12 无SZ [m]. i 如果数据存储器的第i 位为0则跳过下一条指令 12 无SNZ [m]. i 如果数据存储器的第i 位不为0则跳过下一条指令 12 无SIZ [m] 数据存储器加1如果结果为0则跳过下一条指令13 无SDZ [m] 数据存储器减1如果结果为0则跳过下一条指令 13 无SIZA [m] 数据存储器加1将结果放入累加器如果结果为0则跳过下一条指令12无SDZA[m]数据存储器减1将结果放入累加器如果结果为0则跳过下一条指令 12无 CALL addr 子程序调用 2 无 RET 从子程序返回2 无 RET A, x 从子程序返回并将立即数放入累加器 2 无 RETI 从中断返回2无查表TABRDC [m] 读取当前页的ROM 内容并送至数据存储器和TBLH 21 无TABRDL [m] 读取最后页的ROM 内容并送至数据存储器和TBLH 21无其它指令 NOP 空指令1无CLR [m] 清除数据存储器 11无SET [m] 置位数据存储器 11 无CLR WDT 清除看门狗定时器 1 TO,PDCLR WDT1 预清除看门狗定时器 1 TO 4,PD 4CLR WDT2 预清除看门狗定时器1 TO 4,PD 4SWAP [m] 交换数据存储器的高低字节结果放入数据存储器 11 无SWAPA [m] 交换数据存储器的高低字节结果放入累加器 1 无HALT进入暂停模式 1 TO,PD注x立即数m 数据存储器地址 A 累加器ACC i第0~7位addr程序存储器地址 影响标志位不影响标志位1如果数据是加载到PCL 寄存器则指令执行周期会被延长一个指令周期四个系统时钟2如果满足跳跃条件则指令执行周期会被延长一个指令周期四个系统时钟否则指令执行周期不会被延长31和24如果执行CLW WDT1或CLR WDT2指令后看门狗定时器被清除则会影响TO 和PD 标志位否则不会影响TO 和PD 标志位[m] 累加器与数据存储器进位标志相加结果放入累加器ADC A,说明本指令把累加器数据存储器值以及进位标志相加结果存放到累加器运算过程ACC ACC+[m]+C影响标志位TC2 TC1 TO PD OV Z AC CADCM A, [m] 累加器与数据存储器进位标志相加结果放入数据存储器说明本指令把累加器数据存储器值以及进位标志相加结果存放到存储器运算过程[m] ACC+[m]+C影响标志位TC2 TC1 TO PD OV Z AC C[m] 累加器与数据存储器相加结果放入累加器ADD A,说明本指令把累加器数据存储器值相加结果存放到累加器运算过程ACC ACC+[m]影响标志位TC2 TC1 TO PD OV Z AC Cx 累加器与立即数相加结果放入累加器ADD A,说明本指令把累加器值和立即数相加结果存放到累加器运算过程ACC ACC+X影响标志位TC2 TC1 TO PD OV Z AC CADDM A, [m] 累加器与数据存储器相加结果放入数据存储器说明本指令把累加器数据存储器值相加结果放到数据存储器运算过程[m] ACC+[m]影响标志位TC2 TC1 TO PD OV Z AC C[m] 累加器与数据存储器做与运算结果放入累加器AND A,说明本指令把累加器值数据存储器值做逻辑与结果存放到累加器运算过程ACC ACC “AND” [m]影响标志位TC2 TC1 TO PD OV Z AC Cx 累加器与立即数做与运算结果放入累加器AND A,说明本指令把累加器值立即数做逻辑与结果存放到累加器运算过程ACC ACC “AND” X影响标志位TC2 TC1 TO PD OV Z AC CANDM A, [m] 累加器与数据存储器做与运算结果放入数据存储器说明本指令把累加器值数据存储器值做逻辑与结果放到数据存储器运算过程ACC ACC “AND” [m]影响标志位TC2 TC1 TO PD OV Z AC CCALL addr 子程序调用说明本指令直接调用地址所在处的子程序此时程序计数器加一将此程序计数器值存到堆栈寄存器中再将子程序所在处的地址存放到程序计数器中运算过程Stack PC+1PC addr影响标志位TC2 TC1 TO PD OV Z AC C[m] 清除数据存储器CLR说明本指令将数据存储器内的数值清零运算过程[m] 00H影响标志位TC2 TC1 TO PD OV Z AC CCLR [m] . i 将数据存储器的第i位清0说明本指令将数据存储器内第i位值清零运算过程[m].i 0影响标志位TC2 TC1 TO PD OV Z AC CCLR WDT 清除看门狗定时器说明本指令清除WDT计数器从0开始重新计数暂停标志位PD和看门狗溢出标志位TO也被清零运算过程WDT 00HPD&TO 0影响标志位TC2 TC1 TO PD OV Z AC C0 0CLR WDT1 预清除看门狗定时器说明必须搭配CLR WDT2一起使用才可清除WDT计时器从0开始重新计数当程序只执行过该指令没有执行CLR WDT2时系统只会不会将暂停标志位PD和计数溢出位TO清零PD与TO保留原状态不变运算过程WDT 00H*PD&TO 0*影响标志位TC2 TC1 TO PD OV Z AC C0* 0*CLR WDT2 预清除看门狗定时器说明必须搭配CLR WDT1一起使用才可清除WDT计时器从0开始重新计数当程序只执行过该指令没有执行CLR WDT1时系统只会不会将暂停标志位PD和计数溢出位TO清零PD与TO保留原状态不变运算过程WDT 00H*PD&TO 0*影响标志位TC2 TC1 TO PD OV Z AC C0* 0*CPL [m] 对数据存储器取反结果放入数据存储器说明本指令是将数据存储器内保存的数值取反运算过程[m] [m]影响标志位TC2 TC1 TO PD OV Z AC CCPLA [m] 对数据存储器取反结果放入累加器说明本指令是将数据存储器内保存的值取反后结果存放在累加器中运算过程ACC [m]影响标志位TC2 TC1 TO PD OV Z AC C[m] 将加法运算后放入累加器的值调整为十进制数并将结果放入数据存储器DAA说明本指令将累加器高低四位分别调整为BCD码如果低四位的值大于9或AC=1那么BCD调整就执行对原值加6并且内部进位标志AC1=AC即AC求反否则原值保持不变如果高四位的值大于9或C=1那么BCD调整就执行对原值加6再加AC1并把C置位否则BCD调整就执行对原值加AC1C的值保持不变结果存放到数据存储器中只有进位标志位C受影响操作如果ACC.3~ACC.0 > 9 或AC=1那么 [m].3~[m].0 ACC.3~ACC.0 +6AC1=AC否则 [m].3~[m].0 ACC.3~ACC.0 AC1=0并且如果ACC.7~ACC.4+AC1 > 9 或C=1那么 [m].7~[m].4 ACC.7~ACC.4 +6+ AC1C=1否则 [m].7~[m].4 ACC.7~ACC.4 + AC1C=C影响标志位TC2 TC1 TO PD OV Z AC C[m] 数据存储器的内容减1结果放入数据存储器DEC说明本指令将数据存储器内的数值减一再放回数据存储器运算过程[m] [m]-1影响标志位TC2 TC1 TO PD OV Z AC CDECA [m]数据存储器的内容减1结果放入累加器说明本指令将存储器内的数值减一,再放到累加器运算过程ACC [m]-1影响标志位TC2 TC1 TO PD OV Z AC CHALT 进入暂停模式说明本指令终止程序执行并关掉系统时钟RAM和寄存器内的数值保持原状态WDT计数器清0暂停标志位PD被设为1 WDT计数溢出位TO被清为0运算过程PC PC+1PD 1TO 0影响标志位TC2 TC1 TO PD OV Z AC C0 1INC [m]数据存储器的内容加1结果放入数据存储器说明本指令将数据存储器内的数值加一,结果放回数据存储器运算过程[m] [m]+1影响标志位TC2 TC1 TO PD OV Z AC CINCA [m] 数据存储器的内容加1结果放入数据存储器说明本指令是将存储器内的数值加一,结果放到累加器运算过程ACC [m]+1影响标志位TC2 TC1 TO PD OV Z AC CJMP addr 无条件跳转说明本指令是将要跳到的目的地直接放到程序计数器内运算过程PC addr影响标志位TC2 TC1 TO PD OV Z AC C [m] 将数据存储器送至累加器MOV A,说明本指令是将数据存储器内的数值送到累加器内运算过程ACC [m]影响标志位TC2 TC1 TO PD OV Z AC C MOV A,x 将立即数送至累加器说明本指令是将立即数送到累加器内运算过程ACC X影响标志位TC2 TC1 TO PD OV Z AC CA 将累加器送至数据存储器MOV [m],说明本指令是将累加器值送到数据存储器内运算过程[m] ACC影响标志位TC2 TC1 TO PD OV Z AC CNOP 空指令说明本指令不作任何运算而只将程序计数器加一运算过程PC PC+1影响标志位TC2 TC1 TO PD OV Z AC COR A, [m] 累加器与数据存储器做或运算结果放入累加器说明本指令是把累加器数据存储器值做逻辑或结果放到累加器运算过程ACC ACC “OR” [m]影响标志位TC2 TC1 TO PD OV Z AC COR A, x 累加器与立即数做或运算结果放入累加器说明本指令是把累加器值立即数做逻辑或结果放到累加器运算过程ACC ACC “OR” X影响标志位TC2 TC1 TO PD OV Z AC C[m] 累加器与数据存储器做或运算结果放入数据存储器ORM A,说明本指令是把累加器值存储器值做逻辑或结果放到数据存储器运算过程ACC ACC “OR” [m]影响标志位TC2 TC1 TO PD OV Z AC CRET 从子程序返回说明本指令是将堆栈寄存器中的程序计数器值送回程序计数器运算过程PC Stack影响标志位TC2 TC1 TO PD OV Z AC Cx 从子程序返回并将立即数放入累加器RET A,说明本指令是将堆栈寄存器中的程序计数器值送回程序计数器并将立即数送回累加器运算过程PC StackACC X影响标志位TC2 TC1 TO PD OV Z AC CRETI 从中断返回说明本指令是将堆栈寄存器中的程序计数器值送回程序计数器与RET不同的是它使用在中断程序结束返回时它还会将中断控制寄存器INTC的0位EMI中断允许位置1允许中断服务运算过程PC StackEMI 1影响标志位TC2 TC1 TO PD OV Z AC CRL [m] 数据存储器左移一位结果放入数据存储器说明本指令是将数据存储器内的数值左移一位第7位移到第0位结果送回数据存储器运算过程[m].0 [m].7, [m].i+1 [m].i :i=0~6影响标志位TC2 TC1 TO PD OV Z AC C[m] 数据存储器左移一位结果放入累加器RLA说明本指令是将存储器内的数值左移一位第7位移到第0位结果送到累加器而数据存储器内的数值不变运算过程ACC.0 [m].7, ACC.i+1 [m].i :i=0~6影响标志位TC2 TC1 TO PD OV Z AC C[m] 带进位将数据存储器左移一位结果放入数据存储器RLC说明本指令是将存储器内的数值与进位位左移一位第7位取代进位标志进位标志移到第0位结果送回数据存储器运算过程[m].i+1 [m].i :i=0~6[m].0 CC [m].7影响标志位TC2 TC1 TO PD OV Z AC CRLCA [m] 带进位将数据存储器左移一位结果放入累加器说明本指令是将存储器内的数值与进位位左移一位第七位取代进位标志进位标志移到第0位结果送回累加器运算过程ACC.i+1 [m].i :i=0~6ACC.0 CC [m].7影响标志位TC2 TC1 TO PD OV Z AC CRR [m] 数据存储器右移一位结果放入数据存储器说明本指令是将存储器内的数值循环右移第0位移到第7位结果送回数据存储器运算过程[m].7 [m].0, [m].i [m].i+1 : i=0~6影响标志位TC2 TC1 TO PD OV Z AC C[m] 数据存储器右移一位结果放入累加器RRA说明本指令是将数据存储器内的数值循环右移第0位移到第7位结果送回累加器而数据存储器内的数值不变运算过程ACC.7 [m].0, ACC.i [m].i+1 :i=0~6影响标志位TC2 TC1 TO PD OV Z AC C[m] 带进位将数据存储器右移一位结果放入数据存储器RRC说明本指令是将存储器内的数值加进位位循环右移第0位取代进位标志进位标志移到第7位结果送回存储器运算过程[m].i [m].i+1 :i=0~6[m]. 7 CC [m].0影响标志位TC2 TC1 TO PD OV Z AC CRRCA [m] 带进位将数据存储器右移一位结果放入累加器说明本指令是将数据存储器内的数值加进位位循环右移第0位取代进位标志进位标志移到第7位结果送回累加器数据存储器内的数值不变运算过程ACC.i [m].i+1i=0~6ACC.7 CC [m].0影响标志位TC2 TC1 TO PD OV Z AC CSBC A,[m] 累加器与数据存储器进位标志相减结果放入累加器说明本指令是把累加器值减去数据存储器值以及进位标志的取反结果放到累加器运算过程ACC ACC+[m]+ C影响标志位TC2 TC1 TO PD OV Z AC CSBCM A,[m] 累加器与数据存储器进位标志相减结果放入数据存储器说明本指令是把累加器值减去数据存储器值以及进位标志取反结果放到数据存储器运算过程[m] ACC+[m]+C影响标志位TC2 TC1 TO PD OV Z AC CSDZ [m] 数据存储器减1如果结果为0则跳过下一条指令说明本指令是把数据存储器内的数值减1判断是否为0若为0则跳过下一条指令即如果结果为零放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m]-1=0跳过下一条指令执行再下一条影响标志位TC2 TC1 TO PD OV Z AC CSDZA [m] 数据存储器减1将结果放入累加器如果结果为0则跳过下一条指令说明本指令是把数据存储器内的数值减1判断是否为0, 为0则跳过下一行指令并将减完后数据存储器内的数值送到累加器,而数据存储器内的值不变即若结果为0放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m]-1=0跳过下一条指令执行再下一条ACC [m]-1影响标志位TC2 TC1 TO PD OV Z AC CSET [m] 置位数据存储器说明本指令是把存储器内的数值每个位置为1运算过程[m] FFH影响标志位TC2 TC1 TO PD OV Z AC CSET [m]. i 将数据存储器的第i位置1说明本指令是把存储器内的数值的第i位置为1运算过程[m].i 1影响标志位TC2 TC1 TO PD OV Z AC CSIZ [m] 数据存储器加1如果结果为0则跳过下一条指令说明本指令是把数据存储器内的数值加1判断是否为0若为0跳过下一条指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m]+1=0跳过下一行指令[m] [m]+1影响标志位TC2 TC1 TO PD OV Z AC CSIZA 数据存储器加1将结果放入累加器如果结果为0则跳过下一条指令说明本指令是把数据存储器内的数值加1判断是否为0, 若为0跳过下一条指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期并将加完后存储器内的数值送到累加器而数据存储器的值保持不变否则执行下一条指令一个指令周期运算过程如果[m]+1=0跳过下一行指令ACC [m]+1影响标志位TC2 TC1 TO PD OV Z AC CSNZ [m]. i 如果数据存储器的第i位不为0则跳过下一条指令说明本指令是判断数据存储器内的数值的第i位, 若不为0则程序计数器再加1, 跳过下一行指令放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以取得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m].i≠0跳过下一行指令影响标志位TC2 TC1 TO PD OV Z AC CSUB A, [m] 累加器与数据存储器相减结果放入累加器说明本指令是把累加器值数据存储器值相减结果放到累加器运算过程ACC ACC+[m]+1影响标志位TC2 TC1 TO PD OV Z AC CSUB A, x 累加器与立即数相减结果放入累加器说明本指令是把累加器值立即数相减结果放到累加器运算过程ACC ACC+X+1影响标志位TC2 TC1 TO PD OV Z AC CSUBM A, [m] 累加器与数据存储器相减结果放入数据存储器说明本指令是把累加器值存储器值相减结果放到存储器运算过程[m] ACC+[m]+1影响标志位TC2 TC1 TO PD OV Z AC CSWAP [m] 交换数据存储器的高低字节结果放入数据存储器说明本指令是将数据存储器的低四位和高四位互换,再将结果送回数据存储器运算过程[m].7~[m].4<-V1↔[m].3~[m].0影响标志位TC2 TC1 TO PD OV Z AC CSWAPA [m] 交换数据存储器的高低字节结果放入累加器说明本指令是将数据存储器的低四位和高四位互换再将结果送回累加器运算过程ACC.3~ACC.0 [m].7~[m].4ACC.7~ACC.4 [m].3~[m].0影响标志位TC2 TC1 TO PD OV Z AC CSZ [m] 如果数据存储器为0则跳过下一条指令说明本指令是判断数据存储器内的数值是否为0为0则跳过下一行指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m] = 0, 跳过下一行指令影响标志位TC2 TC1 TO PD OV Z AC CSZA [m] 数据存储器送至累加器如果内容为0则跳过下一条指令说明本指令是判断存储器内的数值是否为0若为0则跳过下一行指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以得正确的指令二个指令周期并把存储器内值送到累加器而存储器的值保持不变否则执行下一条指令一个指令周期运算过程如果[m] = 0跳过下一行指令并ACC [m]影响标志位TC2 TC1 TO PD OV Z AC CSZ [m]. i 如果数据存储器的第i位为0则跳过下一条指令说明本指令是判断存储器内第i位值是否为0若为0则跳过下一行指令即放弃在目前指令执行期间所取得的下一条指令并插入一个空周期用以得正确的指令二个指令周期否则执行下一条指令一个指令周期运算过程如果[m].i = 0跳过下一行指令影响标志位TC2 TC1 TO PD OV Z AC CTABRDC [m] 读取ROM当前页的内容并送至数据存储器和TBLH说明本指令是将表格指针指向程序寄存器当前页将低位送到存储器高位直接送到TBLH寄存器内运算过程[m] 程序存储器低四位TBLH 程序存储器高四位影响标志位TC2 TC1 TO PD OV Z AC CTABRDL [m] 读取ROM最后一页的内容并送至数据存储器和TBLH说明本指令是将TABLE指针指向程序寄存器最后页将低位送到存储器高位直接送到TBLH寄存器内运算过程[m] 程序存储器低四位TBLH 程序存储器高四位影响标志位TC2 TC1 TO PD OV Z AC C[m] 累加器与立即数做异或运算结果放入累加器XOR A,说明本指令是把累加器值数据存储器值做逻辑异或结果放到累加器运算过程ACC ACC “XOR” [m]影响标志位TC2 TC1 TO PD OV Z AC CXORM A, [m] 累加器与数据存储器做异或运算结果放入数据存储器说明本指令是把累加器值数据存储器值做逻辑异或结果放到数据存储器运算过程[m] ACC “XOR” [m]影响标志位TC2 TC1 TO PD OV Z AC Cx 累加器与数据存储器做异或运算结果放入累加器XOR A,说明本指令是把累加器值与立即数做逻辑异或结果放到累加器运算过程ACC ACC “XOR” X影响标志位TC2 TC1 TO PD OV Z AC C。

Holtek单片机指令系统

Holtek单片机指令系统
注释, 注释,以CR/LF结束 结束
伪指令
Name .SECTION [align] [combine] ‘class’ Name:定义 定义SECTION的名称 的名称 定义 Align:指定此 指定此SECTION存放在 存放在ROM存储器的具体位置,有以下 存储器的具体位置, 指定此 存放在 存储器的具体位置 存放方式: 存放方式: BYTE:将此 将此SECTION放在 放在ROM存储器的任何 字节地址。 将此 放在 存储器的任何 字节地址。 WORD:将此 将此SECTION放在 放在ROM存储器的偶地址。 存储器的偶地址。 将此 放在 存储器的偶地址 PARA:将此 将此SECTION放在 放在ROM存储器的段落地址(16的整数 存储器的段落地址( 的整数 将此 放在 存储器的段落地址 倍地址)。 倍地址)。 PAGE:将此 将此SECTION放在 放在ROM存储器的页地址(256的整数 存储器的页地址( 将此 放在 存储器的页地址 的整数 倍地址)。 倍地址)。 缺省: 缺省:BYTE
伪指令
Combine:定义此 定义此SECTION如何与 如何与name和align相同的 相同的SECTION结合,有下 结合, 定义此 如何与 和 相同的 结合 面几种方式: 面几种方式: COMMON:指定此 指定此SECTION可以与相同名称的 可以与相同名称的SECTION重叠。 重叠。 指定此 可以与相同名称的 重叠 AT address:指定此 指定此SECTION必须放在 必须放在address的地址。 的地址。 指定此 必须放在 的地址 DA1 .section AT 40H 如果没有设定combine的类型,则相同名称的SECTION可以连接成一 如果没有设定 的类型,则相同名称的 可以连接成一 的类型 个单一的程序段,这些具有完全相同名称的程序段可以分别定义在不同的 个单一的程序段, 源程序文件中。 源程序文件中。 Class:用于指定此 用于指定此SECTION的类别,类别有 的类别, 用于指定此 的类别 类别有CODE和DATA 和 CODE:表示此 表示此SECTION为程序段,是放在 为程序段, 表示此 为程序段 是放在ROM中 中 DATA:表示此 表示此SECTION为数据段,是放在 为数据段, 表示此 为数据段 是放在RAM中 中 相同类别的程序段被安排在存储器中的连续区域, 相同类别的程序段被安排在存储器中的连续区域,以其输入的先后顺序安 排在存储器中,在此伪指令之后,直到下一个SECTION伪指令之前的所 排在存储器中,在此伪指令之后,直到下一个 伪指令之前的所 有指令及数据,都属于同一个SECTION. 有指令及数据,都属于同一个

Holtek(合泰)单片机指令介绍

Holtek(合泰)单片机指令介绍

DEC [m]
指令说明:
RAM ALU Shifter
[m]-1
影响标志:Z
DECA [m]
指令说明:
RAM ALU Shifter
[m]-1
ACC
影响标志:Z
〈例〉
RAM STATUS

INC [90H]
55H 1EH 00H
ACC
INCA [90H]

DEC [91H]
FEH FFH
指令周期
一个指令周期包括四个系统时钟周期。 指令的提取和执行呈流水线工作。
指令周期
由于采用了流水线的工作方式,因此多数 指令都能在1个指令周期内执行完成。 查表指令是2周期指令。(若查表所得内容
的低8位送往PCL,则该指令的执行就需要3个指 令周期。)
凡是使程序非顺序执行的指令,其执行时 间需要2个指令周期。(包括:JMP、CALL等,
MCU概述 指令系统概述 HOLTEK指令系统
HOLTEK指令系统
数据传送指令(3条) 算术运算指令(15条) 逻辑运算指令(19条) 控制和转移指令(11条) 位运算指令(4条) 读表指令(2条) 其它指令(9条)
数据传送指令
数据传送指令是应用最频繁的指令 助记符为MOV,其汇编语言指令格式为 MOV [目的字节],[源字节] 指令功能是将源字节的内容传送到目的 字节,源字节的内容不变。 这类指令不影响标志位。


带借位的减法指令
SBC A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+C
STATUS
ACC
影响标志:OV,Z,AC,C
SBCM A,[m]

合泰单片机C语言教程讲解

合泰单片机C语言教程讲解

Holtek 微控制器應用範例–使用Holtek C 語言目錄第一章內容簡介第二章選定Holtek C 語言的使用環境2.1 進入HT-IDE3000 建立新的專案時, 選定Holtek C 編譯器2.2 已開啟專案後, 選用Holtek C 編譯器第三章微控制器C 語言程式的速成3.1 定義主函式main()3.2定義副函式(sub-function)3.3定義全域變數(global variable)3.4定義中斷服務函式(Interrupt Service Routine : ISR)3.5 其他第四章 C 語言程式4.1 C 程式架構4.2 開始用C 語言設計一個程式4.2.1 定義主函式main4.2.2 將標頭檔引入(include a header file)4.2.3 定義文字符號及變數4.2.4 設定微控制器及裝置的初始狀態4.2.5 設計子函式4.2.6 設計中斷服務函式4.3變數(variable) 及資料型態(data type)4.3.1 變數名4.3.2 資料型態4.3.3 變數的有效範圍(scope)4.3.4 變數的資料型態(data type)整數型(integer)浮點型(floating point)4.3.5 bit 資料型態4.3.6儲存類別(storage class) 與修飾詞(qualifier)儲存類別(storage class)修飾詞(qualifier)4.3.7絕對變數(absolute variable)4.3.8常數(constant)4.3.9指標(pointer) 與陣列(array)指標的運算子& 與*陣列(array)4.3.10結構(struct) 與等位(union)結構的運算子-> 與.4.4運算子(Operators)運算前的型態轉換4.5程式流程控制(program flow control)4.5.1if-else 敘述4.5.2switch 敘述4.5.3for 敘述4.5.4while 敘述4.5.5do-while 敘述4.5.6goto 敘述4.5.7break 與continue 敘述4.6函式(Functions)4.6.1參數(arguments)4.6.2返回值(return values)4.7中斷服務函式(Interrupt Service Routines)4.8在C 語言程式中嵌入組合語言(in-line assembly code)從組合語言的程式去存取 C 語言的物件(變數)4.9前置處理指令(Preprocessor)4.9.1 定義文字符號(#define)4.9.2引入檔案(#include)4.9.3內嵌組合語言(inline assembly)4.9.4 條件式編譯(#if/#endif)4.9.5 編譯器的特殊選項pragma4.10Holtek C 編譯器的內建函式(built-in functions)第五章基本 C 語言程式5.1 語法觀念5.2 迴圈的應用(loop)5.3 撰寫MCU 應用程式的注意事項5.4 可供微控制器應用程式使用的範本5.5 設計微控制器應用程式的小技巧第六章程式範例–初級6.1LED 跑馬燈6.2LED 霹靂燈6.3 單顆七段顯示器6.4 5*5 點矩陣LED 顯示6.5 HT48 微控制器控制HT1621 LCD 的顯示6.6 HT48 微控制器控制LCD 模組的顯示6.7 具LCD 驅動功能的微控制器之顯示應用程式– HT46R636.8 顯示器的通用函式– HT44780 LCM6.9 鍵盤掃描程式第七章程式範例–中斷函式7.1 用時鐘控制LED 的亮與滅7.2 類比/數位轉換(ADC) 的應用第八章HT46R52A 應用於鎳氫電池充電器(HA0084T)第九章程式範例– HT46R74D-1 胎壓計(HA0105T)第一章內容簡介盛群半導體公司(Holtek)開發一系列的八位元微控制器(micro-controller, MCU). 當開發微控制器的應用程式時, 除了可使用盛群提供的組合語言(assembly language),也可使用標準的C 語言編譯器(C compiler).由於八位元微控制器的記憶體空間, 不論是程式記憶體(program memory space)或是資料記憶體(ram memory space), 皆是有限制的, 通常會使用組合語言開發應用程式. 但是越來越多的微控制器支援更多的記憶體以及更多的功能, 使得程式也相對的擴大. 如果仍然使用組合語言開發程式, 不但費時費力, 未來在維護及擴增功能的工作上也相當困難.因此, 使用高階程式語言, 例如C 語言, 來開發應用程式就是一種可行的趨勢.C 語言是高階程式語言中的一種, 它具有高度的的可讀性及可移植性(portability),除了能夠快速地完成應用程式的開發與偵錯, 也很容易移植到其他的微控制器上. 當程式需要縮減或擴充功能時, 也很容易的完成, 因此很適合於微控制器的程式開發.本書主要是以Holtek C 語言為主, 說明如何使用Holtek C 語言撰寫盛群微控制器的應用程式, 包括 C 的程式架構, C 語言的一般用法, 特殊用法及應用範例書中將說明在開發微控制器的應用程式時需要注意的地方及如何撰寫會比較恰當, 並配以實例解釋.讀者可以參考修改或直接採用到自己的程式中, 再用發展工具HT-ICE, HT-IDE3000 驗證之.第二章介紹選用Holtek C 編譯器的步驟, 指引HT-IDE3000 呼叫Holtek C 編譯器去編譯C 語言的原始程式.第三章提供一種快速撰寫 C 程式的方法, 對ANSI C 語言熟悉的用者, 可於閱讀本章之後即開始撰寫微控制器的 C 語言程式第四章介紹C 語言, 未曾使用過 C 語言的讀者應仔細閱讀本章以了解 C 語言的用法第五章介紹使用 C 語言寫程式的基本觀念, 注意事項及建議的寫作方法第六章到第九章則是應用範例, 針對盛群各系列的微控制器, 以 C 語言撰寫的應用程式. 包含有功能說明, 應用電路及程式說明.文件編號版別 1.20日期2008/5/26 第5 頁共189 頁第二章選定Holtek C 編譯器的使用環境2.1 進入HT-IDE3000, 建立新的專案時, 選定Holtek C 編譯器進入HT-IDE3000 開發環境後, 依照下列方法建立一個新的專案(project)→ 移動滑鼠游標到Project 選單, 按左鍵→ 移動滑鼠游標到New 命令, 按左鍵→ 出現如下的視窗, 在Language Tool 之處勾選Enhanced Holtek C compiler/Assembler文件編號版別 1.20日期2008/5/26 第6 頁共189 頁2.2 已開啟專案後, 如何選用Holtek C 編譯器若專案(project) 已開啟之後, 可以點選(click) Option 選單下的Project Setting 命令,在Language Tool 中點選Enhanced Holtek C Compiler/Assembler 以設定使用Holtek C 的Enhance 版編譯器Enhance 版的C compiler 包括ehcc32srsc.exe , ehcc32mrsc.exe 與ehcc32mrmc.exe 三個執行檔此版本必須在HT-IDE3000 V7.0 或以上的系統才能執行第三章微控制器 C 語言程式的速成本章介紹如何快速撰寫微控制器的 C 語言應用程式. 已熟悉ANSI C 標準語言的用法或有撰寫的經驗者, 在閱讀此章後即可開始設計撰寫微控制器的 C 應用程式, 以下各節是基本的C 程式成員, 某些是必須要有的, 如3.1, 其他的則視微控制器的功能及應用來決定是否需要3.1 定義主函式main()#include “ht46r63.h”void main(void){int Flag ;……TurnOn_LCD() ;Flag = LCD_display(cstr) ;TurnOff_LCD() ;……}主函式的返回資料型態(return type)必須是void, 而且不能有參數檔案ht46r63.h 定義與微控制器有關的常數, 例如暫存器的位址定義, 將之引入(include) 可增加程式的可讀性.3.2定義副函式(sub-function)視程式的大小及功能決定是否需要定義副函式. 基本上, 主函式應將應用程式的架構做成模組化, 不需要將所有的程式皆放在主函式中. 為了能很快的完成及了解應用程式, 主函式中只需要包含(呼叫) 定義各功能的副函式即可, 無論在設計或維護程式時皆能很快的進入與完成.例如, 關於LCD 的開啟, 顯示及關閉等功能就可分別定義為單獨的副函式, 如下例. 任何其他的函式或其他的應用專案都可去呼叫這些副函式. 若設計成通用型的, 也可藉由程式館管理器(Library Manager) 將之建入程式館檔案, 以供其他應用專案使用.void TurnOn_LCD(void){}int LCD_display(char *cstr){}void TurnOff_LCD(void){}3.3定義全域變數(global variable)程式在運行中會需要一些變數做為資料存放的地方, 由於微控制器資料記憶體大小的限制及C 編譯器的設計, 最好將常需使用的變數定義為全域型的變數, 在編譯程式的大小與執行上皆較佳. 例如定義常數型指標變數cstr 指到字串“Hello!”, 則可如下const char *cstr = “Hello!” ;3.4定義中斷服務函式(Interrupt Service Routine : ISR) 若微控制器的周邊裝置具有中斷功能,程式也需要此中斷機能以完成工作時, 則必須定義此周邊裝置的中斷服務函式(Interrupt Service Routine, ISR), 如下的格式#pragma vector ISR_tmr0 @ 0x0cvoid ISR_tmr0(void){tick++ ;}中斷服務函式必須遵守下列規定→ 返回的資料型態必須是void→ 不能有參數(必須為void)→ 必須使用前置處理指令#pragma vector 設定中斷向量值(interrupt vector), 在函式名稱(本例子是ISR_tmr0) 之後加上@ 及中斷向量值(本例是0x0c). 也可使用先前定義好的常數, 例如#define VECTOR_TMR0 0x0c#pragma vector ISR_tmr0 @ VECTOR_TMR0void ISR_tmr0(void){}3.5 其他上述的主函式, 副函式及中斷服務函式不需要定義在同一個原始程式檔案內. 為縮短編譯的時間, 最好是分別定義在不同的檔案中, 並使用有意義的檔名, 方便日後找尋所要的函式.第四章 C 程式語言基本上, Holtek C 是仿ANSI (美國國家標準局) 標準的 C 語言, 為配合盛群八位元微控制器的架構, 將提供一些特殊的語法去存取或控制微控制器的資源. 另外, 本章會從八位元微控制器的角度, 說明如何使用 C 語言設計及撰寫微控制器的應用程式4.1 C 程式架構C 語言的程式是由敘述(statements) 所組成, 每個敘述的最後必須有分號‘;’ 做為結束符號.敘述分為四類:→ 宣告(declaration), 宣告變數及資料型態, 資料結構.例如char flag, tick_cnt ; // 宣告變數flag 與tick_cnt 為char 型態→ 定義(definition), 定義變數數值及位址例如int total = 10 ; // 定義變數total, 設定值為10→ 描述式(expression), 執行數學及邏輯運算, 控制程式的流程例如count = ( input > 10) ? 10 : input ;→ 函式呼叫(function), 執行函式的功能例如putchar(ch) ; // 寫出一個字元到輸出口每個敘述可以附加註解做說明. C 編譯器不會對註解做編譯, 下列為兩種可被接受的註解→ 介於符號/* 與符號*/ 之間的數據及文字, 包括換行字‘\n’如果/* 與*/ 不在同一行, 則其間所有的行皆會被視為註解例如/* this is a comment 1 */→ 從符號// 開始到本行的結束皆被視為註解例如// 這是註解的新寫法在 C 語言中, 程式執行區(program block)是以函式的格式定義, 因此, 所有要執行的敘述皆需定義(包含)於某個函式(function) 中, 例如描述式.4.2 開始用C 語言設計一個程式依照下列步驟¸使用 C 語言實作一個簡單的應用程式4.2.1 定義主函式main範例void main(void){}在 C 語言中, 主函式main 是程式執行的起點, 有如組合語言程式中的startORG 00jmp startstart :void 是資料型態, main 與void 皆是保留字, 必須用此字, 小寫字母4.2.2 將標頭檔引入(include a header file)範例#include “ht46r63.h”// 引入標頭檔ht46r63.hvoid main(void){}標頭檔ht46r63.h 中定義許多與微控制器有關的變數及文字符號(symbol). 接下來寫程式時可以使用這些變數與文字符號(symbol), 好處是寫程式或維護程式時會很容易了解程式的功能, 增加程式的易讀性. 例如unsigned char _pa @0x12 ;定義_pa 是一個unsigned char 型態的變數, 它的位址在RAM 的0x12 (就是A埠, port A). 所以程式中如下的敘述_pa = 0 ;則與組合語言的CLR PA ; (PA=[12H]) 有相同的功能4.2.3 定義文字符號及變數在程式中使用文字符號能夠更容易的讀懂程式及修改, 例如定義文字符號_pa0 如下#define _pa0 _12_0表示_pa0 是RAM 位址12H 的位元0 (bit 0), 就是 A 埠的位元0. 下列敘述_pa0 = 1 ;表示將 A 埠的位元0 設為1, 與組合語言程式的SET [12H].0 有相同的功能前置處理指令#define 是定義一個文字符號代表數值, 或是文字串, 或是巨集指令.C 編譯器的前置處理器(preprocessor) 在編譯前, 會先替換這些定義的文字符號.前置處理指令#undef 是將先前定義過的文字符號取消, 變成無效. 詳細的說明請參閱第 4.9 節微控制器中其他暫存器的變數或文字符號, 皆定義於對應之微控制器的標頭檔案內, 在設計程式時可參考之. 可以定義一些程式需要, 但是在標頭檔案中沒有定義的變數或文字符號, 方便程式的開發及維護, 例如#include #define “ht48R50A-1.h”scl _pa3 // SCL (時鐘線) 接到MCU 的A 埠的第3 位元#define scl_c _13_3 // A 埠之控制暫存器的第3 位元(bit 型變數)#define sda _pa1 // SDA (資料線) 接到MCU 的A 埠的第1 位元#define sda_c _13_1 // A 埠之控制暫存器的第1 位元void main(void){}定義四個文字符號scl, scl_c, sda, sda_c 分別代表不同的輸出/輸入埠定義變數會佔用RAM/ROM 的空間, 如果又指定位址, 則此變數佔用此位址, 否則Linker 在做連結時才會分派位址給變數. 其效果有如組合語言的_pa DB ?定義文字符號的效果則與組合語言的EQU 相同, 例如#define scl _pa3 與scl EQU _pa3有相同的效果4.2.4 設定微控制器及裝置的初始狀態根據程式的功能, 設定微控制器中各裝置的初始值, 例如周邊設備的初始狀態, 暫存器的型態等.scl_c = 0 ; // 設定SCL (= PAC) 的狀態為輸出sda_c = 0 ; // 設定SDA (=PA) 的狀態為輸出4.2.5 設計子函式獨立之功能可分別用子函式完成, 在程式的偵錯, 維護及重複使用上皆有好處. 在設計時需要注意函式的參數,返回值等. 通常會將主函式main() 放在程式檔的最後, 各個子函式定義在前面或其他的程式檔案內. 下列範例只是部份, 詳細的說明可參閱4.6 節.#include “ht48r50a-1.h”// 引入標頭檔#define scl _pa3 // SCL (時鐘線) 接到MCU 的A 埠的第 3 位元#define scl_c _13_3 // A 埠(位址0x13)之控制暫存器的第3 位元(bit 型變數) #define sda _pa1 // SDA (資料線) 接到MCU 的A 埠的第1 位元#define sda_c _13_1 // A 埠(位址0x13)之控制暫存器的第1 位元// 函式: StartCondition() 子函式// 功能: 開始一個命令// 輸入: 無// 輸出: 無void StartCondition(void){sda = 1 ; // SDA 輸出highscl = 1 ; // SCL 拉highsda = 0 ; // SDA 輸出lowscl = 0 ; // 完成Start of command}// 函式: StopCondition()// 功能: 結束先前的命令// 輸入: 無// 輸出: 無void StopCondition(void){}// 函式: main()// 功能: 主函式// 輸入: 無// 輸出: 無void main (void){unsigned char Rdata, type ;// 暫存器的初始設定scl_c = sda_c = 0 ; // 將A 埠的位元1, 3 設為輸出型態(SCL, SDA 為輸出)StartCondition() ; // 呼叫子函式……}4.2.6 設計中斷服務函式針對有硬體中斷的微控制器, 需要設計中斷服務函式以處理中斷事件定義周邊裝置的中斷服務函式(Interrupt Service Routine, ISR) 如下格式#pragma vector ISR_tmr0 @ 0x0cvoid ISR_tmr0(void){tick++ ;}中斷服務函式必須遵守下列規定→ 返回的資料型態必須是void→ 不能有參數→ 必須設定中斷向量值(interrupt vector), 在函式名稱(本例子是ISR_tmr0之後加上@ 及中斷向量值(本例是0x0c). 也可使用先前定義好的常數, 例如#define VECTOR_TMR0 0x0c#pragma vector ISR_tmr0 @ VECTOR_TMR0void ISR_tmr0(void){}4.3變數(variable) 及資料型態(data type)程式執行過程中, 可能會需要暫存一些資料, 例如旗標, 執行次數, 延遲秒數等, 因此就必須定義變數以儲存這些資料. 由於變數要佔用程式記憶體(PROM) 或資料記憶體(RAM), 因此在使用變數之前, 定義變數的資料型態, 以便讓編譯器正確的編譯程式及配置記憶體空間.除了資料型態之外, 還可加入儲存類別(storage class) 及修飾詞(qualifier), 對變數做更詳細的安置.4.3.1 變數名變數名的規則→ 第一個字元必須是英文字母或底線符號(underscore), 之後可緊接著字母或數字→ 變數名的前32 個字元有效→ 變數名內不可有+, - , *, / , ……等符號字元→ 英文字母的大小寫是有區別的(case-sensitive), 例如count 與Count 是不同的變數名範例, number, total_tick, _tick 是合法的變數名, 而2num, $dot, line\n 是非法的變數名4.3.2 資料型態* float, double 皆使用IEEE754 32 位元的格式4.3.3 變數的有效範圍(scope)根據變數定義的所在¸決定此變數的有效範圍. 可分為→ 區域變數(local variable)定義在程式區塊內(program block, 例如函式)的變數皆是區域變數. 只有當此程式區塊被執行時, 區域變數才會有效, 而在執行完畢並離開此程式區塊後, 這些區域變數將無效. 程式區塊是指包含在左右大括號‘{‘ 及‘}’ 之間的敘述行定義在函式中的static 變數則是全域變數, 參考 4.3.2 說明→ 全域變數(global variable)定義在所有函式之外的變數為全域變數. 當程式在執行時, 此變數皆有效, 任何函式都可以存取或修改這個變數範例#include “ht48r50a-1.h”unsigned char flag ; // 全域變數void main(void){ char type ; // 區域變數, 只有在此函式被執行時才有效static status = 0 ; // static 變數, 只在第一次執行時設為0……}4.3.4 變數的資料型態(data type)當宣告變數時,必須指定它的資料型態, 以告知編譯器此變數所需記憶體的大小. 資料型態分為整數型(integer type)及浮點數型(floating point type). 整數型又可區分為有正負號(signed) 及無正負號(unsigned).整數型(integer)→ char佔用一個位元組(byte) 的記憶體空間. 如加上signed 則表示有正負號, 其大小範圍是–128 到127. 若加上unsigned, 則表示沒有正負號, 其大小範圍是0到255. 如果沒有signed 或unsigned, 則被視為signed. 可用此型態定義字元,如‘A’, ‘d’, ‘$’, ‘3’等→ short佔用兩個位元組(2 bytes) 的記憶體空間, 如加上signed 則表示有正負號, 其大小範圍是–32768 到32767. 若加上unsigned, 則表示沒有正負號, 其大小範圍是0 到65535. 如果沒有signed 或unsigned, 則被視為signed.Holtek C 採用little-endian 格式, 就是變數的低位元組(least significant byte) 存放在記憶體的低位址. 例如變數count = 0x1234 是存放於記憶體40H 的位址, 則低位元組的數值0x34 存放於位址40H, 高位元數值0x12 存放於位址41H.→ int與short 型態相同→ long佔用四個位元組(4 bytes) 的記憶體空間, 如加上signed 則表示有正負號, 其大小範圍是–2147483648 到2147483647. 若加上unsigned, 則表示沒有正負號, 其大小範圍是0 到4294967295. 如果沒有signed 或unsigned, 則被視為signed在little-endian 格式中, 32位元的變數, 則是先存低字元(least significant word) 的低位元組(least significant byte)到記憶體的低位址, 再存放低字元的高位元組(high byte), 再存放高字元(high word)的低位元組, 最後才是高字元的高位元組浮點型(floating point)Holtek C 支援IEEE 754 32 位元的格式. 包括float 及double 兩個資料型態, 浮點數值是以下表的格式儲存在記憶體與浮點數值的關係式為number = (-1)sign x 2(exponent – 127) x 1.mantissa例如, 浮點數為 2.77000e+37 在儲存到記憶體時換成7DA6B69B 共佔32 位元4.3.5 bit 資料型態類似整數型, 但是只有0 或 1 兩個值, 所以只會取整數的最低位值(LSB:least significant bit) 需要注意下列用法→ bit 型態不可與auto 一起使用, bit 型態的變數不可當函式的參數, 不可用於指標(pointer) 的數據型態, 不可設定靜態初始值(static)→ bit 型態可以設為函式的返回型態, 它是存於累加器(accumulator) 的相對位置→ 程式開始執行時, 不會設定bit 型變數的初始值, 因此程式必須自行設定初始值→ 以下是合法的使用方式static bit init_flag ; // 定義於函式內則被視為區域變數bit toggle_flag ;→ 範例int data = 0x54 ;bit flag ;flag = data ;則flag = 0 (取data 的LSB)如果微控制器具有一個以上的RAM bank, 例如HT46R63, 在定義bit 型態的變數時需要使用前置處理指令#pragma rambank0 指定在RAM bank 0, 如下#pragma rambank0bit flag ;#pragma norambank4.3.6儲存類別(storage class) 與修飾詞(qualifier)變數於宣告或定義時必須指定其資料型態, 但是儲存類別及修飾詞是可選擇的, 可根據應用時的需要去設定或不使用.儲存類別(storage class)儲存類別與區域變數(local variable)及全域變數(global variable)有關.→ 儲存類別autoauto 是給區域變數使用的, 沒有指定儲存類別的區域變數皆是auto寫與不寫auto 都是相同效力. 區域變數是存放在RAM bank 0 的空間→ 儲存類別registerregister 與auto 類似, 是給區域變數用的, 當變數的存取很頻繁時, 可將之設為register, C 編譯器會使用暫存器而非資料記憶體空間來存放此變數, 如此可增加存取的速度及減少編碼. 目前並未實做此功能.→ 儲存類別staticstatic 的變數會一直有效到整個程式結束後才失效. 它的初始值只會在程式開始執行時被設定一次. 雖然static 的變數在程式結束前皆有效, 但是定義在函式內的static 變數仍然是區域變數, 必須要在它所定義的函式中才可以讀寫→ 儲存類別externextern 通知C 編譯器此變數是定義在其他的程式檔內, 需要經由連結器(Linker)連結定義此變數的檔案後, 才知道變數的所在.以目前在微控制器的應用程式上, 比較需要使用extern, 其他三種不具特別的優勢可用定義全域變數(global variabl)的方式即可達到相同效果. 建議不要使用.修飾詞(qualifier)→ 修飾詞constC 編譯器會將const 的變數放置於程式記憶體(PROM). 在定義const 變數時, 必須要設定其值, 而程式在執行中不能修改此變數的值→ 修飾詞constant這個修飾詞是Holtek C 編譯器特別提供的. 它會將constant 的變數放置於程式記憶體(PROM) 的最後一頁(last page). 定義constant 變數時,必須要設定其值, 而程式在執行中不能修改此變數的值. 使用此修飾詞要注意下列三點●只能使用在int 或unsigned int 的資料型態●設定值必須配合微控制器程式記憶體的寬度, 例如, 若使用在 HT48R50A-1 時,因為此微控制器的寬度為 15 個位元, 最高位元是無效的, 所以 0x9A 會被 C編譯器改成 0x1A. 最高位元, 位元 15 被清除為 0● 所有設定此修飾詞的變數或陣列, 總共佔用的字位元組 (word) 不可超過 256 個指定詞(specifier)→ 指定詞typedeftypedef 是針對資料型態做新名稱的宣告, 不是宣告資料型態的新變數, 而是宣告一個新的名字. 例如將UCHAR (新名字) 宣告為unsigned char 的資料型態, 可使用typedef unsigned char UCHAR ; // UCHAR 為unsigned char 的新名字UCHAR count ; // 變數count 的資料型態為unsigned char// 等同於unsigned char count ;使用typedef 宣告資料型態的新名字可以讓程式的可讀性更高, 更易了解. 例如,typedef unsigned int WORD ; // 使用WORD 代表unsigned int, 16 bitstypedef unsigned long DWORD ; // DWORD 代表32 bit 的double word4.3.7絕對變數(absolute variable)可以將全域變數或static 變數指定一個固定的記憶體的位址, 例如unsigned char PortA @ 0x12 ;在變數名的後面再加上‘@’及位址C 編譯器在編譯時會將程式中出現絕對變數的程式改為此位址, 但並未在記憶體中保留位置給此變數, 所以從連結器(Linker) 產出的對映檔(map file)中找不到此變數 C 編譯器會將之翻成組合語言的EQU 指令,如下_PortA EQU 12h此種用法主要是對微控制器內的暫存器做定義, 方便閱讀程式4.3.8常數(constant)整數型常數(integral constant) 可使用基底(radix)格式表示之.若常數的最後一字為l 或L, 則表示它使用signed long 或unsigned long 的型態. 字尾是u 或U, 則表示常數為unsigned 型態.浮點型(floating point)常數的型態是double, 若它的字尾是 f 或F, 則是float.字元常數(character constant)必須以單引號‘ ‘ 框住, 例如‘a’字串常數(string constant) 必須以雙引號“ “ 框起, 例如“Hello!”. 字串常數的定義會影響它所儲存的記憶體位址, 如下char *cp = “one” ; // C 編譯器會發出錯誤const char *sptr = “Hello” ; // “Hello” 儲存在程式記憶體(PROM) 常數型的變數或陣列(array)必須要設定其值, 否則C 編譯器會發出錯誤訊息,如上例4.3.9指標(pointer) 與陣列(array)指標本身是一個變數, 它的內容是另一個變數存放的位址, 類似組合語言的間接定址.在使用上, 指標必須要指到一個已定義(存放於記憶體) 的變數, 否則在程式執行時會發生錯誤. 指標的宣告格式資料型態*指標名[, *指標名,….] ; 資料型態是這個指標所指的變數的資料型態, 例如char. 指標名類似變數名, 可以在一行中, 宣告指向相同資料型態的不同指標名, 例如char *tptr, *array_ptr ;int *line_ptr ;以上只是宣告指標變數, 必須要將這些指標指向已定義的變數才能使用指標的運算子& 與*運算子& 如果緊鄰在變數的前面, 例如&line, 則是代表取得此變數的記憶體位址例如,int line ; // 定義變數int *line_ptr ; // 宣告指標line = 12 ;line_ptr = &line ;若變數line 被安置於RAM 的位址64, 則指標line_ptr 等於64運算子* 緊鄰指標變數之前是表示取得這個指標指到的變數的內容, 承上例, int total ; // 定義變數total = *line_ptr ; // 取得指標line_ptr 所指到的變數line 的內容則變數total 等於12指標的大小會根據微控制器具有之記憶體空間大小而定, 如果微控制器具有一個以上的RAM bank, 則指標本身會使用兩個位元組來儲存被指到的變數的位址如果變數有const 或constant 修飾詞, 則是指向程式記憶體(PROM), 而且此變數的內容不能被修改. 如果所指向的變數不具有const 或constant, 則指標會指向資料記憶體(data memory, RAM) 內的變數.陣列(array)陣列是由相同資料型態的元素組成的, 例如char array_name[32] ;是由32 個char 型態的元素組成的, 這些元素的名字是以陣列名array_name 為準, 而以索引(index) 區分各個元素, 例如array_name[3] 是第 4 個元素. 陣列的索引是正整數, 從0 開始直到元素的總個數減一, 上例中, 最後一個元素是array_name[31]. 這種資料型態在建表格(table) 時非常有用陣列也可當做指標的一種, 只是使用時格式不同, 下列範例說明指標與陣列之間的使用方法char *nptr, *fptr ; // 宣告指標char ch, tbl ; // 定義變數char table[5] = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ } ; // 定義陣列nptr = table ; // 指標nptr 指到陣列table 的第一個元素table[0]ch = *nptr ; // 將字元‘a’ 存入變數chtbl = table[0] ; // 將字元‘a’ 存入變數tbl , 所以變數ch 與變數tbl 的內容相同fptr = &table[4] ; // 指標fptr 指到陣列table 的第5 個元素, table[4]ch = *fptr ; // 將字元‘e’ (第5 個元素) 存入變數ch 內tbl = *(nptr+4) ; // nptr 指到陣列table 的第一個元素, 加4, 所以tbl = ‘e’4.3.10結構(struct) 與等位(union)結構是一個或多個成員的集合, 每個成員的資料型態可以不同, 並且使用結構的名字去讀寫這些成員. 結構的宣告是等同於定義一個新的資料型態, 當變數宣告為一個結構的型態時, 便可用結構的名字去讀寫各成員的內容.成員的資料型態不可以使用bit 型態, 但是可以用bit-field 方式宣告成員的型態, 例如struct str_name {unsigned flag : 1 ; // 此成員放於最低位元least significant bitunsigned no_used : 7 ;unsigned stack : 5 ; // 此成員置於最高位元high bits} usage ;每個bit field 會置放於16 位元的單位內, 不會橫跨兩個16位元的單位等位(union) 的格式與結構相同, 唯一不同的是記憶體空間的分配方式. 等位是安排共用的空間來存放不同資料型態的成員. 每個成員必須要宣告其資料型態, 而等位的大小則是所有成員中佔用最大位元組(bytes)的型態大小. 每個成員的開始位址皆相同, 就是等位的位址.union union_name {char num_byte ; // 佔用1 個位元組。

holtek单片机图文全面详解

holtek单片机图文全面详解

holtek单片机图文全面详解电子产品项目中对单片机的选型,可谓仁者见仁智者见智。

合泰单片机价格适中,种类也比较齐全。

下面就为大家全面介绍下holtek的单片机。

holtek单片机是由盛群半导体设计开发,盛群半导体为国内专业微控制器IC设计领导厂商,营业范围主要包括微控制器IC及其周边组件之设计、研发与销售。

自1998年成立以来,公司不断致力于新产品的研发及技术的创新,加上对市场趋势的掌握,期能提供广大电子市场最具竞争力之IC产品。

产品范围包括:泛用型与专用型微控制器(MCU),除一般应用领域外,更涵盖语音、通讯、计算机外设、家电、医疗、车用及安全监控等各专业领域,并提供各种电源管理及非易失性内存等微控制器外围组件,提供客户更具竞争能力的完整解决方案。

holtek单片机分类(1)HT48系列I/O 型(+ LCD)(2)HT49系列I/O + LCD 型(3)HT46系列I/O+AD 型(+ LCD)(4)HT47系列I/O+RC-F(AD)+LCD+IR型(5)HT48xAx\HT49xAx系列Remote (遙控器用)型(6)HT95R2x\HT95R3x系列Phone(+ LCD)(7)HT45R3x\BS28xx\BS26xx系列Touch型(8)Flash 型(HT46Fxx\HT48Fxx\HT66Fxx\HT68Fxx)(9)TIny Power 型(HT56R2x,HT56R6x,HT56R6xx )(10)Keyboard/Mouse系列,USB Audio系列,V oice/Music系列,VFD系列。

HOLTEK单片机系统结构Holtek单片机的系统结构时序和流水线结构。

合泰单片机外部中断程序

合泰单片机外部中断程序

合泰单片机外部中断程序;;内容:按下PA3 接的按键进中断LED 灯左移一位;LED 接法PD 口;源码下载:51hei/f/htwzd.rar;1.开中断;2.中断中防抖includeHT66F50.incORG0000HJMPA1ORG04H;外部中断0 入口地址JMPZD01;ORG30H;A1:MOVA,00000000B;MOVPRM1,A;设置外部中断0 的管脚为PA.3MOVA,00000010B;MOVINTEG,A;设置外部中断0 为下降沿触发CLRACERL;设置PA 口不为AD 输入口SETPAPU.3;设置PA.3 上拉SETPAC.3; 设置PA.3 为输入口MOVA,08H;MOVCP0C,A;设置PA3 不为比较器输入口CLRPDC;设置PD 口为输出口MOVA,01H;设置PD 口初始状态MOVPD,A;PD口显示初始状态CLRINT0F;清中断0 标志SETINT0E;使能外部0 中断SETEMI; 使能总中断JMP$;*************************************************;外部中断0 服务子程序;*************************************************ZD01:RLPD;左移PD 口显示SNZPA.3;判断PA3 是否为高电平(去抖)JMP$-1;是低电平则返回判断CALLM001;延时防止抖动SNZPA.3;JMP$-4;CLRINT0F;清中断标志RETI;中断返回;**************************************;延时子程序;**************************************M001:MOVA,1MOV[85H],AM002:MOVA,10MOV[86H],AM003:MOVA,250MOV[87H],AM004:SDZ[87H]JMPM004 SDZ[86H]JMPM003SDZ[85H]JMPM002 RETENDtips:感谢大家的阅读,本文由我司收集整编。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



带借位的减法指令
SBC A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+C
STATUS
ACC
影响标志:OV,Z,AC,C
SBCM A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+C
STATUS
ACC
影响标志:OV,Z,AC,C
〈例〉
RAM STATUS
HOLTEK MCU 软件指令介绍
MCU概述 指令系统概述 HOLTEK指令系统
MCU概述 指令系统概述 HOLTEK指令系统
MCU概述(组成架构)
MCU的基本结构由以下几个部分组成:
– PC – ROM – RAM – ACC – ALU (Program counter 程序计数器) (Program memory 程序存储器) (Data memory 数据存储器) (Accumulator 累加器) (Arithmetic and logic unit 算术逻 辑单元) – STATUS (Status register 状态寄存器) – STACK (Stack register 堆栈寄存器)
〈例〉ORM A,[41H]
运算前: ACC=12H [41H]=11H 运算后: ACC=12H [41H]=13H 00010010B 00010001B 00010011B
逻辑异或指令
XOR A,[m]
指令说明:
RAM ALU Shifter
ACC “XOR” [m]
ACC
影响标志:Z
ACC
影响标志: OV,Z,AC,C
〈例〉
RAM STATUS

ADD A,[60H]
66H 12H C1H
ACC
ADDM A,[61H]
ADD A,51H
0110 0110 1100 0001 + 0101 1011 0010 0001 0010 0001 0010 1100 0011 1110 0001
ACC
影响标志:Z
ANDM A,[m]
指令说明:
RAM ALU Shifter
ACC“AND”[m]
ACC
影响标志:Z
AND A,X
指令说明:
ROM ALU Shifter ACC“AND”X
ACC
影响标志:Z
〈例〉AND A,[40H]
运算前: ACC=19H [40H]=B8H 运算后: ACC=18H [40H]=B8H 00011001B 10111000B 00011000B
MCU概述 指令系统概述 HOLTEK指令系统
指令系统概述
分类 寻址方式 指令周期 状态寄存器 指令中的常用符号
分类
HOLTEK8位系列单片机共有63条功能强大的 汇编指令。这些指令按功能可分为以下七类。
–数据传送指令 –算术运算指令 –逻辑运算指令 –控制和转移指令 –位操作指令 –读表指令 –其它指令
C D7 D6 D5 D4 D3 D2 D1
C
D0
影响标志:C
RRCA [m]
指令说明:
RAM MSB LSB 7 6 5 4 3 2 1 0 D7 D6 D5 D4 D3 D2 D1 D0 C C
STATUS
ALU Shifter
7 6 5 4 3 2 1 0
C D7 D6 D5 D4 D3 D2 D1
60H
61H
5BH
22H E3H
C AC Z OV PD TO -
0 1 0 1 0 0 1 0 0 -


BCD码修正指令
DAA [m]
指令说明:
若ACC低四位的值大于9或AC=1, 則低四位加上6; 若ACC高四位的值大于9或C=1, 則高四位加上6; RAM
ALU Shifter
ACC
影响标志:C
指令MOV PCL,A、以及SZ、SIZ等判断条件成立 时。)
状态寄存器
bit7 --TO PD OV Z AC bit0 C
溢出标志 掉电标志 WDT溢出标志
进位标志
半进位标志 零标志
指令中的常用符号
X :8位立即数 M :数据存储器地址 A :累加器 I :0-7位 Addr:程序存储器地址 ← :数据传送方向
MCU概述 指令系统概述 HOLTEK指令系统
HOLTEK指令系统
数据传送指令(3条) 算术运算指令(15条) 逻辑运算指令(19条) 控制和转移指令(11条) 位运算指令(4条) 读表指令(2条) 其它指令(9条)
数据传送指令
数据传送指令是应用最频繁的指令 助记符为MOV,其汇编语言指令格式为 MOV [目的字节],[源字节] 指令功能是将源字节的内容传送到目的 字节,源字节的内容不变。 这类指令不影响标志位。
0 1 0 1 0 0 1 0 0 -


减法指令
SUB A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+1
ACC
影响标志:OV,Z,AC,C
SUBM A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+1
ACC
影响标志: OV,Z,AC,C
SUB A,X
逻辑或指令
OR A,[m]
指令说明:
RAM ALU Shifter
ACC “OR” [m]
ACC
影响标志:Z
ORM A,[m]
指令说明:
RAM ALU Shifter
ACC“OR”[m]
ACC
影响标志:Z
OR A,X
指令说明:
ROM ALU Shifter ACC“OR”X
ACC
影响标志:Z
指令说明:
ROM ALU Shifter ACC+X+1
ACC
影响标志:OV,Z,AC,C
〈例〉
RAM STATUS

SUB A,[80H]
55H ABH BDH
ACC
SUBM A,[81H]
SUB A,56H
1010 1011 1100 1110 + 1010 0111 0101 1010 + 0111 0101 1010 1011 1101 1011 1001 1101 0110 0100 1010 1 0111 0101 1011
带进位的加法指令
ADC A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+C
STATUS
ACC
影响标志:OV,Z,AC,C
ADCM A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]+C
STATUS
ACC
影响标志:OV,Z,AC,C
〈例〉
RAM STATUS
80H
81H
12H
77H 34H
C AC Z OV PD TO -
0 1 0 1 0 0 1 0 0 -


加1指令
INC [m]
指令说明:
RAM ALU Shifter
[m]+1
影响标志:Z
INCA [m]
指令说明:
RAM ALU Shifter
[m]+1
ACC
影响标志:Z
减1指令
XORM A,[m]
指令说明:
RAM ALU Shifter
ACC“XOR”[m]
ACC
影响标志:Z
XOR A,X
指令说明:
ROM ALU Shifter ACC“XOR”X
ACC
影响标志:Z
〈例〉XOR A,25H
运算前: ACC=33H 25H 运算后: ACC=16H 00110011B 00100101B 00010110B


加法指令
ADD A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]
ACC
影响标志:OV,Z,AC,C
ADDM A,[m]
指令说明:
RAM ALU Shifter
ACC+[m]
ACC
影响标志:OV,Z,AC,C
ADD A,X
指令说明:
ROM ALU Shifter ACC+X
指令周期
一个指令周期包括四个系统时钟周期。 指令的提取和执行呈流水线工作。
指令周期
由于采用了流水线的工作方式,因此多数 指令都能在1个指令周期内执行完成。 查表指令是2周期指令。(若查表所得内容
的低8位送往PCL,则该指令的执行就需要3个指 令周期。)
凡是使程序非顺序执行的指令,其执行时 间需要2个指令周期。(包括:JMP、CALL等,

ADC A,[50H]
66H 55H
ACC
ADCM A,[51H]
50H
51H
10H
76H 10H
0110 0101 + 0001 0111 0110 + 0110 0111
0110 0101 0000 0110 0101 0 1 0110
C AC Z OV PD TO -
1 0 1 0 0 0 0 0 -

SBC A,[70H]
BDH E1H
ACC
SBCM A,[71H] 1011 1101 1110 0001 1101 1100 + 1011 1010 0111 0111 1011 1101 1 0 + 0111 1000 1011 1101
相关文档
最新文档