参考源代码:
//*************************************************************************************************
//*************************************************************************************************
//<程序名>:俄罗斯方块游戏 **
//<版本说明>:此版是第一版,在LCD1608第4版基础上改进而来,目前只可以绘制游戏区域的边框。 **
//<完成时间>:2007年8月28日 **
//<作者>:从零开始单片机 **
**
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* 头文件及宏定义 *
// *
//**********************************************************************************************
#include “includes.h”
#define TIME1H 0x3C
#define TIME1L 0xB0 //定时器1溢出时间:50ms
#define SCANPORT P1
//*************************************************************************************************
//* *
//* 全局变量****** *
//* *
//*************************************************************************************************
//unsigned char code uca_TEST[]={0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0};
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //键盘防抖动标志位。
//当按键中断产生时,首先判断此位。
//0–执行键盘扫描及键码处理程序;1–不执行。
bit b_KillShock=0; //防抖标志清除位:0–不清除;1–清除。
unsigned char uc_KillCount=0; //抖动标志清除计数,使用定时器1。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描开启标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyScan=0; //0–不扫描;
//1–扫描。
//*************************************************************************************************
//* *
//* 主函数 *
// *
//************************************************************************************************
/*********************** main ************************/
void main(void)
{
vLCDInitialize();
vShowOneChin(0,0,uca_QING);
vShowOneChin(2,0,uca_SHU);
vShowOneChin(4,0,uca_RU);
vShowOneChin(6,0,uca_MAOHAO);
vShowGraph(2,60,32,4,uca_Pig);
vShowFrame();
SCANPORT=0x0F;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; // 中断方式:下降沿。
EX0=1; // 开启外部中断。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //开启定时器1
ET1=1; //开定时器1中断
EA=1;
while(1)
{
if(b_KeyScan==1) //如果有按键按下,则进行按键扫描和键码处理。
{
b_KeyScan=0;
vKeyProcess(ucKeyScan());
}
}
}
//*************************************************************************************************
//* *
//* 外部中断0,用于开启键盘扫描及键码处理 *
// *
//**************************************************************************************
void vINT0(void) interrupt 0
{
if(b_KeyShock==0)
{
b_KeyScan=1; //开启键盘扫描标志。
b_KeyShock=1; //设置防抖动标志。
}
else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
//300ms后清除防抖动标志。
}
//*************************************************************************************************
//* *
//* 定时器1中断,用于计时功能和防抖动标志清除*********** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock1)
{
if(uc_KillCount5) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=0;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
}
上一篇:51单片机实验1——数码管显示串行口接收的字符的ASCII码
下一篇:单片机四线步进电机驱动
推荐阅读最新更新时间:2024-11-18 10:34
设计资源 培训 开发板 精华推荐
- RDA5807FP便携式收音机
- 具有 IADJ 误差的 ZLDO1117 可调稳压器的典型应用
- 使用 MaxLinear, Inc 的 SP6655 的参考设计
- 使用 ON Semiconductor 的 KA317TU 的参考设计
- ADM7160 超低噪声、200mA 线性稳压器的典型应用,用于为 16 位/18 位 ADC 供电
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用,用于 ±15V 输出,具有堆叠式 ADR5045 器件
- DC919A-E,具有 LTC2203 CMOS 输出、DC 输入、25Msps 16 位 ADC、DC
- 使用 Microchip Technology 的 SG317 的参考设计
- 使用 ROHM Semiconductor 的 BD48L33G-TL 的参考设计
- 使用 Analog Devices 的 LTC3615HUF 的参考设计