打印

指针问题.

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

使用特权

评论回复
板凳
llljh| | 2011-7-14 13:48 | 只看该作者
再如果显示汉字那岂不是要做N个函数

使用特权

评论回复
地板
xwj| | 2011-7-14 13:54 | 只看该作者
哈哈

使用特权

评论回复
5
司徒老鹰| | 2011-7-14 13:59 | 只看该作者
嗯,传递参数才是正道

使用特权

评论回复
6
栩栩如生| | 2011-7-14 14:04 | 只看该作者
慢吗?霎时间而已.....
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;

}

使用特权

评论回复
7
dingy|  楼主 | 2011-7-14 14:10 | 只看该作者
我想看到函数指针的用法.
楼上的方法是不错的,当时考虑过,自己忘了怎么没用.

使用特权

评论回复
8
dingy|  楼主 | 2011-7-14 15:06 | 只看该作者
嗯,传递参数才是正道
司徒老鹰 发表于 2011-7-14 13:59
本人做的产品空间有很大的余量.而且要显示的内容只有0--9.

使用特权

评论回复
9
五谷道场| | 2011-7-14 15:43 | 只看该作者
搂主本应该用一个函数, 而不是多个。这是  **最基本**  的编程方法。
void send_to_led(char number)

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

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

使用特权

评论回复
10
午夜粪车| | 2011-7-14 15:50 | 只看该作者
函数指针的用法类似如下:

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]();            // 调用相应数字的函数
}

使用特权

评论回复
11
pengf| | 2011-7-14 15:56 | 只看该作者
楼主的编程风格很强大

使用特权

评论回复
12
dingy|  楼主 | 2011-7-14 16:18 | 只看该作者
呵呵,我再改改吧,多谢大家

使用特权

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

使用特权

评论回复
14
ahgao| | 2011-7-14 23:00 | 只看该作者
晕,耗时太长就不要放在中断里面。更何况改成那样子也不会快。时间瓶颈是串行输出而不是显示代码的表达方式。

使用特权

评论回复
15
dingy|  楼主 | 2011-7-18 15:03 | 只看该作者
好吧。。。。

使用特权

评论回复
16
figi| | 2011-7-18 21:09 | 只看该作者
:lol

使用特权

评论回复
17
dingy|  楼主 | 2011-7-18 21:13 | 只看该作者
楼上笑啥

使用特权

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

本版积分规则

745

主题

10920

帖子

6

粉丝