打印

帮忙看看我的汇编程序

[复制链接]
5005|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子write_cai|  楼主 | 2011-5-28 08:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 电子write_cai 于 2011-5-28 08:51 编辑

第一次用汇编,别笑话我啊,请指教




//××××××××××call程序怎么循环不到time里面?××××××××××         

call     START
time:
             movia    200
             movar    Time_count
loop:
             decrsz   Time_count,1 //判断Time_count=0,if=0,skip跳到第二行
             goto     loop
             movar    Time_count
loop1:       decrsz   Time_count,1
             goto     loop1
             return
START:
             movia    0x0c                //给A_pin配置0 0 0 0 1 1 0 0 B
             movar    PORTA
             movia    0xE0                //给B脚配置1 1 1 0 0 0 0 0 B
             movar    PORTB
             call     time
             movia    0xD0                //给B脚配置1 1 0 1 0 0 0 0 B
             movar    PORTB
             call     time
             movia    0xB0               //给B脚配置1 0 1 1 0 0 0 0 B
             movar    PORTB
             call     time
             movia    0x70               //给B脚配置0 1 1 1 0 0 0 0 B
             movar    PORTB
             call     time
             movia    0x00              //给A脚配置 0 0 0 0 0 0 0 0 B ,端口A清零。
             movar    PORTA
             return

相关帖子

沙发
电子write_cai|  楼主 | 2011-5-28 08:15 | 只看该作者
就是一个简单的流水灯,发现灯没有时间间隔,我要他延时,是不是延时太短了?
看看每个call 都能到time下运行吗 1# 电子write_cai

使用特权

评论回复
板凳
电子write_cai|  楼主 | 2011-5-28 09:12 | 只看该作者
是不是太简单了? 简单也说两句啊。。。

使用特权

评论回复
地板
lyjian| | 2011-5-28 09:16 | 只看该作者
延时太短了

使用特权

评论回复
5
delin17| | 2011-5-28 09:18 | 只看该作者
应该是时间太短,用示波器抓抓波形,你就知道为什么了

使用特权

评论回复
6
delin17| | 2011-5-28 09:18 | 只看该作者
或者单步跑

使用特权

评论回复
7
lyjian| | 2011-5-28 09:32 | 只看该作者
延时才一千二百来个指令周期,如果一个指令周期是1us的话,就才1.2ms,当然看不出来了。

使用特权

评论回复
8
电子write_cai|  楼主 | 2011-5-28 09:44 | 只看该作者
延时才一千二百来个指令周期,如果一个指令周期是1us的话,就才1.2ms,当然看不出来了。
lyjian 发表于 2011-5-28 09:32

这个时间怎么算的啊 ? 不是200×200?

使用特权

评论回复
9
lyjian| | 2011-5-28 09:56 | 只看该作者
(1+2)*200*2
你延时中的LOOP和LOOP1是完全独立没关系的两段延时,LOOP和LOOP1都是只跑了200次循环,而不是200*200次。

使用特权

评论回复
10
电子write_cai|  楼主 | 2011-5-28 10:35 | 只看该作者
本帖最后由 电子write_cai 于 2011-5-28 10:39 编辑

哦,明白了,和C混淆了,那怎么时间掩饰长点?我不会再加goto loop2吧?这个也不会多长时间。 9# lyjian

使用特权

评论回复
11
shen781219| | 2011-5-28 16:49 | 只看该作者
学习

使用特权

评论回复
12
lyjian| | 2011-5-28 16:57 | 只看该作者
增加Time_count2
loop1:       decrsz   Time_count,1
             goto     loop1
改成
         decrsz   Time_count2,1
             goto     loop
就长很多了

使用特权

评论回复
13
电子write_cai|  楼主 | 2011-5-30 08:11 | 只看该作者
增加Time_count2
loop1:       decrsz   Time_count,1
             goto     loop1
改成
         decrsz   Time_count2,1
             goto     loop
就长很多了
lyjian 发表于 2011-5-28 16:57
请教下,8PS52的中断怎么应用? 一定要在 ORG 008 下面执行  ? 能举个例子吗? RETFIE后的地址又跑到哪去了?

使用特权

评论回复
14
lyjian| | 2011-5-30 09:40 | 只看该作者
008是中断向量,和3FF是复位向量一样的意思(一复位PC的值就是3FF,CPU第一条执行的指令就从3FF开始),中断服务程序的第一条指令就是008地址的指令,你可以在008地址放一条跳转指令跳到其他地址执行你的中断服务程序。
中断前的地址在那里,RETFIE后的地址就会跑回到那去。

使用特权

评论回复
15
电子write_cai|  楼主 | 2011-5-30 09:49 | 只看该作者
008是中断向量,和3FF是复位向量一样的意思(一复位PC的值就是3FF,CPU第一条执行的指令就从3FF开始),中断服务程序的第一条指令就是008地址的指令,你可以在008地址放一条跳转指令跳到其他地址执行你的中断服务程 ...
lyjian 发表于 2011-5-30 09:40

首先谢谢你能一直回答我的问题,您能贴一个你以前写的一段中断程序吗?这样我可以一目了然了。

使用特权

评论回复
16
电子write_cai|  楼主 | 2011-5-30 09:53 | 只看该作者
ORG      00H

             ORG      008H
             bcr      intflag,0
             movia    250
             movar    TMR0
             movia    0x1F
             movar    inten
             retfie                     //返回后地址在哪?

             clrr     fsr
             clrr     TMR0
             clrr     STATUS              // 给status状态清零,默认为00011100b;
             clrr     WUCON               // pb有输入中断/唤醒的功能,位1为使能,反之是不能。
             clrr     PDCON               // pb0:2,pa0:3内部若下拉disable;(pb4:7没有弱下拉功能);
             clrr     ODCON               // pb内部开漏disable;pa无开漏;
             clrr     PHCON               // pb内部弱上拉disable; (pb3只能作为输入);
             clrr     INTEN               //中断使能位清零
             clrr     INTFLAG             //中断标志位清零
             clrr     PCHBUF              //Program_count 高两位清零
             clrwdt                       //看门口定时器清零
             movia    D0H                 //DFH->ACC //OPTION配置;
             OPTION
             goto     START
START:
             movia    00H                 //给端口A/B设置电平状态;
             movar    PORTA
             movia    FCH
             movar    PORTB
             movia    00H                 //给端口A/B配置为输入/输出模式;
             IOST     PORTA
             movia    08H
             IOST     PORTB
             movia    81H                 //给中断使能位设置为1 0 0 0 0 0 0 1 B// GIE,T0IE置一。
             movar    inten
             movia    1FH                //power control register   lvdte,wdte,eis清零;
             movar    pcon
             goto     main

main:
//点亮第一排两灯

             movia    0x0c                //给A_pin配置0 0 0 0 1 1 0 0 B
             movar    PORTA
             movia    0xE0                //给B脚配置1 1 1 0 0 0 0 0 B
             movar    PORTB
             movia    250
             movar    TMR0                //给TMR0写数据后,定时器的分频器数被清零;PS2:PS0  0 0 0
             movia    D0H
             OPTION
loop:
             btrss    intflag,0
             goto     loop


我这个loop里面一直检测intflag的中断溢出标志位,如果为1,那么应该去008h里面执行?

使用特权

评论回复
17
lyjian| | 2011-5-30 11:21 | 只看该作者
建议你找本计算机原理或MCS51原理基础的书看看,先把中断的概念搞清楚再来讨论,要不然太累了。

使用特权

评论回复
18
电子write_cai|  楼主 | 2011-5-30 12:22 | 只看该作者
建议你找本计算机原理或MCS51原理基础的书看看,先把中断的概念搞清楚再来讨论,要不然太累了。
lyjian 发表于 2011-5-30 11:21

我应该算理解中断的意思。要是汇编换作C语言我就懂了。
C语言专门有个interrupt 程序入口(应该就如汇编中 ORG 008H),只要你在主程序中设置好相关寄存器的位,我就拿51MCU的定时器1为:
init_void()
{
    TMOD=0x10;//选择定时器1;  
    TH1=(65535-10000)/256;
    TH0=(65535-10000)%256;
    EA=1;     //开启总中断;           //这个应该是8ps53中的GIE, bsr inten,7;给GIE置一
    ET1=1;     //开启定时器1中断允许位; //这个应该是8ps53中的T0IE,bsr inten,0;给T0IE置一
    TR1=1;     //启动定时器1;          //
}
*****
***
***;
//**********中断入口**********// 时间溢出就会进中断;
void time1()interrupt 1 using 0  // 这个是相当于汇编中的   ORG 008?
{
   TH1=(65535-10000)/256;
   TH0=(65535-10000)%256;
   *******
   *****
}
以上是时间溢出才会有中断;
还有其他的 如外部中断等。  中断就是临时去处理一件事,然后又回到事发时的地址再继续执行以下指令;
这个算不算我理解中断了?

使用特权

评论回复
19
lyjian| | 2011-5-30 12:36 | 只看该作者
既然理解那还问“返回后地址在哪?”这种问题?

使用特权

评论回复
20
电子write_cai|  楼主 | 2011-5-30 12:42 | 只看该作者
既然理解那还问“返回后地址在哪?”这种问题?
lyjian 发表于 2011-5-30 12:36
由于我不太懂汇编中ORG 008H
仿真的时候它直接从 org00h  ---(中间有01--07的间隔时间PC累加到008H)再运行到008H了。 是不是硬件仿真看不出中断效果呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:只要你是拼多多新用户就可以加我微信,微信号772880135验证您是新用户后立刻微信转你20元。欢迎朋友加我微信,多年21ic用户,诚信为本!

157

主题

1535

帖子

3

粉丝