义隆单片机指令
- 格式:docx
- 大小:41.39 KB
- 文档页数:9
应用义隆单片机编程时应注意以下几点:
1.当程序多于1K时,将出现跳页情况,这时如果有开中断处理程序,在进入中断后,一定要把STATUS的PS0、PS1位复位为0(即回到第0页ROM),否则当遇到有JMP或CALL等跳转指令时,程序将会出错!
2.当程序多于1K而使用跳转指令BS STATUS PS0或BS STATUS,PS1时,将会影响到中断程序的中断时间,期分频系数不预计(即TCON受影响);并且中断自动关闭。
跳转返回后,一定要重新开中断(如ENI)。
3.注意子程序的嵌套级数。
一般硬件所允许的X级堆栈至少减去一个中断程序所用,即子程序最好使用X-1个嵌套;否则将会出错。
4.任何对R2(即PC)进行直接修改的指令,如:ADD R2,A | MOV R2,A | BC R2,x 等都将会使PC的第9位、10位清零,因此产生的跳转只限于一个程序的前256个地址。
TBL指令即除外,不会改变PC的9位、10位;执行TBL==PC+1+A;可以解决以前对R2(即PC)直接修改所产生的后果。
一般查表子程序放于程序最前端,就是为了避开9位、10位清零。
5.八位单片机的高电平一般为4.5~5V,而低电平一般为1V以下;如何让单片机产生一个2.5V电压呢?可以把要输出2.5V电平的I/O口设置为输出状态,并置为高电平;接着把该输出口设置为输入状态,这时将输出一个2.5V电平电压。
6.由于一个中文为两个字节,所以在注释时应当小心注意,避免在程序的注释出现半个中文字的乱码现象;一旦出现这样的问题,可以导致编译出错或功能不。
义隆单片机中断c语言使用
根据仪陇单片机TINYC 使用手册翻译中断c 语言,关于中断的现场保护,由于英文手册还没有看懂,所以空来没有写出。
低级中断,中断保护程序
中断执行前对一些寄存器进行保护
Void intcall tcc_1(void) @ 0x03:low_int 0
中断服务程序
Void intcall tcc(void) @ int 0
中断向量数,是指MCU 有几个中断向量,用标号将每种中断向量分开。
编译器根据中断向量数将中断保护程序和中断服务程序结合起来
全局中断向量IntVecIdx
先申明全局中断下向量IntVecIdx
Extern int IntVecIdx;// IntVecIdx 将占用地址0x10,用户将不能再在0x10 定义变量,否则将冲突全局中断向量出错,且编译器不会有错误提示。
当硬件中断向量不止一个,根据中断向量跳转到相应的中断服务程序,用户
可以屏蔽没有使用的中断向量。
Extern int IntVecIdx;//占用0x10
Void _intcall allint(void)@ int
{case 0x04:
;break;
Case
}
Void _intcall tcc_1(void) @0x03:low_int 0。
引言概述:单片机指令是嵌入式系统设计中至关重要的一部分,它们定义了单片机的功能和操作。
本文是单片机指令大全系列的第二部分,旨在提供更多全面的单片机指令信息,帮助读者更好地理解和应用单片机指令。
正文内容:一、移位指令1.逻辑左移指令:将操作数的每一位向左移动一位,并且最低位填充0。
2.逻辑右移指令:将操作数的每一位向右移动一位,并且最高位填充0。
3.算术右移指令:将操作数的每一位向右移动一位,并且最高位保持不变。
4.循环左移指令:将操作数的每一位向左循环移动一位,即最高位移动到最低位。
5.循环右移指令:将操作数的每一位向右循环移动一位,即最低位移动到最高位。
二、逻辑运算指令1.逻辑与指令:对操作数进行逻辑与运算,将两个二进制数对应位上的值进行逻辑与操作。
2.逻辑或指令:对操作数进行逻辑或运算,将两个二进制数对应位上的值进行逻辑或操作。
3.逻辑非指令:对操作数进行逻辑非运算,将二进制数的每一位取反。
4.逻辑异或指令:对操作数进行逻辑异或运算,将两个二进制数对应位上的值进行逻辑异或操作。
5.逻辑移位指令:将操作数进行逻辑左移或右移。
三、算术运算指令1.加法指令:对操作数进行加法运算,并将运算结果保存到指定的寄存器或存储器中。
2.减法指令:对操作数进行减法运算,并将运算结果保存到指定的寄存器或存储器中。
3.乘法指令:对操作数进行乘法运算,并将运算结果保存到指定的寄存器或存储器中。
4.除法指令:对操作数进行除法运算,并将运算结果保存到指定的寄存器或存储器中。
5.移位指令:对操作数进行移位运算,包括算术左移、算术右移、循环左移和循环右移。
四、输入输出指令1.读取输入指令:从指定的输入设备读取数据,并将数据保存到指定的寄存器或存储器中。
2.输出显示指令:将指定的数据从寄存器或存储器中读取,并显示到指定的输出设备上。
3.端口输入指令:从指定的端口读取数据,并将数据保存到指定的寄存器或存储器中。
4.端口输出指令:将指定的数据从寄存器或存储器中读取,并输出到指定的端口上。
基于EM78P153S的应用设计(V1.0)目录第一章EM78P153S的初识 (1)1.1 EM78P152/3S特性 (1)1.2 EM78P152/3S引脚 (2)1.3 功能寄存器 (2)1.3.1 累加器与端口控制寄存器 (2)1.3.2中断状态寄存器与中断使能寄存器 (3)1.3.3 操作寄存器 (4)1.3.4 特殊功能寄存器 (6)1.4 数据存储器的配置 (7)1.5 休眠与唤醒 (7)1.6 分频器 (9)1.7 定时器/计数器TCC (9)第二章EM78系列单片机应用软件的编辑与仿真 (11)2.1 Simulator的下载与安装 (11)2.2 Simulator的使用方法 (11)2.3 Simulator系统常用命令汇总 (14)2.4 Simulator仿真中的常见问题 (15)第三章EM78系列单片机的汇编指令 (17)3.1 寻址方式 (17)3.2 伪指令 (18)3.3 指令速查表 (18)第四章EM78P153S应用软件设计 (20)4.1 外部中断程序 (20)4.2 花样灯程序 (22)4.2.1 设计需求 (22)4.2.2 软件设计 (23)4.2.3 硬件设计 (37)4.2.4 元器件明细表 (38)第五章EM78系列单片机应用程序的烧录 (39)5.1 程序的转换过程 (39)5.2 烧录器与烧录软件 (40)5.3 烧录步骤 (41)第一章 EM78P153S的初识EM78P152/3S是采用低功耗高速CMOS工艺设计开发的8位微控制器,它的内部有一个1024×13位一次性可编程只读存储器(OTP_ROM) ,可见1k的只读存储器(ROM)决定了应用程序不能够太多,否则应用程序机器码将无法烧录到芯片中。
硬件设计中,EM78P152/3S可以通过设置代码选项寄存器使微处理器工作在内部RC 振荡模式(IRC)下,此模式下采用上电复位模式而不需要外接时钟电路;同时利用上电自动复位而不需要外接复位电路,P63复位引脚可以直接作为输入脚使用,充分提高了微处理器端口的利用率,这样硬件应用电路极为简化,节省了硬件成本。
3.2.2. 面向位操作类指令(10条)
3.2.3. 常数操作和控制类指令(22条)
例:MOV A,@0x16 ;将常数0x16送给寄存器A
3.3.2. 直接寻址
若是使用者要存取寄存器的内容,可以在运算码上直接描述。
l 例:将寄存器0X20的内容,COPY到寄存器0X21中。
MOV A, 0X20
MOV 0X21, A
3.3.3. 间接寻址
这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)
若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。
l 例:写一个程序,將寄存器0X20~0X3F的值都填0。
;设定A = 0X20。
;设定间接寻址寄存器(0X04)
;的內含值为0X20
;清除0X04所指的寄存器。
;递增间接寻址寄存器(0X04)
;设定A=0X04寄存器的值。
;比较间接寻址的位址是否
;以到0X3F。
若是则结束。
;否则在继续。
MOV A, @0X20
MOV 0X04, A
AGAIN:
CLR 0
INC 0X04
MOV A, 0X04
XOR A, 0X3F
JBS 0X03, 2
JMP AGAIN
END:
3.3.
4. 位寻址
这种位寻址是对寄存器中的任一位(bit)进行操作。
例:BS 0x12,2 ;将寄存器0x12的第2位置为“1”。
3.4.EM78指令说明
--> A .--> R。
ELAN义隆系列单片机解密由台湾ELAN 设计、制造的EM78系列8位元单片机以它低价为优势,广泛应用于:大小家电类、通讯类、玩具游戏类、计算机及周边类、智能卡类、汽车及防盗类、医用保健类、仪表类、灯光控制类、音响类、手机及周边类等。
ELAN义隆EM78P、EM78系列单片机解密型号:HOLTEK合泰系列单片机解密HOLTEK单片机:台湾盛扬半导体的单片机,价格便宜,种类较多,但抗干扰较差,适用于消费类产品. HOLTEK 合泰HT46/47/48/49、HT其它单片机解密型号:MICON麦肯系列单片机解密由台湾MICON 麦肯公司设计的OTP/MASK掩膜型8 位单片机自1997 年推向市场以来深受广大用户欢迎,MDT 系列单片机与PIC 相比最大特点是温度范围为工业级最大工作频率可达到20MHz 不分型号和后缀及售价十分便宜SONIX松翰系列单片机解密应用领域:电子玩具产品:发声玩具、遥控玩具、音乐玩具、早教机、电子词典、电子故事书等小家电产品:电风扇、电暖器、消毒柜、微波炉、电磁炉、电饭煲、电子炖盅等遥控器:电视、空调、VCD、DVD、机顶盒遥控器充电器:锂电、镍氢、镍铬等智能充电器电子称:厨房称、人体称、口袋称、脂肪称松翰(SONIX)SN8P全系列单片机解密型号:PORTEK普泰系列单片机解密普泰半导体凭借着对产业趋势的掌握及卓越技术之极致深耕,在半导体产业界占一席之地。
从各项消费性电子产品的研发设计,兼顾客户多样化不同的需求;普泰提供了长期及稳定的产品,让客户快速进入市场以确保产品竞争优势,更降低了客户生产成本。
普泰(PORTEK)PTK87XX全系列单片机解密型号:TENX十速系列单片机解密八位单片机可兼容PIC/EMC等芯片,其具备相等或更优越抗干扰功能,适用于频道选择器、天线控制系统、功率放大器、智能型芳香机、超声波测距仪、遥控风扇、负离子风扇、遥控器、电卷发器、电动窗帘、按摩器、按摩椅、按摩鞋、按摩棒、雾化器、豆浆机、打蛋机、咖啡壶、小家电、密码锁、定时器等消费产品应用;四位单片机可实现定时、时钟、温度、湿度、倒计时等不同功能及组合,具标准芯片及依客户所需选择最佳性价比之四位单片机母体设计;USB控制芯片可兼容赛普拉斯( Cypress )系列芯片,适用于游戏机、跳舞毯、功夫机、手柄、鼠标、个人音箱等USB产品,具备优越之性价比。
; Program for EM55000 series Assember; Program is IR car; Reference program date : April 23,2003; Programmer : w.m.liu; Project : em_rx_1; Project Leader :; Program Approval by : w.m.liu; Program Check sum :; Customer :; Customer order code :; fequency test: p2.2 p2.3 connet to vdd p3.0 out 14 khz fequency; ir input : p2.0; f/b mottor: p3.0 p3.2; l/r mottor: p3.1 p3.3include "define.inc"poweron:stop2mov rate2,#8287mov a,#0000bmov p2s,amov a,#0000bmov p3s,amov p4s,amov p4,amov p2,amov p3,apage1call clr_rampage0call clr_rammov m2,#1100bmov a,p2and a,m2caje m2,test_modemov m13,#0110bmov m3,#0001b;jmp testend;**************************************test_mode:page0mov m4,#0001bmov a,#0001bmov p3,atest_mode_loop:mov a,#0001b;; 1xor a,m4;; 1mov m4,a;; 1mov p3,a;; 1mov a,p2;; 1and a,m2;; 1caje m2,test_mode_loop;; 3 -> 9 KHz 110usjmp poweron;-------------------------------------------init:call cl_128jmp rx_start_init;mov timer,#0 ;0----->.85ms 1---->1.7ms 2----->3.4ms 3----->6.8ms ;--------------------------------receive_loop:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m15,#0page0mov a,m1caje #0,rx_endrx_end@:page0call udchkmov a,m8caje #0,rx_endjmp rx_start@rx_end:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m1,#0mov m15,apage0mov m1,#0mov m9,#0mov m5,#0mov a,#0000bmov p3,amov p2,amov m0,amov m5,#0end ;;;;;;;;;;;;;;;;;;;;;;;;rx_start_init:page0mov m3,#0001bmov a,m1and a,m3caje #0,rx_end@mov a,m15caje #2,rx_startcall udchkmov a,m8caje #1,rx_startmov a,#0000bmov p3,amov p2,amov p4,arx_start:call voice2rx_start@:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m15,#0mov m3,#0001bnopnopnopmov a,p2and a,m3caje m3,rx_start_init nopnopnopmov a,p2and a,m3caje m3,rx_start_init call get_receivecaje #15,receive_loop;------------------------------------------------get_receive:call cl_128call cl_128mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov a,#1000bmov p3,acall hl_waitcaje #0,no_receivemov a,#0100bmov p3,arx_receive:mov a,m4caje #0000b,receive_15bitcaje #0001b,receive_14bitcaje #0010b,receive_13bitcaje #0011b,receive_12bitcaje #0100b,receive_11bitcaje #0101b,receive_10bitcaje #0110b,receive_9bitcaje #0111b,receive_8bitcaje #1000b,receive_7bitcaje #1001b,receive_6bitcaje #1010b,receive_5bitcaje #1011b,receive_4bitcaje #1100b,receive_3bitcaje #1101b,receive_2bitcaje #1110b,receive_1bitcaje #1111b,receive_0bitreceive_15bit:;call cl_128 ;15 call cl_128mov a,p2and a,m3caje #0,zero15one15:mov a,#1000bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero15:mov a,#0010b mov p3,acall hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_14bit:call cl_128 ;14 ;call cl_128mov a,#0001bmov p3,amov a,p2and a,m3caje #0,zero14one14:mov a,#0100bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero14:mov a,#0000bmov p3,amov a,m13caje #0,no_receivejmp comp_increceive_13bit:call cl_128 ;13 ;call cl_128mov a,p2and a,m3caje #0,zero13one13:mov a,#0010bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero13:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_12bit:call cl_128 ;12;call cl_128mov a,p2and a,m3caje #0,zero12one12:mov a,#0001bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero12:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_11bit:call cl_128 ;11 ;call cl_128mov a,p2and a,m3caje #0,zero11one11:mov a,#1000bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero11:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_10bit:call cl_128 ;10 ;call cl_128mov a,p2and a,m3caje #0,zero10one10:mov a,#0100bmov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero10:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_9bit:call cl_128 ;9 ;call cl_128mov a,p2and a,m3caje #0,zero12one9:mov a,#0010bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero9:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_8bit:call cl_128 ;8 ;call cl_128mov a,p2and a,m3caje #0,zero8one8:mov a,#0001bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero8:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_7bit:call cl_128 ;7 ;call cl_128mov a,p2and a,m3caje #0,zero7one7:mov a,#1000bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero7:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_6bit:call cl_128 ;6 ;call cl_128and a,m3caje #0,zero6one6:mov a,#0100bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero6:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_5bit:call cl_128 ;5 ;call cl_128mov a,p2and a,m3caje #0,zero5one5:mov a,#0010bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero5:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_4bit:call cl_128 ;4 ;call cl_128mov a,p2and a,m3caje #0,zero4one4:mov a,#0001bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero4:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_3bit:call cl_128 ;3 ;call cl_128mov a,p2and a,m3caje #0,zero3one3:mov a,#1000bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero3:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_2bit:call cl_128 ;2 ;call cl_128mov a,p2and a,m3caje #0,zero2one2:mov a,#0100bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero2:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_1bit:call cl_128 ;1 ;call cl_128mov a,p2and a,m3caje #0,zero1one1:mov a,#0010bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero1:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_0bit:call cl_128 ;0 ;call cl_128mov a,p2and a,m3caje #0,zero0one0:mov a,#0001bor a,m8mov m8,a;call l_wait;mov a,m12;caje #0,no_receivejmp comp_inczero0:;call hl_wait;mov a,m13;caje #0,no_receivejmp comp_inccomp_inc:mov a,m4add a,#1mov m4,acaje #0,receive_okjmp rx_receivereceive_ok:mov a,#0retno_receive:mov a,#15ret;-----------------------------------l_wait:l_chk:page1mov m12,#0mov m3,#0001bmov level_count,#0 mov noise_count,#0 mov over_count,#0l_chk_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje #0,l_chk_endmov noise_count,#0 mov a,level_count incamov level_count,a caje #0,l_chk_flow jmp l_chk_loopl_chk_end:mov a,noise_count incamov noise_count,a caje #1,l_chk_loop ;jmp l_chk_okl_chk_ok:mov m12,#1retl_chk_flow:mov m12,#0ret;=============================== hl_wait:hl_chk:page1mov m13,#0mov m3,#0001bmov level_count,#0 mov noise_count,#0 mov over_count,#0 wait_h_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje m3,wait_h_noise mov noise_count,#0 mov a,level_count incamov level_count,a caje #0,hl_chk_flow jmp wait_h_loop wait_h_noise:mov a,noise_count incamov noise_count,a caje #1,wait_h_loop ;jmp wait_l_start wait_l_start:mov level_count,#0 mov noise_count,#0 mov over_count,#0 wait_l_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje #0,wait_l_noise mov noise_count,#0 mov a,level_count incamov level_count,a caje #0,hl_chk_flow jmp wait_l_loop wait_l_noise:mov a,noise_count incamov noise_count,a caje #1,wait_l_loop jmp hl_chk_okhl_chk_ok:mov m13,#1rethl_chk_flow:mov m13,#0ret;*******************************page1mov timer,#2rsttfmov m12,#0000bmov m3,#0001bl_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,l_wait_endmov a,p2and a,m3caje m3,l_wait_cntnopnopnopmov a,p2and a,m3caje m3,l_wait_cntl_wait_ok:mov m12,#0001bretl_wait_end:mov m12,#0000bret;**************************************;;hl_wait:page1rsttfmov timer,#2mov m13,#0000bmov m3,#0001bhl_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,hl_wait_endmov a,p2and a,m3caje #0,hl_wait_cntnopnopnopmov a,p2and a,m3caje #0,hl_wait_cntll_wait:rsttfmov timer,#2ll_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,hl_wait_endmov a,p2and a,m3caje m3,ll_wait_cntnopnopnopmov a,p2and a,m3caje m3,ll_wait_cnthl_wait_ok:mov m13,#0001brethl_wait_end:mov m13,#0000bret;================================================== cp_chk:page1mov a,m6 ;-----------------m5,m6 port31 caje m5,cp_next_chkjmp receive_loopcp_next_chk:page1mov a,m8 ;-----------------m7,m8 power caje m7,cp_okjmp receive_loopcp_ok:page1mov a,m7mov m3,#0100band a,m3caje #0100b,tonmov a,m5mov m3,#0100band a,m3caje #0100b,toff;mov a,m7;caje #0,cp_ok_exitjmp motcp_ok_exit:page0mov a,m1page1caje #0001b,receive_loopjmp rx_end;-------------------------------mot:page0mov a,m1caje #0,rx_endpage1mov a,#0000bmov p4,amov a,m7caje #0001b,mot_m1caje #0010b,mot_m2caje #0011b,mot_m3mot_next:page1mov m3,#0011bmov a,m5and a,m3caje #0001b,mot_m4caje #0010b,mot_m5caje #0011b,mot_m6jmp mot_n;--------------------------------mot_m1:mov a,m5caje #0010b,m1_addjmp m1_no_addm1_add:mov a,#0001bmov timer_f,#1000bor a,timer_fmov p4,ajmp mot_v1m1_no_add:mov a,#0001bmov p4,ajmp mot_v1;--------------------------------mot_m2:mov a,m5caje #0001b,m2_addjmp m2_no_addm2_add:mov a,#0010bmov timer_f,#0100bor a,timer_fmov p4,ajmp mot_v1m2_no_add:mov a,#0010bmov p4,ajmp mot_n;---------------------------mot_m3:mov a,#0011bmov p4,ajmp mot_v1;--------------------------- mot_m4:mov a,#0100bmov p4,ajmp mot_v1mot_m5:mov a,#1000bmov p4,ajmp mot_nmot_m6:mov a,#1100bmov p4,ajmp mot_v1mot_v1:page1mov a,m5mov m3,#1000band a,m3caje #1000b,jmp_spk_s page0mov a,m0caje #5,rx_start;caje #5,rx_start_wmov m0,#5stop2jmp rx_startjmp rx_start_Wmot_n:page1mov a,m5mov m3,#1000band a,m3caje #1000b,jmp_spk_spage0mov a,m0caje #8,rx_start;caje #8,rx_start_Wstop2mov m0,#8jmp rx_start;jmp rx_start_Wjmp_spk_s:stop2page0mov m0,#4jmp rx_start;-------------------------------tspk:stop2page0mov a,m1caje #0,rx_endpl_spk:play2 h1.wavspk_w:; cjp spk_w; call2 ply_tailpage0mov m0,#3page1mov a,m15caje #0,rx_startjmp rx_start_wton:stop2page0mov m1,#0001bmov m0,#0001bjmp rx_starttoff:stop2page0mov m1,#0mov m4,#0mov m0,#0mov a,#0000bmov p3,amov p2,amov p4,aend ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; udchk ;;;;;;;;;;;; udchk:page0mov timer,#2rsttfmov m10,#0mov m11,#0mov m8,#0udchk_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,udchk_cntmov m3,#0001bnopnopnopmov a,p2and a,m3caje #0,udchk_okjmp udchk_loopudchk_cnt:rsttfmov a,m10add a,#1mov m10,acaje #0,udchk_cnt@jmp udchk_loopudchk_cnt@:mov a,m11add a,#1mov m11,acaje #3,udchk_endjmp udchk_loopudchk_end:stop2mov m0,#3mov m8,#0000bretudchk_ok:mov m8,#0001bret;**************************************cl_128:page0mov m10,#0mov m11,#0cl_loop:mov a,m10add a,#1mov m10,acaje #5,cl_cntjmp cl_loopcl_cnt:mov m10,#0mov a,m11mov m11,acaje #2,cl_okjmp cl_loopcl_ok:page1ret;*******************************clr_ram:mov m15,#0mov m14,#0mov m13,#0mov m12,#0mov m11,#0mov m10,#0mov m9,#0mov m8,#0mov m7,#0mov m6,#0mov m5,#0mov m4,#0mov m3,#0mov m2,#0mov m1,#0mov m3,#0ret;@@@@@@####################### voice2 start voice2:page0mov vo_temp,#0010bmov a,statusand a,vo_tempcaje #0010b,voice_retpage0mov a,m0caje #0,for_tailcaje #1,for_headcaje #2,for_startcaje #3,for_idlecaje #4,for_spkcaje #5,for_straightcaje #8,for_idle@jmp voice_retfor_head:stop2mov m0,#2mov m15,#2retfor_tail:mov m15,#1retfor_start:play2 wstart.wavmov m0,#3mov m15,#2retfor_idle:play2 widle.wavmov m0,#3mov m15,#2retfor_idle@:play2 widle.wavmov m0,#8mov m15,#3retfor_straight:play2 wstraight.wavmov m0,#5mov m15,#3retfor_spk:play2 h1.wavh1_wait:mov timer_f,#0010band a,timer_fcaje #0010b,h1_waitmov a,m1caje #1,spk_idlejmp spk_tailspk_idle:mov m0,#3mov m15,#3retspk_tail:mov m0,#0mov m15,#2voice_ret:ret;------------------------;d_4ms:mov timer,#3 ;0----->.85ms 1---->1.7ms 2----->3.4ms 3----->6.8ms rsttfd_4ms_wait:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,d_4ms_exitjmp d_4ms_waitd_4ms_exit:ret;===========================rx_delay:page0mov m10,#0mov m11,#0mov timer,#3rsttfrx_delay_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,rx_delay_cntjmp rx_delay_looprx_delay_cnt:rsttfmov a,m10add a,#1mov m10,acaje#0,rx_delay_incjmp rx_delay_looprx_delay_inc:mov a,m11add a,#1mov m11,acaje#2,rx_delay_retjmp rx_delay_looprx_delay_ret:ret;-------------------------------------------delay:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopret;-------------------------------rx_start_w----------rx_start_w:page0mov m10,#0mov m11,#0mov m9,#0mov timer,#2rsttfrx_w_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje timer_f,rx_w_cntmov m3,#0001bmov a,p2and a,m3caje #0,rx_startjmp rx_w_looprx_w_cnt:rsttfmov a,m10incamov m10,acaje #0,rx_w_cnt@jmp rx_w_looprx_w_cnt@:mov a,m11incamov m11,acaje #3,rx_w_endjmp rx_w_looprx_w_end:mov m0,#3mov a,#0000bmov p3,amov p2,amov a,m1caje #0001b,rx_start_initpage0mov m5,#0jmp rx_endtest:mov a,#1111bmov p3,acall cl_128call cl_128mov a,#0000bmov p3,acall d_4mscall d_4msjmp test。
义隆单片机和MCS—51单片机的区别
义隆单片机的汇编语言和MCS-51单片机很相似,但两者是完全不停体系结构。
我总结的,首先从堆栈结构去看。
MCS-51单片机堆栈开辟在RAM空间,实现要用户根据程序调用情况估算堆栈的使用量,让后定义堆栈指针的栈顶地址,当用户读写操作改变堆栈区数据会导致程序跑飞。
义隆和pic 单片机的堆栈是独立固定的深度,用户无法直接对堆栈区进行读写操作,只有当发生程序调用时,才会有保护现场的地址压入堆栈,所以不会跑飞,但深度还是有限的所以不宜太多嵌套调用函数。
1,义隆单片机内部结构和PIC单片机是一样的,MCS-51单片机的总线结构是冯-诺依曼型,计算机在同一个存储空间取指令和数据,两者不能同时进行;而PIC单片机的总线结构是哈佛结构,指令和数据空间是完全分开的,一个用于指令,一个用于数据,由于可以对程序和数据同时进行访问,所以提高了数据吞吐率。
正因为在PIC单片机中采用了哈佛双总线结构,所以与常见的微控制器不同的一点是:程序和数据总线可以采用不同的宽度。
数据总线都是8位的,但指令总线位数分别位12、14、16位。
2,MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样就实现了单周期指令。
3,PIC单片机的所有寄存器,包括I/O口,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作;而MCS-51单片机需要两个或两个以上的周期才能改变寄存器的内容。
义隆单片机EMC-法宝级的EMC单片机编程技巧集锦2007-03-16 11:44EM78XXX单芯片自从问世以来已经陆续推出十余种不同等级的单芯片,小到8Pin 的78P152,大到100PinOTP的78P860,其汇编语言指令都是一样的,仅有57个,所以反复练习几次就能熟悉指令的用法。
汇编语言用在I/O控制非常容易,也有很高的效率,所以坊间的书籍大部份以讨论控制为主显,显少专门探讨软件技巧的篇幅,其实老手都知道,关于芯片之控制往往用到时再去翻一翻DATABOOK,注意一下TIMING,然后准备一部示波器,三两下就可以搞定。
反倒是算法用的好不好会大大影响产品的稳定度,所以有经验的程序设计师通常都有自己的一套葵花秘笈,所以要提升自己的功力最好的方式除了多练习之外,看看别人的程序也会使你进步很快。
BCD转换成Binary由于EM78XXX是8位的微控器,因此为了节省内存,我们的范例仅以一个BYTE 存放两位BCD数为例,数字的范围在0~99之间,转换后的结果放在ACC,如果您需要更多的位数,相信您在看完之后应该不难自行修改才是。
程序一这个范例程序共花费13个指令CYCLE,需要两个变量空间,执行后会影响到原BCD的内容。
MOV A,BCDMOV TMP,AMOV A,@0x0FAND TMP,ASWAP BCDAND BCD,ABC PSW,0RLC BCD ; *2MOV A,BCDADD TMP,ARLC BCDRLCA BCD ; *8ADD A,TMP说明在程序一中所采用的方式应该算是最多人知道的方式,也是一种最直觉的方法,先将BCD个位数保存起来,因为十位数必须要乘以10,所以利用移位的技巧乘以10再加上个位数,所得的答案放入ACC。
程序二在程序一的缺点,就是在执行程序以后,原本BCD的内容已经在移位的过程中被破坏掉了,为了改善这项缺失,我们换一种方式看看。
下面这个程序,我们企图改善前面的缺失,共花费11个指令CYCLE,仍需要两个变量空间,但是执行后不会破坏原来BCD的内容。