下面是一个独立键盘控制LED灯移位的程序,LED是P2口,按键K1是P31口的。
#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2
sbit K1=P3^1;
void Delay10ms( );//延时10ms
void main(void)
{
unsigned int i,j;
j=0xfe; //1111_1110
while(1)
{
GPIO_LED=j;
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K1==0)
{
j=_cror_(j,1);
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
}
}
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
问题是这里
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
i的赋值写在最后,而开始这个循环时i<50已经用了i,之前也没有赋值给i,这样也行????那开始这个循环时i的值是多少?PS:这是教程的一条例题来的,在单片机上实验过是没问题的??
请问单片机和电脑这方面是否有不同?我刚才用VC6.0写了以下程序:
#include
void main()
{ int a,b;
b=a*a;
a=3;
printf("%d",b);}
但出来的值不是9,也 不是0.
你理解错了,单片机那个之所以可以,是因为他外面有个大循环,你这一次性的不能这样类比。
电脑上 初始不清零,所以变量的值不确定。
51单片机汇编 排序问题 请各位赐教
;题目要求有三个地址,需要使用三个地址指针,比较麻烦。程序如下:MOV 50H, #51H ;两个个数计数器 MOV 70H, #71H ;兼当地址指针,目标地址,MOV R0, #20H ;源地址 MOV R2, #30 ;数据个数 LOOP:MOV A, @R0 INC R0 JB ACC.7, FU ...
51单片机汇编程序从1到999累计数 程序写到一半不知道该怎么往下写了...
程序显然是不行的,INC不会影响C标志。给你一个参考程序:入口R2R3,出口R2R3 ADD999:MOV A,R3 ADD A,#1 MOV R3,A MOV A,R2 ADDC A,#0 MOV R2,A CLR C MOV A,R3 SUBB A,#0E8H ;大于等于1000则赋值0 MOV A,R2 SUBB A,#03H JC ADDRT MOV R2,#0 MOV R3,#0 ADDRT:RET...
51单片机 EEPROM 的 一些顺序问题,求大神
原来的程序,用tmp<<=1空出低位,在通过条件判断决定低位是否用tmp|=0x0置1。你改动的程序,先通过条件判断决定低位是否用tmp|=0x0置1,如果条件成立会覆盖低位,然后用tmp<<=1左移1位,相当于乘2,当收的1位没收到,到这你再给乘2,当然不行了。
51单片机 定时器赋值 最后面的N-- 是什么意思 作用是什么
那个n变量是用计T0定时器中断次数的,而前面的n=0,是声明变量n并赋初始值。注意,这是T0定时器的中断函数,是写在主程序前面了。T0每中断一次,n--为n减1。下面肯定还有程序(可能在主程序中或子程序中)要用到这个变量,估计是控制一个节拍长短的,所以应该有程序给n赋值,而且是根据每一个节拍...
51单片机 C语言 串口数组赋值问题
贴上来的程序部分,修改如下:include<reg52.h> include<stdio.h> \/\/打印到串口函数 define uchar unsigned char define uint unsigned int uchar date_zi[4][11];\/\/存放接收到的数据 uint i_index=0;\/\/接收到的字符个数 uint i=0;\/\/i字符用于循环 unsigned int xia = 0;\/\/用于保存到...
51单片机矩阵键盘检测方面的问题
第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了。第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是...
51单片机 先后顺序判断 程序编写问题
两个状态寄存器,一个保存上一状态StatusLast,一个记录当前状态StatusCurrent;if((StatusLast==Middle&&StatusCurrent==Low)||(StatusLast==Low&&StatusCurrent==High)){报警}
51单片机程序问题
bit只表示0或1,非零数就表示1,举个例子定义个位变量a,bit a,无论给a赋值什么值,如123,0xFE,07892 ,只有这个数是非零数,那么a的值到最后都是1 这里的意思是 ,如果括号里的与完后的值是0X80(意味着dataport的最高位是1的时候),那么这个数是非零数,就返回1;如果与完后是0x00(...
51单片机C51语言的几个问题。
问题1:sbit a = PSW^2;这不是一条简单的赋值语句,a也不是什么变量,而是把他和PSW的第二位关联起来,相当于a是它的别名一样,如果a变化的话PSW的第二位会变,PSW的第二位变化时a当然也会变(假设你叫李宇春,现在这条语句就是说把春哥也变成你的名字),其实是一个东西,这么做的原因是,...
51单片机延时程序问题
至于100ms、 200ms、 1s等等方法类似,只是调整相应的初值。多设置几次循环就行。程序代码如下:DELAY:MOV R1,#0AH ;赋值R1为10次DELAY1:MOV R2,#C8H ;赋值R2为200次DELAY2:DJNZ R2,$ ;R2自减到0,不到0继续等待DJNZ R1,DELAY1 ;R2减到0后R1自减1,重新给R2赋初值后...