找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3100|回復(fù): 1
收起左側(cè)

基于STC89C52RC單片機(jī)LCD12864和DS1302的多匯編文件俄羅斯方塊+時(shí)間顯示

[復(fù)制鏈接]
ID:829402 發(fā)表于 2021-2-18 18:00 | 顯示全部樓層 |閱讀模式
本帖最后由 liuyken 于 2021-3-10 17:54 編輯

本人非計(jì)算機(jī)科班出身,學(xué)習(xí)單片機(jī)是出于個(gè)人興趣愛好。為了更好地理解單片機(jī)的工作原理,最近學(xué)了51單片機(jī)匯編語言,學(xué)習(xí)過程中為了練手,將就手中的一塊開發(fā)板寫了這個(gè)俄羅斯方塊小游戲,芯片是STC89C52RC,顯示屏是LCD12864(驅(qū)動(dòng)芯片UC1701X,不帶字庫),時(shí)鐘芯片是DS1302,游戲過程可以暫停/繼續(xù),可以存檔/讀取存檔(使用芯片自帶的eeprom),時(shí)間日期可調(diào)。游戲過程中碰撞檢測(cè)采用位運(yùn)算,即將圖塊與背景墻按位與,結(jié)果不為0則表示有碰撞。
代碼由9個(gè)asm文件組成
LCD12864和DS1302的連線請(qǐng)見代碼內(nèi)的定義
4x4矩陣鍵盤的說明請(qǐng)見下圖

矩陣鍵盤.jpg

貼上幾個(gè)代碼運(yùn)行的畫面:

1.jpg 2.jpg 3.jpg 4.jpg 5.jpg

部分代碼如下:

EXTRN BIT (key_pressed_flag,key_renewed_flag,confirm_option,menu_option,is_record_5,is_record_6,If_bottom,auto_down_flag)
EXTRN BIT (if_blink,is_pause,is_escape,Game_over_flag,is_record_1,is_record_2,is_record_3)
EXTRN BIT (is_set_time)

EXTRN DATA (Menu_options,Location_Y,Location_X,Current_block_no,Next_block_no,Current_shape)
EXTRN DATA (msn,auto_down_count,auto_down_count_2,auto_down_speed,Blink_count)

EXTRN IDATA (STACK)

EXTRN CODE (Init_LCD,Clean_screen,Draw_frame,Init_game,Clean_game_area,Load_enter_game_menu,Change_enter_menu_option)
EXTRN CODE (Move_menu_option_by_key,Display_records_menu,BCD_preload_scores,Display_preload_scores)
EXTRN CODE (Load_record,BCD_scores,Display_scores,Set_speed,Display_the_speed,Load_dropping_block)
EXTRN CODE (Create_shape_no,Display_the_next_block,Set_boundary,Copy_background,Cover_background,Display_by_bit)
EXTRN CODE (Recover_background,move_by_key,Judge_and_move_down,Stick_to_background,Judge_and_remove_full_lines,Judge_if_game_over)
EXTRN CODE (Move_down_remained_lines,Count_scores,Display_pause,resume_by_key,Load_exit_game_menu,Change_exit_menu_option)
EXTRN CODE (Display_game_over,Change_record_option,Escape_by_key,Save_record,Scan_keys)
EXTRN CODE (Get_time_from_DS1302,Init_DS1302,Display_time,Display_the_ok_button)
EXTRN CODE (Change_time_option_by_key,Change_time_by_key,Set_time_by_option,Set_time_keys)
EXTRN CODE (Enable_write_to_DS1302,Disable_write_to_DS1302,Write_confirmed_data_to_DS1302,Clr_record_flags)

PUBLIC Delay_msn

;====================================================================================================================================
CODE_SEG   SEGMENT   CODE
                RSEG  CODE_SEG

;====================================================================================================================================
;+++++++++++++++++++++
;主程序
                org 0000H
                ajmp START
                org 000BH
                ajmp Timer_0


                org 0030H
START:
                mov SP,#(STACK-1)

                mov TMOD,#01H                                          ;定時(shí)器0工作在模式1
                mov TH0,#0DBH                                          ;預(yù)裝載值56319,時(shí)長(zhǎng)約10ms
                mov TL0,#0FFH


                setb EA
                setb ET0
                setb TR0

                Lcall Init_LCD
                Lcall Init_DS1302
;進(jìn)入游戲菜單界面
Enter_start_game_menu:
                mov Menu_options,#1
                mov Blink_count,#2
                Lcall Clean_screen
                Lcall Draw_frame
                Lcall Init_game
Loop_start_game_menu:
                Lcall Clr_record_flags
                Lcall Get_time_from_DS1302
                Lcall Display_time
                Lcall Load_enter_game_menu
                jb key_pressed_flag,to_execute_enter_menu_key_motion
                ajmp Loop_start_game_menu
to_execute_enter_menu_key_motion:
                Lcall Move_menu_option_by_key
                jnb is_set_time,no_set_time
                clr is_set_time
                Ljmp to_set_time
no_set_time:
                Lcall Change_enter_menu_option
                jnb confirm_option,Loop_start_game_menu
                clr confirm_option
                jnb menu_option,Start_new_game
Load_read_records_menu:
                Lcall Clean_game_area
                mov Menu_options,#1
Loop_read_records_menu:
                Lcall Display_records_menu
                Lcall BCD_preload_scores
                Lcall Display_preload_scores
Loop_read_record_key:
                jb key_pressed_flag,to_execute_read_key
                ajmp Loop_read_record_key
to_execute_read_key:
                Lcall Move_menu_option_by_key
                Lcall Change_record_option
                jnb confirm_option,Loop_read_records_menu
                jnb is_record_5,to_load_data_and_start
                clr is_record_5
                ajmp Enter_start_game_menu
to_load_data_and_start:
                Lcall Load_record
                ajmp Loop_game
Start_new_game:
                Lcall Init_game
;游戲過程
Loop_game:
                Lcall BCD_scores
                Lcall Display_scores
                clr If_bottom                                                                  ;重置標(biāo)志
                Lcall Set_speed
                Lcall Display_the_speed                                                  ;輸入?yún)?shù)Auto_down_speed(該參數(shù)值由定時(shí)中斷服務(wù)程序Auo_move_down產(chǎn)生和修改)
                Lcall Load_dropping_block                                          ;輸入?yún)?shù)Current_block_no
                Lcall Create_shape_no                                                  ;輸出參數(shù)Next_block_no
                Lcall Display_the_next_block                                  ;輸入?yún)?shù)Next_block_no
                Lcall Set_boundary
Loop_dropping_block:
                Lcall Copy_background
                Lcall Cover_background
                Lcall Display_by_bit
                Lcall Recover_background
Loop_by_keys:
                jb If_bottom,jump_out_loop_keys
                jb auto_down_flag,to_auto_move_down
                jb key_pressed_flag,to_execute_key_motion
                ajmp Loop_by_keys
to_execute_key_motion:
                Lcall move_by_key
                jb is_pause,to_pause_the_game
                jb is_escape,Enter_exit_game_menu
                ajmp Loop_dropping_block
to_auto_move_down:
                Lcall Judge_and_move_down
                clr auto_down_flag
                ajmp Loop_dropping_block
jump_out_loop_keys:
                Lcall Stick_to_background
                Lcall Judge_and_remove_full_lines
                Lcall Judge_if_game_over
                jb Game_over_flag,Is_game_over
                Lcall Move_down_remained_lines
                Lcall Display_by_bit
                Lcall Count_scores
                mov Location_Y,#0
                mov Location_X,#7
                mov Current_block_no,Next_block_no
                mov Current_shape,#0
                setb key_renewed_flag
                ajmp Loop_game
to_pause_the_game:
                Lcall Display_pause
to_loop_pause:
                jb key_pressed_flag,to_execute_pause_key
                ajmp to_loop_pause
to_execute_pause_key:
                Lcall resume_by_key
                jnb is_pause,to_quit_pause
                ajmp to_loop_pause
to_quit_pause:
                ajmp Loop_dropping_block
;退出游戲界面
Enter_exit_game_menu:
                clr is_escape
                mov Menu_options,#1
                Lcall Clean_game_area
Loop_exit_game_menu:
                Lcall Load_exit_game_menu
Loop_exit_game_key:
                jb key_pressed_flag,to_execute_exit_game_key
                ajmp Loop_exit_game_key
to_execute_exit_game_key:
                Lcall Move_menu_option_by_key
                Lcall Change_exit_menu_option
                jnb confirm_option,Loop_exit_game_menu
                jb is_record_1,to_execute_exit_option_1
                jb is_record_2,to_execute_exit_option_2
                jb is_record_3,to_execute_exit_option_3
to_execute_exit_option_1:
                clr is_record_1
                ajmp Enter_save_records_menu
to_execute_exit_option_2:
                clr is_record_2
                ajmp Enter_start_game_menu
to_execute_exit_option_3:
                clr is_record_3
                ajmp Loop_dropping_block
;Game Over畫面
Is_game_over:
                Lcall Display_game_over
Loop_game_over:
                jb key_pressed_flag,to_execute_escape_key_motion
                ajmp Loop_game_over
to_execute_escape_key_motion:
                Lcall Escape_by_key
                jnb is_escape, Loop_game_over
                clr is_escape
                ajmp Enter_start_game_menu
;進(jìn)入保存記錄界面
Enter_save_records_menu:
                clr is_escape
                mov Menu_options,#1
                Lcall Clean_game_area
Loop_save_records_menu:
                Lcall Display_records_menu
                Lcall BCD_preload_scores
                Lcall Display_preload_scores
Loop_save_record_key:
                jb key_pressed_flag,to_execute_save_key
                ajmp Loop_save_record_key
to_execute_save_key:
                Lcall Move_menu_option_by_key
                Lcall Change_record_option
                jnb confirm_option,Loop_save_records_menu
                jnb is_record_5,to_save_data_and_restart
                clr is_record_5
                ajmp Enter_exit_game_menu
to_save_data_and_restart:
                Lcall Save_record
                ajmp Enter_start_game_menu
to_set_time:
                mov Menu_options,#1
                Lcall Clean_game_area
                Lcall Get_time_from_DS1302
Loop_set_time_key:
                Lcall Display_time
                Lcall Display_the_ok_button
                jb key_pressed_flag,to_execute_time_key
                ajmp Loop_set_time_key
to_execute_time_key:
                jnb confirm_option,to_execute_set_time
                jnb is_record_6,to_execute_set_time
                Lcall Enable_write_to_DS1302
                Lcall Write_confirmed_data_to_DS1302
                Lcall Disable_write_to_DS1302
                clr confirm_option
                Ljmp Enter_start_game_menu
to_execute_set_time:
                Lcall Set_time_keys
                Lcall Change_time_option_by_key
                Lcall Change_time_by_key
                Lcall Set_time_by_option
                Ljmp Loop_set_time_key
;====================================================================================================================================






;+++++++++++++++++++++
;延時(shí)毫秒,毫秒數(shù)由msn設(shè)定
;11.0592M晶振
Delay_msn:       
                push ACC
                push PSW
                push 05H
                push 06H
;---------------------
D1:
                mov R5,#4
D2:
                mov        R6,#113
D3:
                djnz R6, D3
                djnz R5,D2
                djnz msn,D1
;---------------------
                pop 06H
                pop 05H
                pop PSW
                pop ACC
                ret
;+++++++++++++++++++++


;====================================================================================================================================
;+++++++++++++++++++++
;定時(shí)器0,周期檢測(cè)按鍵
Timer_0:
                push ACC
                push PSW
;---------------------
                Lcall Scan_keys
                inc auto_down_count
Loop_for_adjust_time:
                mov A,#10
                clr C
                cjne A,auto_down_count,quit_timer_0
                clr C
                mov auto_down_count,#0
                djnz auto_down_count_2,to_blink_count
                setb auto_down_flag
                mov A,#10
                subb A,auto_down_speed
                mov auto_down_count_2,A
to_blink_count:
                djnz Blink_count,quit_timer_0
                cpl if_blink
                mov Blink_count,#6
quit_timer_0:
                clr C
                mov TH0,#0DBH
                mov TL0,#0FFH
;---------------------
                pop PSW
                pop ACC
                reti
;+++++++++++++++++++++





;====================================================================================================================================
END

51hei.png
全部程序51hei下載地址:
asm文件.rar (24.84 KB, 下載次數(shù): 19)





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:944211 發(fā)表于 2021-6-24 19:47 | 顯示全部樓層
這個(gè)看著不錯(cuò),還是可以運(yùn)用于硬件也就是開發(fā)板上的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表