单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏
為了讓大家更深入地了解底層的原理,在講解時特意選擇了51單片機(而非STM系列),另外16*16點陣由譯碼器和移位緩存器直接驅動(而非MAX系列芯片),搖桿也利用ADC功能判斷方向。
那如何讓單片機驅動這256個點呢?直接用IO口驅動顯然不夠且十分浪費。為了解決這個問題,我們要引入動態掃描的方法,它利用了人類的視覺暫留現象:如果讓點陣的每一行分別輪流顯示,當掃描速度足夠高時,我們并不會看到一行一行地閃動,而是一幅完整的圖像。
在驅動這個16*16點陣時,單片機會首先選中一行,然后將16位的數據輸出以顯示一行,在做短時間的停頓后接著再選擇下一行輸出,如此往復對這16行進行高速掃描就可以在點陣上看到要顯示的圖像。
先來講解一下16*16點陣的原理。為了方便大家理解,我們先來看一下8*8點陣的電路圖。它實際上由64個LED組成,每行共陰,每列共陽,當某行輸出信號為低電平時,整一行LED陰極均為低電平,當在列上分別輸入不同的電平信號時,交叉點的LED就會有不同的亮滅情況,以此不斷循環掃描,就可以顯示完整的圖像。
8*8點陣的原理圖
16*16點陣實質上為4個8*8點陣組合而成,對它的控制和8*8點陣也是大同小異,同樣是分別掃描所有的行并輸出列的數據,以此輸出完整的16*16圖像。
我們首先來考慮點陣行的控制,由于要節省單片機的引腳,我們使用74HC138譯碼器來控制不同的行,這里采用兩個譯碼器分別對16行進行選擇。
74HC138引腳圖
VDD和GND分別為電源正負極,A0,A1,A2負責數據輸入,Y0到Y7進行譯碼輸出,E1,E2,E3為使能引腳,只有當E1和E2均為低電平,E3為高電平時,譯碼器才會正常輸出,否則只會全部輸出高電平。在使用時,只需要輸入3位二進制加權地址,就能提供8個互斥的低有效輸出。
74HC138架構圖
由于2^3=8,那3位的二進制數據剛好能用于輸出8位的互斥數據,我們正是借用這個特性來對點陣進行行掃描。根據譯碼器數據手冊提供數據,我們可以得知使用3位二進制加權地址來輸出8位的互斥信號的真值表。 74HC138真值表 | |||
由于譯碼器輸出電流較低,必須借助三極管分別放大輸出信號才能正常驅動LED。此處將譯碼器的輸出接口分別連接到PNP三極管的基極,然后發射極連接點陣的行引腳,由于所有三極管的發射極均連接在VCC上,當輸入低電平時,集電極就會輸出高電平,否則就輸出低電平,以此放大譯碼器的控制信號。
74HC138輸出的原理圖
兩個74HC138的連接圖對比
兩個譯碼器的連接圖稍有不同,對比一下可以發現它巧妙地利用了74HC138的使能特性,當G為高電平時,兩個譯碼器均無輸出,當G為低電平且D為低電平時,第一個譯碼器使能而第二個譯碼器關閉,反之第二個譯碼器使能而第一個譯碼器關閉;所以這里就可以直接使用A B C D對16行進行選擇控制,G使能全部輸出。
同樣是為了節省IO口,我們使用了兩個74HC595級聯進行列輸出,由于列輸出內容是不確定的,所以我們要借助位移緩存器將串行數據轉化為并行數據。
74HC595引腳圖
這里VCC和GND分別為電源正負極,Q0到Q7為輸出接口,DS為數據輸入口,SHCP為數據輸入時鐘,STCP為輸出存儲器鎖存時鐘線,MR用于清零移位寄存器,OE為輸出使能,Q7S可以連接到下一級位移緩存器的DS。
查閱數據手冊可知,當SHCP產生一個上升沿的時候,移位寄存器讀入DS上的電平信號,并且所有的數據都向后移動了一位。當數據輸入完畢時,在STCP上發送一個上升沿可以讓移位寄存器的數據鎖存輸出,由于有移位寄存器的存在,進行數據輸入的時候可以有效避免“鬼影”問題。此處為了方便大家理解引入了IC的架構圖。
74HC595架構圖
在這個制作中我們不需要對移位緩存器進行單獨操作,因此將OE接地,MR接VCC即可。把SHCP和STCP分別合并同時引出為CLK和LATCH輸入線;第二個IC的DS接到第一個IC的級聯輸出端上,以實現多個74HC595的級聯;再將第一個IC的DS端引出為DATA輸入線,這樣子我們用三根線就可以實現16位數據的串行輸出。
兩個74HC595的連接圖
? ? 總結一下,這個16*16點陣需要兩根電源線和八根數據線進行驅動,其中A B C D和G進行選擇,DATA,CLK和LATCH串行輸出16位的列顯示數據。在選通一行后,74HC595輸出該行數據,總共16行依次循環進行動態掃描,讓16*16的點陣顯示出來需要的文字或者圖形。
? ? 接著,我們用搖桿來控制蛇的走向。搖桿的本質是X軸和Y軸的兩個電位器,在搖桿運動的時候,通過讀取兩個電位器的輸出電壓就可以分別得到X軸和Y軸的坐標。由于得到是模擬數據,利用單片機的ADC功能來獲取電壓大小即可得到前后左右的運動數據。
? ? 目前國內大部分51單片機為STC的產品,因此我們選用了STC8單片機作為控制中心來驅動整個游戲。鑒于貪吃蛇程序在系統平臺上編寫過于簡單,這里就不再贅述游戲邏輯的編程。下面的C語言代碼用Keil編譯后通過串口燒錄進單片機即可。
頭文件及常量定義
全局變量定義
定義八個數據線的引腳位置
全局初始化
向74HC595發送8bits的數據的函數
借助位運算進行行選
驅動整個點陣
對搖桿的掃描及響應
定時器中斷
生成隨機點
貪吃蛇的游戲邏輯
簡易的main函數
以上就是整個貪吃蛇游戲的主要代碼,分為從硬件上驅動IC和在軟件上進行游戲的過程,雖然很簡單但能讓初學者了解51單片機對74系列IC的使用和ADC的讀取,也能對單片機的編程加強認知。謝謝大家!
圖文:林鉅聰
排版:劉楊
審核:梁慶鏵
總結
以上是生活随笔為你收集整理的单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue如何把数组转为json数组_vue
- 下一篇: php fuzzy,模糊C均值聚类算法(