久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1627|回復: 0
打印 上一主題 下一主題
收起左側

51單片機小恐龍代碼優化與更新

[復制鏈接]
跳轉到指定樓層
樓主
/*******************聲明***********************/
//本demo主體小恐龍代碼(除更新內容外)來源于
//git開源代碼DOCTOROLIVE/Dino
//更新內容大量參考元器件官網例程、STC官網以及
//網友的分享。在此一并感謝 ^-^
/***************主要元器件清單******************/
//MCU: STC12C5A32S2
//OLED:2.42寸 IIC OLED(0.96也可,只是屏幕太小)
//充放電模塊:IP5306-CK主控(該模塊用于鋰電池3.7
//或4.2升壓為5V,盡量不要用DCDC升壓模塊,那種紋
//波很大,后期檢測電池容量數據會一直跳變,如果
//不檢測電池容量,DCDC模塊親試也是可以的。)
/*****************比較遺憾的*******************/
//不能自動保存分數,只能手動按按鈕做為保存標志
//斷電保存數據類型為int,理論上只能保存65535分
//為了防止數據溢出,判斷超過65530強制為65530
//并且分數覆蓋為亂碼作為小彩蛋。
//PS:12單片機有LVD中斷可以作為掉電保存,但是
//本人沒用過,最近也比較忙,有愿意分享的可以分
//享下 ^-^
/*****************更新內容*********************/
//1、新增多種隨機障礙物,太陽內容,內置彩蛋
//2、增加電池電量監測,可實時監測剩余電量
//3、新增斷電保存功能
//PS:電池電量監測的值可能需要修改,我的思路是
//電池滿電時電壓(4.2)作為滿電,電池帶不起裝置
//電壓(應該是1.8)設為0%,請根據電池參數不同進
//行調整。至于電池剩余容量監測采用電壓方式確實
//不準確,但是目前也沒有好的方法。
/********************后期**********************/
//1.打算加MP3模塊播放BGM,之前嘗試過用蜂鳴器,
//但是音質不理想,源碼仍保留,大家在工程中增
//添music.c,music.h,主函數添加musicInit(0.75)
//調用函數即可,這個例程也是用的別人的,一并感
///謝。
//2.硬件上增加太陽能電池板做額外供電,因為我的
//想法是把它做成一個掛墜,電池板功率和穩壓問題
//后續考慮。
/**********************************************/

和單片機大小對比



extern const unsigned char code COVER[]    ;
sbit key  = P0^1;//重啟游戲、跳躍按鈕
sbit save = P0^0;//保存數據按鈕
unsigned int highest_score=0;//最高分
unsigned int highest_temp_score=0;//外部函數調用eeprom
extern unsigned int    adc10_start(uchar channel);    //ADC通道選擇 P01 channel = 0~7

unsigned char get_key_val()
{
unsigned char key_num = 0;
if (key == 0)
    {
        delay1ms(10);
        if (key == 0)
        {
            key_num = 2;
        }
    }   
    return key_num;
}
void main(){      
  unsigned char key_num = 0,key_flag = 0;
    unsigned char cactus_category = 0;
    unsigned char cactus_length = 8;
    unsigned long int score = 0;

  unsigned int fly_n;//判斷飛機動畫是否過完   
    unsigned int ufo_n;//判斷飛機動畫是否過完   

    unsigned char height = 0;
  int cactus_pos = 128;//這個變量不能用unsigned,不知道為啥   
    //unsigned char cur_speed = 30;
    unsigned char failed = 0;
  unsigned char reset = 0;

    unsigned int adc0;
    //unsigned int adc1;
    //unsigned int adc2;

    P1ASF = (1 << ADC_CH0||1 << ADC_CH1||1 << ADC_CH2);    //12C5A60AD/S2系列模擬輸入(AD)選擇
    ADC_CONTR = ADC_360T | ADC_ON;

  OLED_Init();  //初始化OLED         
    //OLED_DrawBMP(0,0,128,8,COVER);
    OLED_DrawBMP_Faster(0,0,128,8,COVER);
    Delay_50ms(200);
    OLED_Clear();

    OLED_ShowString(10, 1, "Quote:", 10,10);
    OLED_ShowString(0, 2, "git", 8,6);
    OLED_ShowString(0, 3, "/DOCTOROLIVE/Dino", 8,6);
    Delay_50ms(250);

    OLED_Clear();
  //OLED_DrawBMP(0,0,128,8,COVER);
    OLED_DrawBMP_Faster(0,0,128,8,COVER);
    while(get_key_val()==0);
    delay_ms(100);
    OLED_Clear();

    while(1)
    {     
     if (failed == 1)
        {
            draw_restart();
            key_num = get_key_val();
            if (key_num == 2){
                score = 0;
                failed = 0;
                height = 0;
                reset = 1;
                oled_draw_dino_jump(reset);
                oled_draw_cactus_random(cactus_category, reset);
                fill_picture(0x00);
            }
            continue;
        }        
        score ++;
        if (height == 0) key_num = get_key_val();
        
        oled_draw_ground();
        oled_draw_cloud();
        
         
        //隨機太陽、ufo、飛機
        if(rand()%5000==2500||ufo_n==1){ufo_n=1;if(oled_draw_ufo()<128)ufo_n=1;else ufo_n=0;//5000 2500
        }else if(rand()%2000==1234||fly_n==1){fly_n=1;if(oled_draw_fight()<128)fly_n=1;else fly_n=0; //2000 1234
        }else oled_draw_sun();

        //oled_draw_dino();
        //oled_draw_dino_jump(0);
        //oled_draw_cactus();
        
        //if (height>0 || key_num > 0) height = oled_draw_dino_jump(reset);
        //else oled_draw_dino();
        cactus_pos = oled_draw_cactus_random(cactus_category, reset);
        if(cactus_category == 0) cactus_length = 8;
        else if(cactus_category == 1) cactus_length = 16;
        else cactus_length = 24;
        if (cactus_pos + cactus_length < 0)
        {
          cactus_category = rand()%8;    //障礙出現的隨機數
            oled_draw_cactus_random(cactus_category,1);//變量:植物隨機,建筑隨機,動物隨機
        }            
        if ((height < 16) && ( (cactus_pos>=16 && cactus_pos <=32) || (cactus_pos + cactus_length>=16 && cactus_pos + cactus_length <=32))){
        failed = 1;//注釋掉該行,不會判為撞上   
    }   
   
      if (height>0 || key_num > 0) height = oled_draw_dino_jump(reset);
        else oled_draw_dino();
        if(save==0){//保存數據            
        sector_Erase(0x0000);//寫入前先擦除數據
        Byte_write(0x0000,highest_score/10000);
        Byte_write(0x0001,highest_score%10000/1000);
        Byte_write(0x0002,highest_score%1000/100);
        Byte_write(0x0003,highest_score%100/10);
        Byte_write(0x0004,highest_score%10);
        }
      highest_temp_score=Byte_read(0x0000)*10000+
                                           Byte_read(0x0001)*1000+
                                           Byte_read(0x0002)*100+
                                           Byte_read(0x0003)*10+
                                           Byte_read(0x0004);
        if(Byte_read(0x0000)==255 &&  Byte_read(0x0001)==255 &&  Byte_read(0x0002)==255 &&  Byte_read(0x0003)==255 &&  Byte_read(0x0004)==255 ){highest_temp_score=0;}
        if(score > highest_score) highest_score = score;
        if(score < highest_temp_score && highest_temp_score > highest_score) highest_score = highest_temp_score;
        if(highest_score>65530){        
        OLED_ShowChar( 0,0,'%',12);
        OLED_ShowChar( 7,0,'$',12);
        OLED_ShowChar(14,0,'^',12);
        OLED_ShowChar(21,0,'&',12);
        OLED_ShowChar(28,0,'#',12);
        OLED_ShowChar(35,0,'&',12);
        OLED_ShowChar(42,0,'@',12);
        OLED_ShowChar(49,0,'+',12);
        OLED_ShowChar(56,0,'&',12);
        OLED_ShowChar(63,0,'/',12);
        OLED_ShowChar(70,0,'%',12);
        OLED_ShowChar(77,0,'$',12);
        OLED_ShowChar(84,0,'^',12);
        OLED_ShowChar(91,0,'&',12);
        OLED_ShowChar(98,0,'#',12);
        OLED_ShowChar(105,0,'&',12);
        highest_score=65530;
        }
          else{            
            OLED_ShowString(0, 0, "H", 12,6);
            OLED_ShowNum(10, 0, highest_score, 6, 12);
            OLED_ShowString(50,0, "N", 12,6);
          OLED_ShowNum(60, 0, score,         5, 12);
         }
   


        //電池電量監視   
        adc0=adc10_start(0);
        //adc1=adc10_start(1);
        //adc2=adc10_start(2);
        if(adc0>=900){
        adc0=900;}else if(adc0<=718){
        adc0=718;}
        OLED_ShowNum(93,0,adc0/9,3,12);
        OLED_ShowChar(112,0,'%',3);

        if (score % 100 == 0) ET1 = 1;
        else{
            ET1 = 0;
        }
        reset = 0;

        //速度固定,取消注釋更改速度   
        //cur_speed =score/20;
        //if (cur_speed > 49) cur_speed = 49;
        delay_ms(60/* - cur_speed*/);      
    }     
}     

原理圖: 無
仿真: 無
代碼: 代碼.7z (79.29 KB, 下載次數: 9)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干网站| 成人免费在线视频 | 91亚洲国产成人久久精品网站 | 日韩av第一页 | 中文字幕一区二区三区四区不卡 | 国产色网站 | 狠狠干狠狠操 | 成年人免费在线视频 | 久久久美女 | 国产午夜精品一区二区三区嫩草 | 亚洲精品一区二区 | 久久久一区二区三区四区 | 欧美第一区| 欧美精品在线免费 | 久久国产亚洲 | 欧美在线一区二区三区 | 成人自拍视频网站 | 中文字幕国产第一页 | 国产91色在线 | 亚洲 | 国产乱肥老妇国产一区二 | 日韩精品在线视频免费观看 | 亚洲精品大片 | 欧美一区二区小视频 | 成人片网址 | 亚洲一级黄色 | 欧美日韩福利视频 | 亚洲一区视频在线 | 亚洲欧美中文日韩在线v日本 | 国产极品车模吞精高潮呻吟 | 国产在线不卡视频 | 国产精品视频在线观看 | 成人精品国产免费网站 | 中文字幕 欧美 日韩 | 国产高清视频一区二区 | 亚洲精品久久久一区二区三区 | 久久久国产一区二区三区 | 色精品视频 | 国产性网| 精品欧美一区二区三区久久久 | 九九亚洲 | 亚洲视频在线观看 |