求单片机 c语言 控制引脚
答案:4 悬赏:20 手机版
解决时间 2021-01-22 07:00
- 提问者网友:战魂
- 2021-01-21 18:05
求单片机 c语言 控制引脚
最佳答案
- 五星知识达人网友:一袍清酒付
- 2021-01-21 18:34
ACC 是累加器啊,是会自动计数的,在C语言中还敢这么用?
需要另外定义一个变量!
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
var_P1 = P1;
for(i=8; i>0; i--)
{
if (i==位置) var_P1 = 值;
var_P1 = var_P1 >> 1;
}
P1 = var_P1;//这个是不是应该放到for循环里面?不知道要求所以只是提醒一下
}
按照你的要求,是改变P1.x端口对应x的输出值(友情提醒一下,这也是危险的。因为P1不是一个变量,读取P1是指P1外部电路的情况,如果外部电路为低电平,但是这时候P1对应位输出高电平的话就会有电流输出,当然如果加好电阻的就没事。)
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
if (值 == 1)
var_P1 = var_P1 | (1 << 位置); //对应位置1
else
var_P1 = var_P1 & ~(1 << 位置); //对应清0
P1 = var_P1;//重新输出即可
}追问P1 = var_P1;是在循环语句之外放着
目的是为改变P1的结果赋值给P1
谢谢提示增加一个过程变量,不知道ACC会自动累加
自己编的有错误,所以请教大虾。追答又修改了新的:
按照你的要求,只改变P1.x端口对应x的输出值0或1(友情提醒一下,这也是危险的。因为P1不是一个变量,读取P1是指P1外部电路的情况,如果外部电路为低电平,但是这时候P1对应位输出高电平的话就会有电流输出,当然如果加好电阻的就没事。)
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
if (值 == 1)
var_P1 = var_P1 | (1 << 位置); //对应位置1
else
var_P1 = var_P1 & ~(1 << 位置); //对应清0
P1 = var_P1;//重新输出即可
}追问首先谢谢
我的思路错了
虽然不懂 var_P1 = var_P1 | (1 << 位置); 的用法但你给了说明
改变输出赋值就是为了改变引脚状态,有做保护处理的。
正在修改测试,再次感谢。
没有问题了采纳,结束。追答如果希望修改P1.x(x范围0到7),那么用函数IOMOD(x, 值);就行(值是1或0)
需要另外定义一个变量!
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
var_P1 = P1;
for(i=8; i>0; i--)
{
if (i==位置) var_P1 = 值;
var_P1 = var_P1 >> 1;
}
P1 = var_P1;//这个是不是应该放到for循环里面?不知道要求所以只是提醒一下
}
按照你的要求,是改变P1.x端口对应x的输出值(友情提醒一下,这也是危险的。因为P1不是一个变量,读取P1是指P1外部电路的情况,如果外部电路为低电平,但是这时候P1对应位输出高电平的话就会有电流输出,当然如果加好电阻的就没事。)
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
if (值 == 1)
var_P1 = var_P1 | (1 << 位置); //对应位置1
else
var_P1 = var_P1 & ~(1 << 位置); //对应清0
P1 = var_P1;//重新输出即可
}追问P1 = var_P1;是在循环语句之外放着
目的是为改变P1的结果赋值给P1
谢谢提示增加一个过程变量,不知道ACC会自动累加
自己编的有错误,所以请教大虾。追答又修改了新的:
按照你的要求,只改变P1.x端口对应x的输出值0或1(友情提醒一下,这也是危险的。因为P1不是一个变量,读取P1是指P1外部电路的情况,如果外部电路为低电平,但是这时候P1对应位输出高电平的话就会有电流输出,当然如果加好电阻的就没事。)
void IOMOD(unsigned char 位置,unsigned char 值)
{
unsigned char i, var_P1;
if (值 == 1)
var_P1 = var_P1 | (1 << 位置); //对应位置1
else
var_P1 = var_P1 & ~(1 << 位置); //对应清0
P1 = var_P1;//重新输出即可
}追问首先谢谢
我的思路错了
虽然不懂 var_P1 = var_P1 | (1 << 位置); 的用法但你给了说明
改变输出赋值就是为了改变引脚状态,有做保护处理的。
正在修改测试,再次感谢。
没有问题了采纳,结束。追答如果希望修改P1.x(x范围0到7),那么用函数IOMOD(x, 值);就行(值是1或0)
全部回答
- 1楼网友:三千妖杀
- 2021-01-21 20:42
你这个函数,和传递过来得参数无关呀,这个函数得效果是把P1右移八位.
你是不是if忘记加{}了
你是不是if忘记加{}了
- 2楼网友:一叶十三刺
- 2021-01-21 19:22
void IOMOD(unsigned char 位置,unsigned char 值)
{ unsigned char i;
ACC = P1;
if (值 == 1)
ACC = ACC | (1 << 位置);
else
ACC= ACC & (0 << 位置);
P1 = ACC;
}
这是设置某一引脚值的方法,其中“值”只能为0或1, c语言没有直接对位赋值语句!追问谢谢
ACC是累加器,的确我的思路错了
建议你看看 Arthurzss 的回答
思路和你一样的
{ unsigned char i;
ACC = P1;
if (值 == 1)
ACC = ACC | (1 << 位置);
else
ACC= ACC & (0 << 位置);
P1 = ACC;
}
这是设置某一引脚值的方法,其中“值”只能为0或1, c语言没有直接对位赋值语句!追问谢谢
ACC是累加器,的确我的思路错了
建议你看看 Arthurzss 的回答
思路和你一样的
- 3楼网友:独钓一江月
- 2021-01-21 19:06
我在想,你这个
{if (i==位置) ACC0 = 值;
ACC = ACC >> 1;
}
P1 = ACC;
为嘛要这么写。是要移8位吗,为啥不>>8
ACC初始值是啥,结果是啥追问初学单片机C语言不久,实践编写能力较弱
不仅要位移,最主要的目的是改变引脚(P1二进制)状态
若有别的好办法请赐教:)追答你这个i的位置和 ACC值是不是不一定移八位。 遇到啥情况会不操作,或者停止?
p1是改完之后在输出,还是中间一直输出。
这个逻辑要弄清楚,否则你这里的数字就不一定对了。
ACC 一楼说的没错,不建议用寄存器名做变量名。
写法上来说没有大问题,移位来改变P1的方式很常用。感觉不是写法,而是思路问题吧。
另外ACC0
是啥?另外一个变量,没有ACC笔误吧追问忘做说明
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
不一定要移八位,是思路错了
Arthurzss 答的非常好
{if (i==位置) ACC0 = 值;
ACC = ACC >> 1;
}
P1 = ACC;
为嘛要这么写。是要移8位吗,为啥不>>8
ACC初始值是啥,结果是啥追问初学单片机C语言不久,实践编写能力较弱
不仅要位移,最主要的目的是改变引脚(P1二进制)状态
若有别的好办法请赐教:)追答你这个i的位置和 ACC值是不是不一定移八位。 遇到啥情况会不操作,或者停止?
p1是改完之后在输出,还是中间一直输出。
这个逻辑要弄清楚,否则你这里的数字就不一定对了。
ACC 一楼说的没错,不建议用寄存器名做变量名。
写法上来说没有大问题,移位来改变P1的方式很常用。感觉不是写法,而是思路问题吧。
另外ACC0
是啥?另外一个变量,没有ACC笔误吧追问忘做说明
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
不一定要移八位,是思路错了
Arthurzss 答的非常好
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯