- UID
- 373967
- 帖子
- 9013
- 主題
- 2609
- 精華
- 0
- 積分
- 1004
- 楓幣
- 0
- 威望
- 981
- 存款
- 35926
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-23
|
以下是一個使用STC90C52RC和20顆LED燈的電子轉盤遊戲的範例程式碼
使用編碼器來控制LED燈的亮滅
並且在LED燈依次亮起的過程中計算得分:
#include <reg52.h>
sbit CLK=P1^0; //編碼器的CLK引腳
sbit DT=P1^1; //編碼器的DT引腳
sbit LATCH=P2^2; //595芯片的LATCH引腳
sbit CLK595=P2^1; //595芯片的CLK引腳
sbit DATA=P2^0; //595芯片的DATA引腳
unsigned char code ledChar[] = { //LED燈的顯示字符
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned char score = 0; //得分
void delay(unsigned int x) //延時函數
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=112;j>0;j--);
}
void sendData(unsigned char dat) //向595芯片傳送數據
{
unsigned char i;
for(i=0;i<8;i++)
{
DATA=dat&0x80;
CLK595=0;
CLK595=1;
dat<<=1;
}
}
void latchData() //控制595芯片的LATCH信號
{
LATCH=0;
LATCH=1;
LATCH=0;
}
void main()
{
unsigned char ledIndex=0; //LED燈的亮起位置
unsigned char ledShow=0; //LED燈的顯示值
unsigned char ledCount=0; //LED燈的計數器
while(1)
{
if(CLK==0 && DT==1) //編碼器的旋轉方向為正
{
ledIndex++;
if(ledIndex>19)
{
ledIndex=0;
if(ledShow==9) ledShow=0;
else ledShow++;
}
score++;
}
if(CLK==0 && DT==0) //編碼器的旋轉方向為負
{
ledIndex--;
if(ledIndex>19) ledIndex=19;
if(ledShow==0) ledShow=9;
else ledShow--;
}
sendData(ledChar[ledShow]); //向595芯片傳送LED燈顯示值
sendData(1<<ledIndex); //向595芯片傳送LED燈亮起位置
latchData(); //控制595芯片的LATCH信號
delay(500); //延時
ledCount++;
if(ledCount>19) ledCount=0;
ledIndex=ledCount;
if(ledCount%5==0) //每亮起5顆LED燈就加1分
{
score++;
}
}
}
在這個程式碼中,我們使用了STC90C52RC單片機和20顆LED燈,並且使用編碼器來控制LED燈的亮滅,並且在LED燈依次亮起的過程中計算得分。
具體來說,我們使用了P1口的0和1引腳來讀取編碼器的CLK和DT信號,並且使用P2口的0、1和2引腳來控制595芯片的DATA、CLK和LATCH信號,從而控制LED燈的亮滅。
在主函數中,我們不斷地讀取編碼器的CLK和DT信號,並且根據編碼器的旋轉方向來更新LED燈的亮起位置和顯示值,同時使用595芯片來控制LED燈的亮滅和顯示。
在每亮起5顆LED燈時,我們會將得分加1。 |
|