马老师,又有问题请教你了,谢谢先
我有个问题百思不得其解,我定义一个变量,然后送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();
}
}
}
} 肯定你定义的显示变量在计算过程中(例如在1个子程序中先后被改变过值)
1、在计算过程中,应该把“显示变量”的值送到一个中间变量中
2、等到计算完后,再将中间变量的值送给“显示变量”,就不会出现上述问题了。
总之,是多次赋值,然后被中断打断导致的原因。
页:
[1]