打印

用函数指针数组可以实现吗

[复制链接]
1591|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2012-12-23 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为中断里要对三个串在一起的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()
{
    ..............
}
沙发
zhenykun| | 2012-12-23 11:04 | 只看该作者
理论上8段码可以显示256个字符,如果要全部显示这256个字符,难道你要做256个函数

使用特权

评论回复
板凳
jlyuan| | 2012-12-23 11:05 | 只看该作者
嗯,传递参数才是正道

使用特权

评论回复
地板
yszong| | 2012-12-23 11:07 | 只看该作者
慢吗?霎时间而已.....
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
zhanghqi|  楼主 | 2012-12-23 11:08 | 只看该作者
我想看到函数指针的用法.
楼上的方法是不错的,当时考虑过,自己忘了怎么没用.

使用特权

评论回复
6
zhanghqi|  楼主 | 2012-12-23 11:08 | 只看该作者
本人做的产品空间有很大的余量.而且要显示的内容只有0--9.

使用特权

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

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

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

使用特权

评论回复
8
heweibig| | 2012-12-23 11:09 | 只看该作者
函数指针的用法类似如下:

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
wuhany| | 2012-12-23 11:14 | 只看该作者
楼主的编程风格很强大

使用特权

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

使用特权

评论回复
11
jiahy| | 2012-12-23 11:16 | 只看该作者
晕,耗时太长就不要放在中断里面。更何况改成那样子也不会快。

使用特权

评论回复
12
jiahy| | 2012-12-23 11:16 | 只看该作者
时间瓶颈是串行输出而不是显示代码的表达方式。

使用特权

评论回复
13
zhanghqi|  楼主 | 2012-12-23 11:17 | 只看该作者
呵呵,我再改改吧,多谢大家

使用特权

评论回复
14
zhanghqi|  楼主 | 2012-12-23 11:18 | 只看该作者
先结贴了

使用特权

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

使用特权

评论回复
16
明月小厨| | 2012-12-23 13:23 | 只看该作者
这么简单的任务和函数指针没有关系的;

使用特权

评论回复
17
明月小厨| | 2012-12-23 13:25 | 只看该作者
最厉害的一串能输出512位,中间过程不用操心;

使用特权

评论回复
18
eydj2008| | 2012-12-23 18:38 | 只看该作者
如果只是显示  可以分时 发送数据 减小占用定时中断的时间 CP发送一次 DATA 发送一次

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝