^_^,我以前做个一个类似的项目,经验认为一般每一行使用1~2ms就可以了,也就是说实际应用中20ms内完成一个周期一般是没有问题的,频率太高,显示会变暗,频率太低就会闪烁,下面是部分代码,原程序还有一个红外遥控输入程序的:
/********************show****************************************************/
void trasmit(unsigned char byte,unsigned char bit_count){
unsigned char tmp;
tmp=bit_count;
byte<<=3;
clock=0;
for(;tmp>0;tmp--) {
// while(tmp--){
if (byte&0x80)wdata=1;
else wdata=0;
clock=1;_nop_();clock=0;
byte<<=1;
}
rdata=0;
rdata=1;_nop_();rdata=0;
}
/*****************************************************************************/
void show0(unsigned char y){
unsigned char i;
wdata=1;
for(i=0;i
clock=0;
}
rdata=1;
rdata=0;
}
/***************************************************************/
void display(void){
unsigned char k,row,bit_cnt;
iout=0x01;
for(row=0;row<7;row++)
{
bit_cnt=5;
for(k=0;k<9;k++){
if(show_letter[k]>127)show_letter[k]=_NUL;//
temp_data[k]=letter[show_letter[k]][row];
}
SCAN_PORT=0xff;
for(k=0;k<9;k++)
{
if(!int_f){
if(k==8)bit_cnt=bit_step_temp;
trasmit(temp_data[k],bit_cnt);
}
else if(k==8 && !brake_f){
if(right_flag|left_flag)trasmit(temp_data[k],bit_cnt);
}
else {
if(brake_f)show0(40);
else trasmit(temp_data[k],bit_cnt);
}
if((brake_f1|right_flag|left_flag| k==8) && REVERSE_S);
else show0(1);
}
if(right_flag|left_flag){
show0(2);
}
//if(brake_f1)show0(5);
SCAN_PORT=~iout;
//if(brake_f)SCAN_PORT=0xff;
// if(brake_f)
DelayMs(4);
iout=iout<<1;
SCAN_PORT=0xff;
}
}
/***************************************************************************/