打印

函数指针数组

[复制链接]
494|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2016-12-3 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

因为中断里要对三个串在一起的74164送显示数据,所以这部分程序占用的时间比较多.
我想改一下,比如显示8,就直接发送7个1+1个0,显示0就直接发6个1+2个0.
如果改成这样是不是用函数指针数组可以实现,请高手指点.
原程序:
中断程序
void T0_int() interrupt 1 using 0
{
     TH0 = T2mS5_H;   // 定时2.5mS
     /* 显示中断处理程序 */
     disp_bit++;
     if( disp_bit >= 5)  disp_bit = 0;
     PTC = 0xff;     // 先屏蔽显示
     led8 = led[2][disp_bit];
     send_to_led();
     led8 = led[1][disp_bit];
     send_to_led();
     led8 = led[0][disp_bit];
     send_to_led();
     switch ( disp_bit )
     {
         case 0:  PTC  = 0x7f;   break;
         case 1:  PTC = 0xbf;    break;
         case 2:  PTC = 0xdf;    break;
         case 3:  PTC = 0xef;    break;
         case 4:  PTC = 0xf7;    break;
         default: disp_bit = 0;
     }
}
74164移位程序
void send_to_led()
{
     PTB &= ~BIT4;  // 时钟低 1
     PTB &= ~BIT5;  // 数据低
     if( led8 & BIT7 )  PTB |= BIT5; // 数据高
     PTB |= BIT4;  // 时钟高
     led8 <<= 1;
     PTB &= ~BIT4;  // 时钟低 2
     PTB &= ~BIT5;  // 数据低
     if( led8 & BIT7 )  PTB |= BIT5; // 数据高
     PTB |= BIT4;  // 时钟高
     led8 <<= 1;
     ..................
     .....中间省略.....
     ..................
     PTB &= ~BIT4;  // 时钟低 8
     PTB &= ~BIT5;  // 数据低
     if( led8 & BIT7 )  PTB |= BIT5; // 数据高
     PTB |= BIT4;  // 时钟高
}
现在想改成如下的程序
void send0_to_led()
{
     PTB &= ~BIT4;  // 时钟低
     PTB &= ~BIT5;   // 数据低 0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低
     PTB |= BIT5;   // 数据高 1
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低
     PTB &= ~BIT5;   // 数据低 0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低   0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低   0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低   0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低   0
     PTB |= BIT4;  // 时钟高-------
     PTB &= ~BIT4;  // 时钟低
     PTB |= BIT5;   // 数据高 1
     PTB |= BIT4;  // 时钟高-------
}
void send1_to_led()
{
     ..............
}
void send2_to_led()
{
     ..............
}
void send3_to_led()
{
     ..............
}
void send4_to_led()
{
     ..............
}
void send5_to_led()
{
     ..............
}
void send6_to_led()
{
     ..............
}
void send7_to_led()
{
     ..............
}
void send8_to_led()
{
     ..............
}
void send9_to_led()
{
     ..............
}
沙发
llia| | 2016-12-3 15:05 | 只看该作者

理论上8段码可以显示256个字符,如果要全部显示这256个字符,难道你要做256个函数

使用特权

评论回复
板凳
wangpe| | 2016-12-3 15:07 | 只看该作者
嗯,传递参数才是正道

使用特权

评论回复
地板
langgq| | 2016-12-3 15:08 | 只看该作者
慢吗?霎时间而已.....
uchar  code  discode[10]={0xc0,0xf9,0xa4,0xb0,......0x80,0x98};
uchar  number[3];

void main(void)
{
SCON=0;   //  设串口模式0,送74164 串/并转换输出显示
ES=1;
EA=1;
......
number[0]=欲显示数1;
number[1]=欲显示数2;
number[2]=欲显示数3;
......
}

//  中断送显示数
void  ssio(void)  interrupt 4  using 1
{
static uchar  ccc;

TI=0;   ES=0;
SBUF=discode[number[ccc++ %3];   //大意。没证实。
ES=1;

}

使用特权

评论回复
5
yufe|  楼主 | 2016-12-3 15:11 | 只看该作者

我想看到函数指针的用法.
楼上的方法是不错的,当时考虑过,自己忘了怎么没用.

使用特权

评论回复
6
yufe|  楼主 | 2016-12-3 15:13 | 只看该作者
本人做的产品空间有很大的余量.而且要显示的内容只有0--9.

使用特权

评论回复
7
zhuww| | 2016-12-3 15:16 | 只看该作者
搂主本应该用一个函数, 而不是多个。这是  **最基本**  的编程方法。
void send_to_led(char number)

函数指针数组:
typedef void (*FunctionPointer)();

FunctionPointer myFP[] = { send0_to_led(), send1_to_led() , ... };

使用特权

评论回复
8
zhanglli| | 2016-12-3 15:18 | 只看该作者
函数指针的用法类似如下:

void (*pFun[10]) (void);    // 函数指针数组
int i;

pFun[0] = send0_to_led;
pFun[1] = send1_to_led;
pFun[2] = send2_to_led;
pFun[3] = send3_to_led;
pFun[4] = send4_to_led;
pFun[5] = send5_to_led;
pFun[6] = send6_to_led;
pFun[7] = send7_to_led;
pFun[8] = send8_to_led;
pFun[9] = send9_to_led;

for ( i=0; i<10; i++)
{
          pFun[i]();            // 调用相应数字的函数
}

使用特权

评论回复
9
lium| | 2016-12-3 15:20 | 只看该作者
楼主的编程风格很强大

使用特权

评论回复
10
guoyt| | 2016-12-3 15:22 | 只看该作者
在 keil c 系统 慎用 指针函数
keil c 的函数调用检查 好像要对指针函数特殊说明的
不然可能 临时变量会互相冲突的
keilc 的临时变量不是放到堆栈里面的
这是我不喜欢51 的地方

使用特权

评论回复
11
hanwe| | 2016-12-3 15:25 | 只看该作者

晕,耗时太长就不要放在中断里面。更何况改成那样子也不会快。

使用特权

评论回复
12
llia| | 2016-12-3 15:28 | 只看该作者
时间瓶颈是串行输出而不是显示代码的表达方式。

使用特权

评论回复
13
wangpe| | 2016-12-3 15:29 | 只看该作者
真搞不懂,
1.有很多MUP都可以直接成串输出,为什么要搞IO模拟;SPI串口就能轻松实现这些;
2.在中断期间不能做很多的事,必须以最快的速度完成它;
例,要刷新的数据我放在某全局变量里了,中断刷新的时候直接就用它了;

使用特权

评论回复
14
wangzsa| | 2016-12-3 15:31 | 只看该作者
这么简单的任务和函数指针没有关系的;

使用特权

评论回复
15
wangzsa| | 2016-12-3 15:33 | 只看该作者
最厉害的一串能输出512位,中间过程不用操心;

使用特权

评论回复
16
wangzsa| | 2016-12-3 15:36 | 只看该作者
如果只是显示  可以分时 发送数据 减小占用定时中断的时间 CP发送一次 DATA 发送一次

使用特权

评论回复
17
zhuww| | 2016-12-3 15:38 | 只看该作者
中断中一般不进行函数调用

使用特权

评论回复
18
zhanglli| | 2016-12-3 15:41 | 只看该作者
我一直都是用数组,从没想过你这种方法,太麻烦了这样

使用特权

评论回复
19
yufe|  楼主 | 2016-12-3 15:43 | 只看该作者
嗯,那我按大家的说法挨个排查一下,先结贴啦,谢谢哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

10170

帖子

1

粉丝