我在keil里面写了这样的程序MOV R0,#1然后运行,为什么没有结果

我在keil里面写了这样的程序MOV R0,#1然后运行,为什么没有结果,第1张

PSW=AAH=101 01 010B,其中的RS1,RS0=01,指向了1区的工作寄存器,这时的R0是08H单元的,而先由MOV @R0,#12H,(R0=8)即先给08H单元送数12H,所以,执行MOV PSW,#0AAH以后,R0就指向08H单元了,所以,运行程序后的R0=12H。当去掉这条语句,R0就是0区的,就是00H单元的R0,所以是8。

不过,有点不明白,你写的这几条语句有什么用啊,就是为了胡乱写几条指令玩一下,让单片机执行吗,可是执行后的结果你又分析不明白,那为什么还要写这几条指令呢。

#include<reg52h>

#define uchar unsigned char

#define duan P0 //共阴数码管的阳极端口

sbit wei1=P2^4; //共阴数码管的阳极端口,我的是四位的,下面语句中把1,2关了,只用到了3,4。

sbit wei2=P2^5;

sbit wei3=P2^6;

sbit wei4=P2^7;

uchar code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0~9的十六进制码

void delay(uchar xms) //软件延时

{

int i,j;

for(i=xms;i>0;i--)

for(j=125;j>0;j--);

}

void display(int tens,ones) //用来显示数字的函数,显示此时的十位,个位。

{

int i,j;

for(i=2;i>0;i--)//通过改变i和j的值,可以改变计时时间。

for(j=50;j>0;j--)

{

wei3=1;//扫描原理。

wei4=0;

duan=num[tens];

delay(5);

wei3=0;

wei4=1;

duan=num[ones];

delay(5);

}

}

void main()

{

int onesp=0,tensp=0;//定义ones place和tens place。

wei1=0;

wei2=0;

while(1)

{

for(tensp=9;tensp>=0;tensp--)

{

for(onesp=9;onesp>=0;onesp--)

{

display(tensp,onesp);//调用函数显示此时的数字。

}

}

}

}

这个程序测试可用,从99计数到00。只用了比较简单知识,不涉及定时器和系统中断。不懂可以追问。

1 新建工程,这时会让你选择要不要加入KEIL的启动代码,随便选(最好选是)

2 新建新文件,保存为xxasm或xxa51

3 把刚才的文件加入到工程

4 如果你开始时选否,即未加入启动代码,那么启动跳转、堆栈SP的初始化、

内存初始化、重入栈初始化、标准51寄存器定义、段定位等都要自己弄,估计你搞

不定,但是这样你可以自由写

5 如果你选的是加入KEIL的启动文件,那么这些你就不必写,都好了,但是问题是这个启动文件

最初的目的是针对C51程序写的,因为这个启动文件的最后一句是去调用main()函数段,所以你

要么把这个main()函数段的申明和调用都去掉,让他去调用你自己 的函数段,要么你就干脆写个他想调用的那个main函数段段名,让他以为 就是main函数,让他调用好了

6 再简单一点,你也别新建什么文件,直接删掉它的最后一句main调用和main函数段申明,就在删掉 的那里写自己的程序

7 再再简单一点,启动文件也别要了,直接新建asm文件,从地址0开始写 ORG 0000H,如果你的程序足够简单, 也不一定要什么函数段、不一定要修改SP、更不必关心什么重入呀、初始化代码呀

8 如果你问的不是51汇编,那就不知道了

500HZ方波周期是2ms,只需定时器1ms,将管脚状态取反一次就其可,若按下按键,改为定时500us即可,程序如下:

#include <reg51h>

sbit key=P1^0;

void main()

{

unsigned int n=1000;

TMOD=0X01;//定时器0工作方式1

TH0=(65536-N)/256;//定时器初值,先是定时1000US

TL0=(65536-N)%256;

ET0=1;//开定时器0中断

EA=1;//开总中断

TR0=1;//启动定时器0

while(1)

{

if(key==0)//判断按键是否按下

{

delay_ms(20);//延时消抖动

if(key==0)n=500;

}

}

}

中断程序如下:

void timer0() interrupt 1

{

TH0=(65536-N)/256;

TL0=(65536-N)%256;

P2^0=~P2^0;//P20输出方波

}

延时子程序略

以上就是关于我在keil里面写了这样的程序MOV R0,#1然后运行,为什么没有结果全部的内容,包括:我在keil里面写了这样的程序MOV R0,#1然后运行,为什么没有结果、keil写程序 单片机二位数码管显示倒计时、keil里面怎么建立汇编并写出详细步骤。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9656610.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存