📄 anjian2.c
字号:
/***************************************************************************
应用范例 3-2
标题:范例 3-2
版本:1.0//
Target: STC89C52RC
程序描述:这个程序说明如何利用中断函数来判断按键的输入 .
利用延迟函数检测按键让CPU在执行循环是其他工作无法进行
把时间延迟的部分交给Timer0来处理,CPU可以处理别的事情
提高利用效率
****************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define TIMER0_COUNT 0xEE11 /*10000h-(12,000,000/(12*200))*/
#define TRUE 1
#define FALSE 0
#define TIMES 25
#define uint unsigned int
#define uchar unsigned char
code seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code bit_select[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char counter[3] = {0,0,0};
uint x,y,z,a,b,c,d;
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
sbit key4 = P3^3;
sbit FMQ = P3^4;
sbit JDQ = P3^5;
uchar key1_state,key2_state,key3_state,key4_state,key1_flog;
uchar flash,key_num,select,ups,downs;
/***********************************************
延迟子函数
************************************************/
/*
void delay_400us(uchar i)
{
uchar a,b;
for(a=i;a>0;a--)
for(b=100;b>0;b--)
_nop_();
}
void delay(uchar i)
{
while(i)
i--;
}
*/
void timer0_init(void)
{
EA=0;
TR0=0;
TMOD &= 0xF0;
TMOD |=0x01;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
/************************************************************
在T0的中断服务函数 timer0_isr 中检查是否有按键按下
*************************************************************/
void timer0_isr(void) interrupt 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
if(select != 0){
select--;
if(select == 0 && key1 == 0)
key1_state++;
if(key1_state == 6)key1_state=0;
}
else if (key1 == 0)select=TIMES;
if (ups !=0) { //检查ups等于0吗?
ups--; //如果ups不等于0,就将ups减1
if (ups==0 && key2==0) { //如果ups减到0,就检查P2_0==0
key_num++; // 如果P2_0是0就表示上数的弹跳按钮被按下,所以c加1
if(key_num==10) key_num=0; //如果c加到10,就将c恢复为0
}
}
else if (key2 == 0) ups=TIMES; //如果ups=0且P2_0=0就将ups设为25
if (downs !=0) { //检查downs等于0吗?
downs--; //如果downs不等于0,就将downs减1
if (downs == 0 && key3 == 0){ //如果downs 减到0,就检查P2_1=0
key_num--; // 如果P2_1是0就表示下数的弹跳按钮被按下,所以c减1
if(key_num==-1) key_num=9; //如果c减到-1时,就将c恢复为10
}
}
else if (key3 == 0) downs=TIMES; //如果downs=0且 P2_1 =0就将downs设为25
P0 = seven_seg[key_num];
P2 = bit_select[key1_state];
}
/************************************************
主函数
*************************************************/
void main()
{
timer0_init();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -