51单片机做点阵屏的问题,64行 16列,采用行扫,但显示的时候,画面总是跳动闪烁,我是在Proteus 7上模拟

2024-12-02 22:13:02
推荐回答(1个)
回答1:

^_^,我以前做个一个类似的项目,经验认为一般每一行使用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=1;
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;
}
}
/***************************************************************************/