打印

函数指针问题.

[复制链接]
2388|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
耕在此行|  楼主 | 2010-5-28 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为中断里要对三个串在一起的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()
{
   ..............
}

相关帖子

沙发
耕在此行|  楼主 | 2010-5-28 09:34 | 只看该作者
自己先顶一下.

使用特权

评论回复
板凳
ayb_ice| | 2010-5-28 09:56 | 只看该作者
请问LZ
理论上8段码可以显示256个字符,如果要全部显示这256个字符,难道你要做256个函数
再如果显示汉字那岂不是要做N个函数
传递参数才是正道

使用特权

评论回复
地板
冷漠| | 2010-5-28 11:14 | 只看该作者
本帖最后由 冷漠 于 2010-5-28 11:19 编辑
因为中断里要对三个串在一起的74164送显示数据,所以这部分程序占用的时间比较多.


慢吗?霎时间而已.....
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
耕在此行|  楼主 | 2010-5-28 14:26 | 只看该作者
我想看到函数指针的用法.
4楼的方法是不错的,当时考虑过,自己忘了怎么没用.

使用特权

评论回复
6
耕在此行|  楼主 | 2010-5-28 14:27 | 只看该作者
3楼的说法,本人做的产品空间有很大的余量.而且要显示的内容只有0--9.

使用特权

评论回复
7
highgear| | 2010-5-28 21:25 | 只看该作者
搂主本应该用一个函数, 而不是多个。这是  **最基本**  的编程方法。
void send_to_led(char number)

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

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

使用特权

评论回复
8
aresc| | 2010-5-28 21:42 | 只看该作者
函数指针的用法类似如下:

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
mohanwei| | 2010-5-28 21:42 | 只看该作者
楼主的编程风格很强大

使用特权

评论回复
10
冷漠| | 2010-5-29 13:42 | 只看该作者
本帖最后由 冷漠 于 2010-5-29 13:54 编辑

void send_to_led(char number)

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

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



请教7楼大侠:一个函数send0_to_led() 能否这样写作为函数指针数组元素?

是否可以改写为:
void send_to_led(char number)

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

FunctionPointer myFP[] = { send0_to_led, send1_to_led , ... };   //数组元素为函数指针

调用时:

led8=myFP[send0_to_led]( number  );

按照7楼:
led8= myFP[send0_to_led( )]( );  

冷漠菜鸟恳请大侠指教。

使用特权

评论回复
11
耕在此行|  楼主 | 2010-5-29 14:31 | 只看该作者
谢谢7 8楼 ,我明天试试.

使用特权

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

本版积分规则

个人签名:知足常乐......

40

主题

1108

帖子

0

粉丝