本人小白,正在学习51单片机,在使用1602单片机是,遇到一个问题:
我用一个按键(外部中断0)来做一个显示屏的切换,但是加了这个外部按键中断后,发现显示一直在跳闪,不知道什么原因造成的,改怎么解决,谢谢各位大哥大姐帮忙!!谢谢
程序:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P3^2; //定义P32口是k1
u8 k,l,b=0;
u8 Disp1[]=(" Heart Rate ");
u8 Disp2[]=(" Heart Rate ");
u8 Disp3[]=(" Right ");
u8 Disp4[]=(" False ");
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,j=1时,大约延时10us
*******************************************************************************/
void delay(u16 j)
{
while(j--);
}
/*******************************************************************************
* 函 数 名 : Int1Init()
* 函数功能 : 设置外部中断1
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
Int0Init(); //设置外部中断0
while(1)
{
u8 i;
if(b==0)
{
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp1[i]);
delay(100);
}
LcdWriteCom(0x40+0x80);
for(i=0;i<16;i++)
{
LcdWriteData(Disp2[i]);
delay(100);
}
}
if(b==1)
{
LcdInit();
for(k=0;k<16;k++)
{
LcdWriteData(Disp3[k]);
}
}
if(b==2)
{
LcdInit();
for(l=0;l<16;l++)
{
LcdWriteData(Disp4[l]);
}
}
}
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void Int0()interrupt 0//外部中断0的中断函数
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
b=b+1;
if(b>2)
{
b=0;
}
while(!k1); //检测按键是否松开
}
}
}
我用一个按键(外部中断0)来做一个显示屏的切换,但是加了这个外部按键中断后,发现显示一直在跳闪,不知道什么原因造成的,改怎么解决,谢谢各位大哥大姐帮忙!!谢谢
程序:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P3^2; //定义P32口是k1
u8 k,l,b=0;
u8 Disp1[]=(" Heart Rate ");
u8 Disp2[]=(" Heart Rate ");
u8 Disp3[]=(" Right ");
u8 Disp4[]=(" False ");
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,j=1时,大约延时10us
*******************************************************************************/
void delay(u16 j)
{
while(j--);
}
/*******************************************************************************
* 函 数 名 : Int1Init()
* 函数功能 : 设置外部中断1
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
Int0Init(); //设置外部中断0
while(1)
{
u8 i;
if(b==0)
{
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp1[i]);
delay(100);
}
LcdWriteCom(0x40+0x80);
for(i=0;i<16;i++)
{
LcdWriteData(Disp2[i]);
delay(100);
}
}
if(b==1)
{
LcdInit();
for(k=0;k<16;k++)
{
LcdWriteData(Disp3[k]);
}
}
if(b==2)
{
LcdInit();
for(l=0;l<16;l++)
{
LcdWriteData(Disp4[l]);
}
}
}
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void Int0()interrupt 0//外部中断0的中断函数
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
b=b+1;
if(b>2)
{
b=0;
}
while(!k1); //检测按键是否松开
}
}
}