harng 发表于 2008-8-15 10:23:17

马老师,又有问题请教你了,谢谢先

我有个问题百思不得其解,我定义一个变量,然后送LCD显示,我程序里开了中断,是用来扫描键盘的,然后我送显示的时候,显示的数字老是会闪,把中断关了,就没事了,不知什么原因呀
程序简化如下:
#include<iom16v.h>
#include <macros.h>
#include <stdio.h>
#include "key.h"
#include "define.h"
#include "lcd1602.h"
#include "delay.h"
#include "show_menu.h"
#include "key_fuction.h"
#include "zeeprom.h"
unsigned char time={0};
unsigned char power={0};
unsigned char time1={0};
unsigned char power1={0};
//定义字符,要在LCD资料查找此字符显示(0-9)       
unsigned char arry={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/******************比较定时器0比较向量入口地址**************///此函数用于扫描键盘
#pragma interrupt_handler TIMER0_COMP:20
void TIMER0_COMP(void)
{
time_1ms_ok=1;
   
if(++key_stime1_counter>=10)
   {
    time_10ms_ok=1;
   }
}
/***************主界面变量缓冲区******************/
void disbuffer_main(void)
{


LCD_write_char(6,0,arry]);
LCD_write_char(7,0,arry]);
LCD_write_char(12,0,arry]);
LCD_write_char(14,0,arry]);

LCD_write_char(6,1,arry]);
LCD_write_char(7,1,arry]);
LCD_write_char(12,1,arry]);
LCD_write_char(14,1,arry]);
}
/********************主函数区******************************/
void main(void)
{   

       
       
       TCCR0=0x0B;                                // 内部时钟,64分频(8M/64=125KHz),CTC模式
       TCNT0=0x00;
       OCR0=0x7C;                         // OCR0 = 0x7C(124),(124+1)/125=1ms
       TIMSK=0x02;                        // 允许T/C0比较匹配中断
       TCCR2=0X0B;             // 内部时钟,64分频(8M/64=125KHz),CTC模式
       TCNT2=0X00;
       OCR2=0X7C;            // OCR0 = 0x7C(124),(124+1)/125=1ms
         TIMSK|=0X80;
       
       SEI();
       DDRC|=LCD_DATA;   // 数据为输出
         DDRC|=LCD_RS|LCD_EN;//置位RS.EN
       LCD_init();
        main_menu_initial();      // 初
        set_menu_initial();
        time_power1_menu_initial();//始化
        total_time_initial();
        time_power_menu_initial();//菜单
       time_show_initial();
       about_menu_initial();    //项*/
        main_jianmian_show();
        /*m=EEPROM_read(0x01);   //初始
        nn=m;
        delay_nms(1);            //
        n1=EEPROM_read(0x02);    //化读EEPROM
        delay_nms(1);            //数据
        i=EEPROM_read(0x03);   //
        mm=i;
        delay_nms(1);            //
        j=EEPROM_read(0x04);   */ //
       
       
       
    while(1)   
       {
          
      disbuffer_main();

        }
}
   

   
       }
}

armok 发表于 2008-8-15 11:04:25

ba_wang_mao 发表于 2008-8-15 13:01:58

肯定你定义的显示变量在计算过程中(例如在1个子程序中先后被改变过值)
 1、在计算过程中,应该把“显示变量”的值送到一个中间变量中
 2、等到计算完后,再将中间变量的值送给“显示变量”,就不会出现上述问题了。
   总之,是多次赋值,然后被中断打断导致的原因。
页: [1]
查看完整版本: 马老师,又有问题请教你了,谢谢先