pbabca pbabca
关注数: 3 粉丝数: 25 发帖数: 1,426 关注贴吧数: 20
大神来看看这段32位数加1汇编程序 继续链接问题 http://tieba.baidu.com/p/3342332367 以下是我自己编写的汇编程序,求各位指点。 P1,P2口的端口位置我进行了一些调整,由于我的数组一个数需要占4字节,所以我改变了一下输入端口的位置(2个8位端口使用了中间的12个端口,其余端口我特别的接地)。使得P1,P2口输入值可以直接装入指针DPTR。 P1 P2 00XXXXXX XXXXXX00, 这样用端口接入就完成了2位左移(由于是4字节数,数组加1需要指针地址+4,因而左移2位) 本人写的代码,有问题敬请指正 INC32INT: //这是主要程序 MOVDPH,P1 MOV DPL,P2 //装入数组地址指针 MOVX A,@DPTR //从地址装入31-24位 MOV R4,A INC DPTR MOVX A,@DPTR //从地址装入23-16位 MOV R5,A INC DPTR MOVX A,@DPTR //从地址装入15-8位 MOV R6,A INC DPTR MOVX A,@DPTR //从地址装入7-0位 INC A//7-0位加1 MOV R7,A //自加后7-0位装入R7,使得R4,R5,R6,R7组成一个32位数 JC INC16 //检查是否进位,进位则跳转搭配8-15位加1 MOV A,R7 //此时DPTR在7-0位的地址 MOVX @DPTR,A //外部RAM装入7-0位 MOV DPH,P1 //重装地址指针到31-24位 MOV DPL,P2 MOV A,R4 MOVX @DPTR,A //31-24 MOV A,R5 INC DPTR MOVX@DPTR,A //23-16 MOV A,R6 INC DPTR MOVX@DPTR,A //15-8 INC16: //8-15位数加1 CLR C INC R6 JC INC24 //检查是否进位。进位则跳转到16-23位 RET INC24: //16-23位数加1 CLR C INCR5 JC INC32 //检查是否进位。进位则跳转到24-31位 RET INC32: //24-31位数加1 CLR C INC R4 RET //32位数还溢出?HOW TERRIBLE!!!! 另外问下uvision如何C语言中嵌入汇编
C8051程序问题求解(时钟) 单片机是C8051F060,目的是想通过定时器T0中断来记秒,22.1184MHZ,48分频,累计8次(num)定时器中断后second++。 但是实际测试中发现:second只能从0到1,当second=1后,定时器第二次中断时,中断计数num和second均会被清零,然后再到1又被清零,求解释。 定时器初值可能不大准,但是这只会影响定时器时长。 #include <c8051F060.h> #include <intrins.h> #include <absacc.h> #include <stdlib.h> //标准函数 #include <stdio.h> //I/O口函数 //==========================================函数与变量声明定义==================== void SYSCLK_Init(void); void PORT_Init(void); void T0CLK_Init(void); volatile unsigned int n=0,m=0,second=0,minute=0,num=0,temp_second=0,temp_minute=0; unsigned int code number1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xc6,0x89};//正向LED unsigned int code number2[]={0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82,0xF0,0x89};//反向LED unsigned int code ledselect[]={ 0xE0,0xD0,0xB0,0x70}; void main() { unsigned int n1=(int)minute/10,n2=(int)minute%10,n3=(int)second/10,n4=(int)second%10; SYSCLK_Init(); PORT_Init(); T0CLK_Init(); P3=0xFF; while(1) { if(m==0) { P5=number1[n1]; P3=ledselect[m]; } m++; //P3=0xFF; if(m==1) { P5=number1[n2]; P3=ledselect[m]; } m++; //P3=0xFF; if(m=2) { P5=number2[n3]; P3=ledselect[m]; } m++; //P3=0xFF; if(m==3) { P5=number2[n4]; P3=ledselect[m]; m=0; } } } //===========================设置外部时钟晶振============================ void SYSCLK_Init(void) { unsigned int i; char data SFRPAGE_SAVE=SFRPAGE;//保存当前SFR页面 SFRPAGE=CONFIG_PAGE;//SFR转到系统与接口设置页面 OSCXCN=0x67;//外部振荡器 b01100111,外部晶体震荡&并且频率在10MHZ以上 for(i=0;i<256;i++); while(!(OSCXCN&0x80));//当外部晶振稳定即OSCXCN第7位为1时 CLKSEL=0x01;//设置外部晶振为SYSCLK即CLKSEL第1为1 OSCICN=0x00;//禁止内部振荡器 SFRPAGE=SFRPAGE_SAVE; } //============================设置端口============================ void PORT_Init() { char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = CONFIG_PAGE; // set SFR page before writing to // registers on this page XBR2 = 0x40; // 交叉开关使能 P4MDOUT = 0xff; P5MDOUT = 0xff;//推挽输出 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page } //========================秒定时器初始化============================ void T0CLK_Init(void) { char data SFRPAGE_SAVE=SFRPAGE; SFRPAGE=TIMER01_PAGE; TMOD=0x01;//设置定时器工作方式,T0、1与/INT0、1无关,定时器功能,T1为13位T0为16位定时器 CKCON=0x02;//时钟控制,使用分频时钟,系统时钟/48 TH0=(65535-2048)/256;//定时初值高位 TL0=(65535-2048)%256;//定时初值低位 EA=1;//全局中断开 ET0=1;//定时器T0中断开 TR0=1;//启动定时器T0 SFRPAGE=SFRPAGE_SAVE; } //========================定时器中断============ void T0_time() interrupt 1 { char data SFRPAGE_SAVE=SFRPAGE; SFRPAGE=TIMER01_PAGE; TH0=(65535-2048)/256;//重装定时初值高位 TL0=(65535-2048)%256;//重装定时初值低位 num++;//中断次数 if(num==8) { num=0; temp_second++; second=temp_second; } if(second==60) { second=0; temp_minute++; minute=temp_minute; } }
刚刚手动单刷完成遗迹不灭和远古1任务,讲下经验 先说下我加点是主暗辅光的 1图风骑士不解释 乱殴,黑洞、冰墙、驱散、光电鳗。注意不要跟风骑士一条线上。在侧面放光电鳗比较好,风骑士感觉是那些骑士里自身攻击最强的,我打得好无伤秒了他,打得不好要伤半血 2图守护骑士会卡位最好,图右下方边缘地形上有个小突起,能挡路。不会的话在守护上下移动蓄气光电鳗,注意颜色。宁可挨打也不要放错着,用驱散给守护骑士减速。 3图冰骑士,黑洞、虚无、黑猫乱殴不解释,没秒掉就转圈放光电鳗(光电鳗神器啊。。。) 4图火骑士关键!!!没自信的可以考虑堆火抗:离火焰影项坠(熔岩穴任务奖励)、王之守护火、星纹短靴(所有属性+5)、苍穹之主护肩(所有属性+6)、诺斯马尔:破曦布甲长袍(火抗+7)、卡尼娜那有火抗+30药剂,基本上火骑士打你和爆炸打你就不疼了。 进去黑洞,看图标到3-4的时候放冰墙,然后黑猫跟光电鳗砸,注意保持攻击以及攻击间隔,偶尔被炸一下也无所谓。但是如果你间隔一会没攻击他会变大!!此时只能用冰墙!!!其他一切攻击伤害都会传递给你自己,我要死也是死在火的这里:刚放个光电鳗,火突然变大,打中它我就死了。靠冰墙磨,注意使用魔法秀加快冷却。适当的使用驱散减速和舒露露嘲讽能减少不少压力,火骑士变大跑得实在太快了,不要吝啬吃药。 5图 进去等2秒 放黑洞 虚无之球 然后黑猫虐,注意跑位,平时保持背对骑士,放黑猫瞬间再转身,保持骑士们在你的一边(2边就没法躲避闪光了)。当然智力高能秒是最好的。 BOSS,带好大血(注意要是CD不同的)蓄气黑洞进去往下前方走一些放,然后驱散,接着走开点放觉醒,不要站在跟BOSS一条线上。觉醒一定要注意控制大小,轻点按键左右移动光圈缩小范围,保持对BOSS的覆盖。通常情况下能秒掉(60级觉醒满 14级元素点燃 15级远古记忆,驱散满,外加+10元素谐音)。有时BOSS中途会发狂砸3大锤,拼命吃血扛住吧(药必须有不同CD,否则没法顶),然后就跑位打了,最好拉开距离用黑猫,注意用驱散和冰墙。还有一定要听声音,听到“在我面前给我跪下”,就要做好准备跳了。
1 下一页