完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨,所有,我试图把8个端口引脚地址到一个数组和步骤,虽然每个打开/关闭它们。我能够独立地打开和关闭每一个,但是我在C语法中挣扎着要通过8步。我认为我的LeDINA数组的内容是错误的,但是我看不到如何改变,或者是否有可能在数组中设置定义值。下面是我的代码的一部分:期待你的回复。
以上来自于百度翻译 以下为原文 Hi All, I am try to put 8 port pin addresses into an array and step though each turning them on/off. I am able to turn each one on and off individually, but I am struggling on my c syntax somehow to step through 8. I think the contents of my led_array is wrong but I cannot see how to change, or if its possible to put define values in an array. Below is a section of my code: /* Leds */ #define LED0 LATDbits.LATD0 #define LED1 LATDbits.LATD1 #define LED2 LATDbits.LATD2 #define LED3 LATDbits.LATD3 #define LED4 LATDbits.LATD4 #define LED5 LATDbits.LATD5 #define LED6 LATDbits.LATD6 #define LED7 LATDbits.LATD7 void main(void) { initialise_io(); while(1) { char i; char led_array[] = "LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7"; for(i=0; i<8; i++) { led_array=1; // turn led on __delay_ms(500); led_array=0; // turn led off __delay_ms(500); } } Look forward to your reply. Tuurbo46 |
|
相关推荐
14个回答
|
|
|
|
|
|
不能制作端口引脚数组。下面的PIC ASM不能做到这一点。最简单的方法是创建一个隐藏工作的函数。或者在您的情况下,因为PIN在同一个端口上,以便您可以使用ON和OR屏蔽端口。
以上来自于百度翻译 以下为原文 You can not make an array of port pins. The underlying pic ASM can’t do it The simplist way is to make a function that hids the work. Or in you case since the pins are on the same port and in order you can just mask the port using ands and ors. |
|
|
|
正如NKurzman所言,PIC18F和PIC16F系列设备的指令集不直接支持这一点。PIN是一个“位”类型变量。XC8用户指南清楚地指出,你不能有一个指针指向一个“位”变量类型,所以你也不能有一个数组。
以上来自于百度翻译 以下为原文 As NKurzman stated, the the instruction set of the PIC18F and PIC16F family devices does not directly support this. A pin is a "bit" type variable. The XC8 user guide clearly states that you can not have a pointer to a "bit" variable type, so you can't have an array of them either. |
|
|
|
您可以制作一个对端口引脚的引用数组,使之可以引用引脚,就像它是一个引脚数组:未测试。请记住,如果应用程序中的代码很重要,这种代码就不是大小有效的。
以上来自于百度翻译 以下为原文 You can make an array of references to the port pins that lets you reference the pins as though it were an array of pins:static const struct { volatile uint8_t *port; uint8_t pin; } leds[] = { { &LATD, 0 }, { &LATD, 1 }, { &LATD, 2 }, { &LATD, 3 }, { &LATD, 4 }, { &LATD, 5 }, { &LATD, 6 }, { &LATD, 7 }, }; void main(void) { uint8_t led; for (led = 0; led < 8; led++) { *(leds[led].port) |= 1 << leds[led].pin; __delay_ms(500); *(leds[led].port) &= ~(1 << leds[led].pin); __delay_ms(500); } }Not tested. Keep in mind this sort of code is not size-efficient if that matters in your application. |
|
|
|
这难道不应该有类似的效果吗?
以上来自于百度翻译 以下为原文 Shouldn't this be { &LATD, 0x01 }, { &LATD, 0x02 }, { &LATD, 0x04 }, { &LATD, 0x08 }, { &LATD, 0x10 }, { &LATD, 0x20 }, { &LATD, 0x40 }, { &LATD, 0x80 } or something to similar effect? |
|
|
|
|
|
|
|
这难道不应该有类似的效果吗?抱歉,我不明白,第二个值(.PIN)被用作左移位参数而不是一个掩码,所以0到7个值似乎是正确的,不是吗?
以上来自于百度翻译 以下为原文 Shouldn't this be { &LATD, 0x01 }, { &LATD, 0x02 }, { &LATD, 0x04 }, { &LATD, 0x08 }, { &LATD, 0x10 }, { &LATD, 0x20 }, { &LATD, 0x40 }, { &LATD, 0x80 } or something to similar effect? Sorry but I don't get this, the second value (.pin) is used as a shift left argument not a mask so the 0 to 7 values seem right for that, no? |
|
|
|
表和代码都应该被调整为使用掩码值。是的,移位值会起作用,但会产生非常低效的代码。
以上来自于百度翻译 以下为原文 Both the table and the code should be adjusted to use the mask value. Yes, the shift value will work, but will generate horribly inefficient code. |
|
|
|
代码是可读的和可维护的,而不是高效的。我不想考虑比特掩码是5位或者必须键入(1和lt;lt;5)而不是仅仅“5”。指针的数组已经非常低效了。但坦率地说,对于大多数拥有现代图片的应用来说,这些日子并不重要。
以上来自于百度翻译 以下为原文 The code is meant to be readable and maintainable rather than be efficient. I don't want to have to think about what the bit mask is for bit 5 or to have to type (1<<5) instead of just "5". It's already going to be horribly inefficient with the arrays of pointers. But frankly, that just doesn't matter these days for the vast majority of applications with modern PICs. |
|
|
|
好的,谢谢,我想是这样的,只是在帖子里没有看到,所以我想我会要求清楚一些。
以上来自于百度翻译 以下为原文 OK thanks, I thought that was the case just didn't see that in the posts so I thought I would ask for some clarity! |
|
|
|
在MPU头文件中已经有掩码。
以上来自于百度翻译 以下为原文 There are already masks in the mpu header file. x = port, y = pin LATx |= _LATx_LATxy_MASK; //set LATx &= ~_LATx_LATxy_MASK; //clear LATx & _LATx_LATxy_MASK; //test //leds on 1 by 1 for(int f = 1; f <= 128; f <<= 1){ LATx |= f; //delay 1 second } |
|
|
|
& lt;& lt;ldd,0x01&lt;& lt;2 },{&;LATD,0x01&lt;& lt;3 },{&&LATD,0x01&lt;lt;4 },{&;LATD,0x01&lt;lt;}},{&;LATD,0x01&lt;lt;6 },{&;LATD,0x01&lt;& lt;7 },两个世界中最好的是什么:{&LATD,0x01&lt;lt;0 },{&&LATD,0x01
以上来自于百度翻译 以下为原文 How about the best of both worlds: { &LATD, 0x01 << 0 }, { &LATD, 0x01 << 1 }, { &LATD, 0x01 << 2 }, { &LATD, 0x01 << 3 }, { &LATD, 0x01 << 4 }, { &LATD, 0x01 << 5 }, { &LATD, 0x01 << 6 }, { &LATD, 0x01 << 7 }, |
|
|
|
由于所有LED都连接到LATD,这将做:
以上来自于百度翻译 以下为原文 Since all LEDs are connected to LATD, this will do: uint8_t i; for (i = 1; i; i <<= 1) { LATD |= i; // turn led on __delay_ms(500); LATD &= ~i; // turn led off __delay_ms(500); } |
|
|
|
大家好,谢谢大家的帮助和帮助。
以上来自于百度翻译 以下为原文 Hi all, Thanks for all your input and help. Cheers, Tuurbo46 |
|
|
|
只有小组成员才能发言,加入小组>>
5223 浏览 9 评论
2024 浏览 8 评论
1949 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3198 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2252 浏览 5 评论
769浏览 1评论
655浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
583浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
667浏览 0评论
569浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-16 18:56 , Processed in 1.699783 second(s), Total 105, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号