一单片机程序问题

程序如下:
ORG 0000H
LOP: MOV R0,#3
LOOP: MOV P2,#14H
LCALL D10s
MOV P2,11H
LCALL D10s
DJNZ R0,LOOP
MOV P2,#05H
LCALL D10s
MOV P2,#15H
NOKEY: MOV P1,#00H
JZ NOKEY
MOV TEMP,P1
LCALL D100ms
MOV A,P1
CJNE A,TEMP,NOKEY
LJMP LOP
D10s: MOV R3,#100
D100ms: MOV R4,#100
D1ms: MOV R5,#229
DL: NOP
NOP
DJNZ R5,DL
DJNZ R4,D1ms
DJNZ R3,D100ms
RET
END
其中这段程序
NOKEY: MOV P1,#00H
JZ NOKEY
MOV TEMP,P1
LCALL D100ms
MOV A,P1
CJNE A,TEMP,NOKEY
LJMP LOP
大家看看编写有无问题,若有怎么改正

部分程序代码:
#include "C8051F020.h" //包含C8051F020硬件信息的头文件
#include "absacc.h" //包含绝对地址访问信息的头文件
#include"math.h"
sbit LCD_EP=P2^4;
sbit LCD_RW=P2^2;
sbit LCD_RS=P2^0;
#define LCD_Data_BUS_Out P7
#define LCD_Data_BUS_In P7

#define key P5
unsigned char keyval;
int i;
typedef unsigned int uint;
code unsigned char LCD_InitialCode[]=;

unsigned char temp;

void Reset_Sources_Init() //禁止看门
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}

void Port_IO_Init() //交叉开关配置
{

//P74OUT = 0xC0; //p7推挽
P2MDOUT = 0xff; //p2推挽
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能

}

void Oscillator_Init() //振荡器初始化,使用片外晶体振荡器
{
uint i = 0;
OSCXCN = 0x67; //使用片外晶体谐振器,f>6.7MHz
for (i = 0; i < 3000; i++); //Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); //检测外部振荡器是否有效
OSCICN = 0x08; //选择外部振荡器作为系统时钟,禁止内部时钟
}

//定时器1初始化函数,定时器1作为波特率发生器
void Timer_Init()
{
CKCON = 0x10; //C/T1直接使用系统时钟作为时钟源
TCON = 0x40; //C/T1允许
TMOD = 0x20; //C/T1方式2(8位重装填计数)
TL1 = 0xFA; //C/T1波特率115200计数值
TH1 = 0xFA;
}

void Init_Device() // 设备初始化函数,在主程序中调用Init_Device()
{
Reset_Sources_Init(); //复位源初始化
Port_IO_Init(); //端口初始化
Oscillator_Init(); //时钟源初始化
Timer_Init(); //定时器1初始化

}

有东西就发出来分享啊,我就直接写下面了。

ORG 0000H
SJMP MAIN
ORG 0030H

MAIN :
MOV SP,#60H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R2,#00H
MOV R3,#00
MOV R4,#00
MOV B,#00H
MOV 33H,#00H;十位
MOV 34H,#00H;个位
MOV 35H,#00H;高四位
KEYCODE EQU 35H
S0: LCALL PRESSKEY ;长调用有无按键按下

S1: LCALL DISPLAY ;长调用数字处理程序段
LJMP S0 ;返回S0

;******************* 有无按键按下
PRESSKEY:
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,D2
LJMP D5
D2: LCALL DELAY10MS

MOV A,P1
CJNE A,#0F0H,KEYVALUE
LJMP D5
;*********************按键键值判断
KEYVALUE:MOV 33H,#00H
mov 34H,#00H
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H ;ANL与操作
MOV B,A
MOV P1,#0FH
MOV A,P1
ANL A,#0FH ;ANL与操作
ORL A,B ;ORL或操作
MOV KEYCODE,A

MOV R3,#00
D4: MOV A,R3
MOV DPTR,#TABBLE2
MOVC A,@A+DPTR
CJNE A,KEYCODE,D3
MOV A,R3
MOV R2,A
LJMP D5
D3: INC R3
LJMP D4
D5: RET
;***********************************数字处理程序段
DISPLAY:
MOV A,R2
CJNE A,#10,CMP1
CMP1: JC LOOP2
LJMP LOOP3
LOOP2: MOV A, R2
MOV 34H,A
LJMP DISPLAY1

LOOP3: MOV B,#10
DIV AB
MOV 33H,A
MOV A,B
MOV 34H,A
LJMP DISPLAY1
;**********************************************************显示程序段
DISPLAY1:

MOV DPTR,#TABBLE1
MOV A,34H
MOVC A,@A+DPTR
MOV P2,#07FH
MOV P0,A
ACALL DELAY5MS

MOV DPTR,#TABBLE1
MOV A,33H
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
ACALL DELAY5MS
RET ;子程序返回
;*****************************************************
DELAY:
;延时子程序
MOV R5,#100
DELAY0: LCALL DELAY10MS
DJNZ R5,DELAY0
LJMP HUJK

DELAY10MS:MOV R4,#2
DELAY2 : LCALL DELAY5MS
DJNZ R4,DELAY2
LJMP HUJK
DELAY5MS:
MOV R6,#25
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1

HUJK : RET ;子程序返回

;***************************************************
TABBLE1:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,08H
;?******************************************************
TABBLE2:
DB 0EBH,77H,7BH,7DH,0B7H,0BBH,0BDH,0D7H,0DBH,0DDH,7EH,0BEH,0DEH,0EEH,0E7H,0EDH,0FFH
;*****************************************************
END
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-27
肯定有问题啊!JZ 判断的是上面离他最近的累加器,比如A,你这里不知道在干嘛!你先说清你程序的意思,不然谁也不知道怎么改!
第2个回答  2011-06-17
是做什么的啊?
不说清楚没法看!

一个单片机程序问题。
1、0x38的值是56,也就是256-200的结果,说明定时器是200个周期溢出一次,12M晶振是就为200微妙。2、5000一秒,是因为定时时间是200微妙,溢出5000次,两者相乘即为1000000微妙,等于1秒。3、一个机器周期是时钟周期的12倍,所以12M晶振,机器周期是1微妙。

单片机程序跑飞的现象、原因以及解决方法
首先,数组越界或数组溢出是程序跑飞的一个重要原因。当函数内定义的数组元素个数小于实际使用时,例如定义了ucDataBuff[10],却尝试访问第11个元素,就会导致程序运行异常,最终跑飞。解决这一问题的关键在于仔细检查函数中使用的数组,确保其大小与实际需求相符。其次,中断服务程序的缺失也可能引发程序跑飞。

单片机程序出错
1、检测数码管“位”引脚是否有短路:先让“位”值只有一位有效,看看有几位数码管亮,只有一位亮说明没有短路。2、检测程序对数码管“位”的操作指令是否正确:将之前“只让一位亮”时的“位值”与源程序对比,看看是否一致。3、检测程序对“每位点亮的时间”设定是否合理。太短,闪烁不清;太长...

我自己写的一个单片机时钟程序,但是我在调节时间的时候,运行着的时钟...
1、刷新显示放在定时中断中,分割成多个部分,每次中断执行1小部分,就如动态扫描原理 2、延时程序使用刷显示的子程序代替 3、键盘检测程序优化,不要用死等待的程序结构,将键盘处理分成几个部分,主程序 每次扫描只执行其中1部分

单片机运行一段时间后,不按原程序执行怎么回事\/
1 你的软件为编写上的BUG,比如你想实现功能A,但是,因为你的程序写的有问题,例如:算法有问题,有语法上的漏洞,你思考的不全面等等,在某种条件下可以实现功能A,但是当条件有一点改变,导致程序与你执行的不一致。2 单片机硬件受到干扰,例如单片机周围有强电,或者单片机用的继电器,但是电路没处理...

单片机程序编程的问题,如何写一个让其自动运行的代码,比如说缺水了,自 ...
3)动作处理。这一步,就是单片机根据逻辑计算的结果,付诸行动,比如湿度太低了,就打开一个继电器,继电器控制着雾水泵喷雾,然后重复第1-2步,直到发现湿度符合要求了,就停止喷雾。总之,程序就按照这三步的大概逻辑写,烧录完成后,单片机就是自动的一直循环运行。如果楼主是要问具体的一个系统程序...

单片机 ,一个单片机的程序能改吗.
2.单片机编程,一般都用 汇编 和 C语言 外,还可以用机器语言(这个想是没有人用了).(这点不是太懂,见笑,我一般用C语言,用keil编译调试很方便,程序也易读).3.一般单片机都有相应的程序下载工具,这里所说的工具并不复杂,AT89S51系列用SPI下载,STC单片机都用串口下载.这两者单片机的下载工具都可以自己...

求一单片机c语言程序:两个按键控制两个led,按键按住不放led闪烁,松手...
一个按键时程序如下:while(1){ if(key==0)\/\/按键按下 { delayms(20);\/\/延时消抖 if(key==0)\/\/再次判断按键是否按下 { while(key==0)\/\/按键没有抬起 { led=!led; delayms(200);}\/\/LED闪烁 } } else led=0;}

单片机程序菜鸟问题
最后那一句就是取出最高位的进位的,也即最高位第七位。再教你一个小知识,两个数相加,结果最多只比原来数字多一位,并且多出的这位数字不会超过1,比如9+9,最多只是18,即十位是1,不会是2到9的,在比如说99+99=198,嘿嘿。懂了吧 虽然我不用汇编写程序,但是看懂还是很容易的 ...

下述单片机程序有个警告,该如何去掉,请教高手解释一下。
在编写单片机程序时,如果遇到警告提示函数没有返回值,这通常意味着所调用的函数在定义时并未指定返回类型。对于这个问题,解决方法较为直接,即在函数定义中添加返回类型。针对您提到的函数 changedata(uchar *song,uchar *diao,uchar *jie),只需修改为 void changedata(uchar *song,uchar *diao,uchar...

相似回答