8路搶答器(帶倒計時)
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P1^2;
unsigned char code seg[]={0,1,2,3,4,5,6,7};
unsigned char code dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan(); //鍵盤掃描
void play();
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
void delay1()
{
int i,j;
for(i=200;i>0;i--)
for(j=1000;j>0;j--);
}
/******************************************************************/
/* 主函數 */
/******************************************************************/
void main()
{
uint gewei,shiwei,i,j,k,flag=1;
uchar key;
uint time=11;
while(time--) //十秒倒計時
{
if(time==0)
break;
shiwei=dofly[time/10];
gewei=dofly[time%10];
for(j=0;j<100;j++) //數碼管動態掃描,隻顯示前兩位
{
delay(300);
P0=gewei; //段選
P2=1; //位選
delay(300);
P0=shiwei;
P2=0;
}
}
for(k=5;k>0;k--) //無源蜂鳴器響5聲
{
for(i=0;i<200;i++)//喇叭發聲的時間循環,改變大小可以改變發聲時間長短
{
delay(80); //參數決定發聲的頻率,估算值,可以自行更改參數並
SPK=!SPK;
}
SPK=1; //喇叭停止工作,間歇的時間,可更改
delay(80);
}
while(1) //8路搶答器搶答
{
key=keyscan(); //調用鍵盤掃描,
{
if(key==0x7e) { P0=dofly[1],P1=0x00;play();}
if(key==0xbe) { P0=dofly[2],P1=0x00;play();}
if(key==0xde) { P0=dofly[3],P1=0x00;play();}
if(key==0xee) { P0=dofly[4],P1=0x00;play();}
if(key==0x7d) { P0=dofly[5],P1=0x00;play();}
if(key==0xbd) { P0=dofly[6],P1=0x00;play();}
if(key==0xdd) { P0=dofly[7],P1=0x00;play();}
if(key==0xed) { P0=dofly[8],P1=0x00;play();}
}
}
}
/*------------------------------------------------
鍵盤掃描程序
------------------------------------------------ */
uchar keyscan() //鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l;//行列值中間變量
P3=0xf0; //行線輸出全為0
P1=0xff;
cord_h=P3&0xf0; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0xf0; //讀入列線值
P3=cord_h|0x0f; //輸出當前列線值
cord_l=P3&0x0f; //讀入行線值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}
// return(0x00); //返回該值
}
void play() //8個數碼管動態掃描,死循環
{
int j=0,i;
for(i=1;i>0;i++) //a死循環
{
P2=seg[j++];
{
if(j==8)
j=0;
}
delay(100);
}
}
最後更新:2017-04-03 14:54:35
上一篇:
J2EE部署項目至Tomcat報錯:Unable to read TLD "META-INF/c.tld"
下一篇:
Eclipse SVN (Subclipse的更新日誌)、版本集合(1.10.0起)、更新、安裝方法!
配置 mysql/mariadb sphinxSE 錯誤解決 1st column must be bigint to accept 64-bit DOCID
Asp.net相關書籍
jQuery中通過$.browser來判斷瀏覽器
Java實現全排列、組合算法
graph driver-device mapper-01driver初始化
IDC:中國存儲市場推動力主要來自政府
大神手把手教你:(Python)序列數據的One Hot編碼
深度學習中的基礎線性代數-初學者指南
PostgreSQL 10.0 preview 功能增強 - 邏輯複製支持並行COPY初始化數據
WCF 4.0一個鮮為人知的改變[兼書名征集]