如何設計一個電子計算器

来源:https://www.cnblogs.com/Colin-Cai/archive/2018/01/05/8185972.html
-Advertisement-
Play Games

首先,不要誤解,我這裡的計算器是指硬體的計算器,至於純軟體的計算程式,乃至有高級功能的,比如可以求解方程甚至可編程之類,我以後找個時間來說說。這兩天看到有人在博問里問類似的問題,原問是想設計一個有著數位管、有著4x4鍵盤的硬體里的程式,不知道他具體想做什麼,只是給了一些建議。聯想到還有計算器這個東西 ...


  版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須註明原文網址

  http://www.cnblogs.com/Colin-Cai/p/8185972.html 

  作者:窗戶

  QQ:6679072

  E-mail:[email protected]

  首先,不要誤解,我這裡的計算器是指硬體的計算器,至於純軟體的計算程式,乃至有高級功能的,比如可以求解方程甚至可編程之類,我以後找個時間來說說。這兩天看到有人在博問里問類似的問題,原問是想設計一個有著數位管、有著4x4鍵盤的硬體里的程式,不知道他具體想做什麼,只是給了一些建議。聯想到還有計算器這個東西,這應該很容易作為電子工程或者微電子專業的一個作業的形式出現。以前我招實習生的時候,似乎也曾經叫其實現過計算器。這裡給出一點方案,以供參考。

 

  硬體

       

  框圖如上,主要有4大模塊,電源、控制、按鍵矩陣、數位管。

  電源有多種方案,簡單點可以用電池或者usb,這裡不作詳細討論。

  數位管採用共陰或共陽,每一位一個片選,選個6位的,一共14個引腳,都接在控制模塊IO引腳上,註意控制信號電平,必要的時候陽級接上拉電阻。

  鍵盤矩陣則是以下電路這樣的東西,由一堆按鍵組成,鍵盤矩陣對外8個信號都接在控制模塊的引腳上。另外,如果控制模塊的引腳無法配置上拉或下拉電阻,那麼PD0/PD1/PD2/PD3或者PD4/PD4/PD6/PD7/PD8就要接上拉電阻,這涉及到鍵盤矩陣的檢測原理。

  

  控制模塊,就看想用什麼編程了,如果想用單片機,可以選擇經典的51單片機、AVR單片機、PIC單片機都可以,STM32當然可以,只是ARM可以做遠比這個複雜的事情,沒必要殺雞用牛刀。當然,想學學ARM特別是STM32的編程,可以用STM32。PIC單片機和51單片機我只玩過彙編,不過現在單片機支持C語言都支持的蠻不錯,建議還是C語言編程。

  當然,也有想玩玩數字設計的,那麼cpld對於這個需求是合適的,沒必要上FPGA,可以用很早以前的,價格也便宜。對於資源多少沒有把握的話,你也可以先做數字設計,再來選器件。

 

  固件

  硬體設計好了之後,需要設計固件。

  如果控制模塊選用的是單片機,那麼我們一般是在裸機下編程,對於這幾款單片機我似乎只玩過彙編,但現在都21世紀了,我想至少也應該用C語言來玩玩。

  我們首先要明白數位管和鍵盤矩陣的原理:

  數位管相對簡單一些,一般來說,數位管每一位顯示的數字都不一樣。如我圖中的共陰6位數位管,當要顯示某位的時候,片選信號選擇是拉低,其他片選拉高,然後再把要顯示的數字所要點亮的管的引腳拉高,這樣,要顯示的這一位就顯示出了數字,而其他的幾位沒有任何顯示。然後快速切換,每一位都顯示該顯示的數字,那麼根據視覺暫留,我們就看到了完整的顯示。

  鍵盤矩陣可能要複雜那麼一些。首先,我們假設我們這裡PD5、PD6、PD7、PD8都被我們接了上拉電阻,並且IO都為高阻接收狀態,而不輸出。我們這裡只考慮一個鍵的識別,其實鍵盤矩陣也可以識別多個鍵。我們想一想,如果某個鍵按下去,比如左上角的S3按下之後,會發生什麼。在按下去之前,PD1、PD2、PD3、PD4和PD5、PD6、PD7、PD8之間並不聯通。但當S3按下去,PD1和PD4連在了一起。如果控制模塊把PD4的輸出射為高阻狀態,那麼如果PD0輸入低電平,那麼PD4讀取出來的應該為低電平,否則為高電平。於是我們把PD1、PD2、PD3、PD4這4個引腳每次只其中一個輸出低電平,其他三個輸出高阻狀態,每次都去讀取PD5、PD6、PD7、PD8,那麼就可以根據數值來判斷到底是哪個按鍵被按下。註意,此處PD1、PD2、PD3、PD4這4個引腳每次只其中一個輸出低電平的時候,其他三個不能輸出高電平,而應該是高阻,否則,如果有兩個按鍵被按下,則為短路狀態!

  另外要考慮按鍵的抖動問題,有多種解決方法,比如可以在判斷到一次按鍵按下之後0.3秒內不重覆判斷按鍵被按下。

  既然數位管的顯示需要定時去切換顯示位,而鍵盤矩陣也需要定時去切換輸入,那麼我們就可以設置一個定時器,把這兩個硬體的處理都掛在同一個定時中斷常式上作為驅動層,其邏輯使用上述的原理來實現,可以每次中斷給一個迴圈計數作為狀態,做一個moore機簡單明瞭,至於0.3秒內不重覆在交互里體現即可。程式中實現驅動層和應用層的層次分離,無論從調試硬體還是設計固件來說都是必要的,當然你也可以分的更細,比如HAL層。當然,非要在這裡把所有的一切糅合在一起也是能夠最終搞定的,但層次感差很多,並且一個初學者真的設計不好一個大的狀態機。

  設計一些全局變數用來應用層和驅動層交互顯示數據和所按按鍵。

  unsigned char num[6] ;//應用層寫,驅動層讀,用於6位數據的顯示

  unsigned char flag;//flag=0的時候,驅動層可以設置key,並把flag設為1;flag=1的時候,應用層可以讀取key,並把flag設置為0

  unsigned char key;//以代表是哪個鍵按下,分別給0、1、2、3、4、5、6、7、8、9、+、-、*、/、=、退格編碼為0~15

  以上數據有冗餘,在RAM極端受限的情況下,可以裁剪數據。

  而至於計算器所要實現的最高6位加減乘除,很容易實現,根本不需要大數計算,結合顯示和按鍵,構成應用層程式,想想一個計算器的功能,你應該很容易的畫出流程圖,不是嗎?

  如果作為學生,你選擇的是cpld/fpga,我也支持你,我覺得一個可以自己獨立做出來的學生應該還是不錯的,但也和之前處理器的程式實現類似:分別設計鍵盤驅動模塊、數位管驅動模塊、計算模塊,最後中間有一個核心模塊以一個狀態機形式存在,與其他三個模塊都相連。當然,每個模塊內部也可以分小模塊,比如數位管模塊裡面最好把解碼器單獨實現一個小模塊,而計算模塊裡加減乘除都是單獨的小模塊。

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者: "zyl910" 一、問題 今天需要調試一個SilverLight程式。運行時ie彈出了一個升級提示,於是手賤點了升級。 隨後便悲劇了,VS調試時報“無法啟動調試 未安裝 Silverlight Developer 運行時。請安裝一個匹配版本”。 打開控制面板里的“卸載或更改程式”,發現版本 ...
  • 今天給大家分享一個form表單的驗證,主要驗證範圍有姓名、性別、年齡和身份證號等一些常用的信息。說到驗證,主要是通過正則表達式來規範和驗證你所輸入的信息,用正則的約束和你所輸入的信息作比較顯示差異,從而得到驗證的結果,即“通過”或者“不通過”。在本篇中我使用了onblur事件,onblur 屬性在元 ...
  • 對於Word中的郵件合併功能,用戶可以將郵件合併後的結果文檔保存並列印,也可以通過郵件的形式發送,在很多場合需要使用到此功能。那對於編程人員,我們也可以在C#語言環境中通過代碼的形式來實現。根據需要先創建郵件合併模板後,可合併文本和圖片,在下麵的方法中,需要使用到組件Free Spire.Doc f ...
  • 常見的AOP設計都基於Remoting的RealProxy,或者基於Emit實現的動態代理,或者基於反射的Attribute掃描攔截。但是我們還有另類的攔截方案DynamicObject,只要我們繼承DynamicObject,重載幾個方法即可,話不多說,上代碼。 Demo: ...
  • 最近有項目需求,要實現在網頁上獲取伺服器信息。大家都知道,網頁程式很難獲取客戶端信息比如MAC、CPU、硬碟信息等等。當時想過一些種方案,比如:通過IE插件,但只能用IE瀏覽器。正為這事焦頭爛額時,一天回家的路上,突發靈感,能不能在客戶端放一個服務,通過JavaScript 訪問這個服務,這樣就可以 ...
  • 調用介面時報錯:WebApi 找到了與該請求匹配的多個操作,就算你的路由是唯一的,也報錯。 我已經配置了路由,如下 這時候就看看你的命名空間using裡面有沒有包含:using System.Web.Mvc; 如果有的話,就把它刪除掉,然後引用:using System.Web.Http; 出現上述 ...
  • 起因 最近碰到一件事:B同學在他電腦的 虛擬機中學習搭建伺服器碰到了問題,要我幫他看下。我總不能一個QQ遠程桌面連過去,那樣操作會卡到崩潰。 過去是最好的方法,不過他的電腦跟我不在一個區域網,又是虛擬機,要怎麼連過去呢? 怎麼解決? 有兩種方法: 1. 通過一臺公網伺服器,通過 命令建立反向隧道 2 ...
  • 2017年12月31日,我終於決定把自己的筆記本裝上 Ubuntu17.10系統,徹底把 Windows 給抹了。以前都還只是裝在虛擬機上,但最終還是下定了決心。用的這幾天與遇到過些許問題,特別是今天,發現系統預裝的中文輸入法在 vscode 上工作不了,最終才明白了是怎麼回事。趁著剛申請的博客,剛 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...