一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 1324|回复: 3

[其他综合] 请教个IO定义的问题

[复制链接]
发表于 2014-5-7 11:52 来自手机 | 显示全部楼层 |阅读模式
在中断里扫描数码管
a++;
if (a>5)   a=0;
SMG[a]=1;
……

使用的是任意IO,这样定义IO,
sbit SMG[0]=P1^5;

KEIL却报错,请教下该如何解决
发表于 2014-5-7 13:18 | 显示全部楼层
定义部分有问题
回复

使用道具 举报

发表于 2014-5-8 09:23 | 显示全部楼层
sbit SMG[0]=P1^5;   SMG[0]这是一个数组来的,不能定样定义,要sbit SMG_0=P1^5; 才行的
回复

使用道具 举报

发表于 2014-6-17 20:57 | 显示全部楼层
楼主想偷懒,把端口声明成数组成员,方便调用。
确实这样定义方便,也直观。
但sbit只能声明特殊功能寄存器的位变量为一个合法的C语言变量名。
以上sbit SMG[0]=P1^5;有两处错误。
一为c语言不支持位数组,二为数组元素不可再定义。

可以把这一句改用函数来处理,程序结构基本不变。
例:
在中断里扫描数码管
a++;
if (a>5)   a=0;
SMG(a)=1;
……
改[ ]为( ),乍一看基本一致。

声明改为:sbit SMG0=P1^5;
去掉[ ],还少打俩字符,哈哈!

另加一自定义函数SMG:
void SMG(unsigned char weixuan)
{
SMG0=0;
if(weixuan==0)SMG0=1;
}
这里也可以用switch,程序更简洁。
不过使用函数会增加运算量,程序复杂的话会慢。
而且一般动态刷新都在中断里处理,中断响应时间太长的话会失去实时性。
我一般的习惯是用数组来处理,io用连续端口。
例:
声明数组SMG[5]={0X10,0X20,0X40,0X80}

在中断里扫描数码管
a++;
if (a>5)   a=0;
P1=(P1 & 0x0f)| SMG[a];
……
楼主明白了吗?
另外if (a>5)   a=0;
我一般习惯用a=a%6;
省两个周期,哈哈~
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 18:27 , Processed in 0.032405 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表