导航:首页 > 操作系统 > 单片机pind

单片机pind

发布时间:2022-08-27 11:23:26

‘壹’ 谁能帮我解释一下这个avr单片机的程序

汇编指令SBI 0x18,7
相当于PORTB.7=1
汇编指令CBI 0x18,7
相当于PORTB.7=0

头文件里应该有类似定义: .equ PORTB=0x18

0x10表示PIND,0x11表示DDRD,0x12表示PORTD,
0x13表示PINC,0x14表示DDRC,0x15表示PORTC,
0x16表示PINB,0x17表示DDRB,0x18表示PORTB,
0x19表示PINA,0x1A表示DDRA,0x1B表示PORTA。

AVR的IO有三个寄存器,DDRX,PORTX,PINX。
DDRX 方向,DDRX=1,输出;DDRX=0,输入。
PORTX 分两种情况
如果DDR=1,即在输出状态的话,那么通过设置PORTX的值改变IO端口的电平
如果DDR=0,即在输入状态的话,那么PORT=1则使能上拉电阻,否则不使能。
PINX 此寄存器表示了该端口的实际电平,所以读IO口的话,应该读PINX,而不是PORTX。

这样就好理解了吧???

你判断的是按键按下的时间长度?

这个程序应该是这样的,不知道我理解的对不对?

进入这个函数,如果没按键按下,返回0,退出。
asm("CBI 0x11, 4"); //PORTD.4设置为输入
key_value=0;
if((PIND&0x10)!=0&&(PIND&0x10)!=0)return 0;//如果PORTD.4(KEY1)=1,返回0。

如果有按键按下,执行下面的程序。
2个 while(delay) 延时,防抖动。

进入 while(1) 循环,我觉得最后一个 return 0; 应该是没机会执行到的。

然后switch判断status的值,刚开始是0.然后逐渐增加(每次延时40个delay),到16后,返回,退出。
当status==0时,判断按键是否按下,如果按下,PORTB.7置0,key_value+=0x80(key_value的第7位置1)
status==1,延时40个delay后,PORTB.7置1(这个估计是指示灯)。
status==2,延时40个delay后,判断按键是否按下,如果按下PORTB.7置0,key_value+=0x40(key_value的第6位置1)
status==1,延时40个delay后,PORTB.7置1。
就这样重复,直到status==16,只是key_value置1的位置不同。
最后,到16时,判断status的值,如果大于32,返回0,其他返回status的值。

‘贰’ 51单片机IO口能做实参传递吗

可以的,但是一般性不这么用,不是所有的编译器都支持sfr(本质是地址)的传递。

你可以使用这样的东西:(这是我写的AVR类库)

voidSETB(PORTport,unsignedcharbit);//其他的源代码举一反三吧

记得定义:

#definePORTenumPORT
//方便输入
#definesetbSETB
#defineclrbCLRB
#definegetbGETB
PORT{
PA,
PB,
PC,
PD
};

Port和bit的本质都是寄存器,一个是byte寻址一个是bit寻址而已,千万不要以为bit寻址就一定快,往往是byte要快一些。

附上源代码:

gpio.h

#ifndefAVR_GPIO_H
#defineAVR_GPIO_H
#definePORTenumPORT
//方便输入
#definesetbSETB
#defineclrbCLRB
#definegetbGETB
PORT{
//PA,
PB,
PC,
PD
};
externvoidSETB(PORTport,unsignedcharbit);
//相应端口置1,并设置为输出
externvoidCLRB(PORTport,unsignedcharbit);
//相应端口置0,并设置为输出
externunsignedcharGETB(PORTport,unsignedcharbit);
//相应端口设置为输入并读取,返回0xff(1)与0x00(0),异常返回0xf0
externvoidSETD(PORTport,unsignedcharbit);
//相应端口设置为输出
externvoidCLRD(PORTport,unsignedcharbit);
//相应端口设置为输入
#endif

gpio.c

#include"inc.h"

voidSETB(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(1<<bit);
//PORTA|=(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
PORTB|=(1<<bit);
break;
casePC:
DDRC|=(1<<bit);
PORTC|=(1<<bit);
break;
casePD:
DDRD|=(1<<bit);
PORTD|=(1<<bit);
break;
}
}
}

voidCLRB(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA&=(1<<bit);
//PORTA&=(0xff-(1<<bit));
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
PORTB&=(0xff-(1<<bit));
break;
casePC:
DDRC|=(1<<bit);
PORTC&=(0xff-(1<<bit));
break;
casePD:
DDRD|=(1<<bit);
PORTD&=(0xff-(1<<bit));
break;
}
}
}

unsignedcharGETB(PORTport,unsignedcharbit){
unsignedreturn_value=0;
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(0xff-(1<<bit));
//return_value=PINA&(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(0xff-(1<<bit));
return_value=PINB&(1<<bit);
break;
casePC:
DDRC|=(0xff-(1<<bit));
return_value=PINC&(1<<bit);
break;
casePD:
DDRD|=(0xff-(1<<bit));
return_value=PIND&(1<<bit);
break;
}
if(return_value==0){
return(0x00);
}else{
return(0xff);
}
}
return(0xf0);
}

voidSETD(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(1<<bit);
//break;
//useinMega16
casePB:
DDRB|=(1<<bit);
break;
casePC:
DDRC|=(1<<bit);
break;
casePD:
DDRD|=(1<<bit);
break;
}
}
}

voidCLRD(PORTport,unsignedcharbit){
if(bit<=7){
switch(port){
//casePA:
//DDRA|=(0xff-(1<<bit));
//break;
//useinMega16
casePB:
DDRB|=(0xff-(1<<bit));
break;
casePC:
DDRC|=(0xff-(1<<bit));
break;
casePD:
DDRD|=(0xff-(1<<bit));
break;
}
}
}

‘叁’ 在单片机英文手册中PIN指的是什么

PIN指的是单片机的引脚,比如某个IO,或某个控制口,对于一个DIP40封装的单片机(普通MCS-8051),共有40个引脚,也就是40PIN。

‘肆’ 集成电路的pind一般指多大颗粒

通常说“集成电路”是指集成电路的芯片(IC),如 TTL 的74系列、51系列的单片机,不包括 PLC。
编程逻辑控制器是电子整机,是一种工控计算机,内部电路采用各种集成电路芯片。

‘伍’ AVR单片机用普通IO口怎么写边缘触发的程序呢

avr输入时读取引脚值应该是用比如pind.7读取,读取pa0用pina.0读取,看一下avr的datasheet,里面有。作为输入引脚时,portx不再是设置引脚高低的,而是选择输入引脚是否上拉电阻

‘陆’ AVR单片机怎么产生占空比可调PWM波形

AVR单片机产生占空比可调PWM波形:
设置TC1为快速PWM方式,输入频率为1MHz时,在PD4和PD5输出非反相的PWM,频率1M/100=10KHz,占空比通过设置OCR1A和OCR1B来实现:

PORTD=0x00;
DDRD=0x30;
TCCR1A=0xA2;
TCCR1B=0x19;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00; //ICR设置PWM频率
ICR1L=0x63;
OCR1AH=0x00; //设置PD4输出占空比
OCR1AL=0x22;
OCR1BH=0x00; //设置PD5输出占空比
OCR1BL=0x22;

‘柒’ AVR单片机,MEGA8,出现语句 PIND (*(volatile unsigned char *)0x29),这句话中*号大概是什么意思

(volatile unsigned char *)这是一个强制类型转换,把0x29转换成一个指向unsigned char的指针
而强制类型转换之前的*表明对指针0x29取值,因为0x29是一个地址,这样做就是从地址0x29出取一个字节
如你所说,0x29是一个寄存器地址,这个操作就是读该寄存器的值
因为这是一个绝对地址,所以写法上有些特殊

‘捌’ AVR单片机PIND=BIT(PD7)和PIND.7一样吗不对的话,那怎么才能和PIND.7一样啊

PIN是端口的状态寄存器,不用设置啊,是读取端口状态的。直接读PIND就可以

‘玖’ A V R 单片机问题 s1按键按下是PIND&0X10

看按键接在哪个引脚上
如果接在PD4上,当该按键按下时,该引脚为0 PIND&0X10 即为0 否则非0(0x10)
如果接在PD5上,当该按键按下时,该引脚为0 PIND&0X20即为0 否则非0(0x20)
0x10对应二进制 0001 0000 即第5位是按钮
0x20对应二进制 0010 0000 即第6位是按钮

阅读全文

与单片机pind相关的资料

热点内容
台州程序员兼职一般去哪些网站 浏览:386
旧版本怎么下载到新的安卓 浏览:964
flash个人网站源码下载 浏览:723
javasocketbyte 浏览:262
素描基础教程pdf 浏览:541
香港商报pdf版 浏览:426
安卓手机怎么录制吉他弹奏 浏览:382
ie文件夹缓存在哪里 浏览:264
围棋排名算法 浏览:963
zigbee加密算法 浏览:464
柏杨版资治通鉴pdf 浏览:395
事业编程序员下班时间 浏览:10
linux中命令大全 浏览:38
pic单片机学习网站 浏览:163
843除6的算法 浏览:377
arduino编程视频 浏览:744
pdf背景绿色 浏览:612
记事本dos命令 浏览:275
服务器如何搭建多个节点 浏览:327
acx算法 浏览:258