色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

應廣單片機系列——基本應用程序框架

聚豐開發 ? 2018-10-18 12:49 ? 次閱讀

注:本文是作者以前發表在其個人博客,現在發布到電子發燒友專欄


單片機工程師面對一種新單片機時,最希望的是能有一個簡單的樣例,這個樣例連上仿真器就能運行,里面最好包含一些基本功能,這樣工程師就可以在這個樣例的基礎上很快改出自己需要的代碼。

這里我以應廣pdk22c12寫了一段程序框架,已經包含對這個單片機的各種基本設置,拿回去就可以自己進行仿真調試,相信能讓新接觸應廣單片機的朋友很快上手。

//-----------------------------------------
//應廣單片機軟件基本框架例程
//本例僅供參考,歡迎指正程序中的問題
//本例是根據應廣單片機的特點創建的基本程序框架
//包含定時中斷、外部中斷、AD轉換、段位數碼管顯示,簡單按鍵處理等功能
//用戶在本例基礎上很容易就能改出自己需要的程序

.chippdk22c12
//{{PADAUK_CODE_OPTION
.Code_OptionLVD2.4V~2.9V// Maximum performance = 8 MIPS
.Code_OptionSecurityEnable// Security 7/8 words Enable
//}}PADAUK_CODE_OPTION
//#define MOB_FLASH_MODE

KEYequpa.5

//定義數碼管的IO口,這里是顯示三個8
LED_Aequpa.1
LED_Bequpa.0
LED_Cequpa.7
LED_Dequpa.6
LED_Eequpb.7
LED_Fequpb.6
LED_Gequpb.5
LED_DPequpb.1
LED_COM1equpa.2
LED_COM2equpa.3
LED_COM3equpa.4
LED_A_ONequset1LED_A
LED_A_OFFequset0LED_A
LED_B_ONequset1LED_B
LED_B_OFFequset0LED_B
LED_C_ONequset1LED_C
LED_C_OFFequset0LED_C
LED_D_ONequset1LED_D
LED_D_OFFequset0LED_D
LED_E_ONequset1LED_E
LED_E_OFFequset0LED_E
LED_F_ONequset1LED_F
LED_F_OFFequset0LED_F
LED_G_ONequset1LED_G
LED_G_OFFequset0LED_G
LED_DP_ONequset1LED_DP
LED_DP_OFFequset0LED_DP
SELECT_LED1macro
set1LED_COM2
set1LED_COM3
set0LED_COM1
endm
SELECT_LED2macro
set1LED_COM1
set1LED_COM3
set0LED_COM2
endm
SELECT_LED3macro
set1LED_COM1
set1LED_COM2
set0LED_COM3
endm
ALL_LED_OFFmacro
set1LED_COM1
set1LED_COM2
set1LED_COM3
LED_A_OFF
LED_B_OFF
LED_C_OFF
LED_D_OFF
LED_E_OFF
LED_F_OFF
LED_G_OFF
LED_DP_OFF
endm

LED_DELAYmacro
delay250
delay250
endm

wordinit_timer
//用于數碼管顯示時進行查表轉換
worddisp_ptr
worddisp_data
worddisp_data_temp

byteXms
bytems_cnt
bytepb2_voltage

//用于數碼管顯示
bytedisp1_buf
bytedisp2_buf
bytedisp3_buf
bytedisp_temp
byteled1_buf
byteled2_buf
byteled3_buf

//用于定時中斷計時
bytetimer_cnt
//用于單鍵按鍵判斷
bytekey_cnt
bitkey_press_flag

//定義標志位,用于數碼管顯示和閃爍控制
bitled_en_flag
bitled_flash_flag
bitupdate_disp_flag

//應廣單片機程序入口,第一條必須為跳轉到第一個內核主程序入口地址的指令,第二條為第二個內核,有幾個內核就有幾條
.romadr 0x000
gotomain0
gotomain1


//應廣單片機中斷程序入口地址,所有中斷共用同一個入口,需要用戶自己判斷中斷類型
.romadr 0x010
pushaf
if(intrq.T16)//定時中斷
{
stt16init_timer//重設定時器
if(timer_cnt < 9)?//得到1000ms間隔
{
timer_cnt ++
}
else
{
timer_cnt = 0
if(led_flash_flag)//數碼管閃爍處理
{
led_flash_flag = 0
}
else
{
led_flash_flag = 1
}
}
intrq.T16 = 0
}
elseif(intrq.PB0)//PB0外部中斷
{
if(pb.0)
{
//讀到PB0狀態為高,為上升沿
nop//添加用戶自己的代碼
}
else
{
//讀到PB0狀態為低,為下降沿
nop//添加用戶自己的代碼
}
}
intrq.AD = 0//強制清除AD中斷標志位,防止意外進入AD中斷后程序不停響應
intrq.PA0 = 0//強制清除PA0外部中斷標志位,防止意外進入PA0中斷后程序不停響應
popaf
reti

//----------------------------------------
//input: ms
//用該函數可以再4M的頻率下得到近似1毫秒的延時,在第一個內核中調用中斷會導致延時加長
//----------------------------------------
delayXms:
while(Xms)
{
wdreset//這里需要有清看門狗操作,否則有可能在長延時下導致看門狗溢出復位
ms_cnt = 20
while(ms_cnt)
{
delay195
ms_cnt--
}
Xms--
}
ret


//----------------------------------------
//
//對PB2進行AD轉換,得到上面的電壓
//----------------------------------------
get_pb2_voltage:
//對新的一路AD通道進行AD轉換時,第一次轉換的結果可能不可靠,這里連續轉換兩次,取第二次結果
//如果連續對同一通道進行AD轉換,可以只轉換一次
adcc = 0b10_0010_00//enable ADC, select pb2
ad_start = 1
wait1ad_start//等待AD轉換結束
a = adcr//放棄第一次轉換結果
ad_start = 1
wait1ad_start
pb2_voltage = adcr//存儲第二次轉換結果
ret

//數碼管BCD顯示用的轉換表,最后的兩個0x00可以不要
//數碼管的a,b,...,g,dp分別對應bit7,bit6,...,bit0
bcd_tbl://0~9
dc0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00,0x00
//----------------------------------------
//以十進制形式顯示數據disp_data
//只修改顯示緩沖區
//----------------------------------------
update_led_disp_buf:
//a,b,...,g,dp --> bit7,bit6,...,bit0
if(!update_disp_flag)
{
disp_data_temp = disp_data//先將需要顯示的數據放到臨時中間變量中,防止轉換時數據更新導致顯示出錯

//得到數據管第一位LED1的BCD碼
disp_temp = 0
while(disp_data_temp >= 100)//直接用循環減實現除法
{
disp_data_temp = disp_data_temp - 100
disp_temp ++
}
disp_ptr = bcd_tbl//查表操作
disp_ptr = disp_ptr + disp_temp
ldtabldisp_ptr
movdisp1_buf,a
//得到數據管第二位LED2的BCD碼
disp_temp = 0
while(disp_data_temp >= 10)
{
disp_data_temp = disp_data_temp - 10
disp_temp ++
}
disp_ptr = bcd_tbl
disp_ptr = disp_ptr + disp_temp
ldtabldisp_ptr
movdisp2_buf,a
//得到數據管第三位LED3的BCD碼
disp_temp = disp_data_temp
disp_ptr = bcd_tbl
disp_ptr = disp_ptr + disp_temp
ldtabldisp_ptr
movdisp3_buf,a

update_disp_flag = 1
}

ret

//第一個內核程序入口
//----------------FPPA0-------------------
main0:

.ADJUST_OTP_IHRCR8MIPS// IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used

sp = 0x30//設置第一個內核的堆棧地址

//禁止中斷和定時器
disgint
inten = 0
mova,0b000_11_111//disable timer
movt16m,a

//小延時后在修改其它系統狀態設置
delay200
clkmd.1 = 1//打開看門狗,這個設置盡量靠前,以增強可靠性
wdreset//清看門狗

//設置IO口
pac = 0b1101_1111//PA5設置 IN
paph = 0b0000_0000
pbc = 0b1111_1010//PB2設為模擬輸入不開上拉電阻,PB0設為輸入
pbph = 0b0000_0000//poll high

ALL_LED_OFF

init_timer = 7768//從7768進行校準為100ms
mova,0b100_11_111
movt16m,a
stt16init_timer

//上電后清需要使用的變量
key_cnt = 0
disp1_buf = 0
disp2_buf = 0
disp3_buf = 0
led1_buf = 0
led2_buf = 0
led3_buf = 0
update_disp_flag = 0
timer_cnt = 0
disp_data = 000
led_en_flag = 1 //數碼管進行顯示

//將PB2設為模擬輸入口進行AD轉換
adcdi = 0b0000_0100//pb2 is analog input
adcc = 0b10_0010_00//enable ADC, select pb2
adcm = 0b000_0100_0//system clock/16
//adcm = 0b000_0111_0//system clock/128

//延時一段時間等系統穩定
Xms = 100
calldelayXms

//得到按鍵初始狀態,這樣在按鍵損壞時不會誤判按鍵按下或松開
if(!KEY)
{
key_press_flag = 1
}
else
{
key_press_flag = 0
}


stt16init_timer
intrq = 0
inten.T16 = 1//打開定時中斷
inten.PB0 = 1//打開PB0外部中斷
engint//允許中斷
set1fppen.1//打開第二個內核

main0_loop:

wdreset//clear watch dog

//得到PB2的AD轉換結果
callget_pb2_voltage
//AD轉換完立即更新數碼管顯示緩沖區
callupdate_led_disp_buf

if(!KEY)//電壓恢復正常只要按鍵就立刻結束倒計時
{
if(key_cnt < 3)
{
key_cnt ++
}
else
{
if(!key_press_flag)
{
key_press_flag = 1//這里是按鍵按下
//按鍵切換數碼管是否進行顯示
if(led_en_flag)
{
led_en_flag = 0//數碼管不顯示
}
else
{
led_en_flag = 1//數碼管顯示
}
}
}
}
else
{
if(key_cnt)
{
key_cnt --
}
else
{
if(key_press_flag)
{
key_press_flag = 0//這里是按鍵松開
}
}
}

//延時50毫秒,目的是讓第一個內核循環的時間大于第二個內核循環時間的兩倍
//以保證顯示緩沖區再次更新前第二個核已經做出響應,保證顯示正確
Xms = 50
calldelayXms

gotomain0_loop

//第二個內核程序入口
//----------------FPPA1-------------------
main1:
sp = 0x38//設置第二個內核的堆棧地址
delay200
main1_loop:
if(update_disp_flag)//有數據更新時才進行更新
{
led1_buf = disp1_buf
led2_buf = disp2_buf
led3_buf = disp3_buf
update_disp_flag = 0
}

//第二個內核循環掃描顯示數碼管,這樣可以得到沒有閃爍的顯示效果
if(led_en_flag)//數碼管需要顯示
{
//下面程序盡量讓數碼管每個段位的處理時間相同,這樣可以保證各個段位亮度一致
//LED1
ALL_LED_OFF
LED_DELAY
SELECT_LED1
if(led1_buf.7)
{
LED_A_ON
}
LED_DELAY
LED_A_OFF
if(led1_buf.6)
{
LED_B_ON
}
LED_DELAY
LED_B_OFF
if(led1_buf.5)
{
LED_C_ON
}
LED_DELAY
LED_C_OFF
if(led1_buf.4)
{
LED_D_ON
}
LED_DELAY
LED_D_OFF
if(led1_buf.3)
{
LED_E_ON
}
LED_DELAY
LED_E_OFF
if(led1_buf.2)
{
LED_F_ON
}
LED_DELAY
LED_F_OFF
if(led1_buf.1)
{
LED_G_ON
}
LED_DELAY
LED_G_OFF
if(led1_buf.0)
{
LED_DP_ON
}
LED_DELAY
LED_DP_OFF
//LED2
ALL_LED_OFF
LED_DELAY
SELECT_LED2
if(led2_buf.7)
{
LED_A_ON
}
LED_DELAY
LED_A_OFF
if(led2_buf.6)
{
LED_B_ON
}
LED_DELAY
LED_B_OFF
if(led2_buf.5)
{
LED_C_ON
}
LED_DELAY
LED_C_OFF
if(led2_buf.4)
{
LED_D_ON
}
LED_DELAY
LED_D_OFF
if(led2_buf.3)
{
LED_E_ON
}
LED_DELAY
LED_E_OFF
if(led2_buf.2)
{
LED_F_ON
}
LED_DELAY
LED_F_OFF
if(led2_buf.1)
{
LED_G_ON
}
LED_DELAY
LED_G_OFF
if(led2_buf.0)
{
LED_DP_ON
}
LED_DELAY
LED_DP_OFF
//LED3
ALL_LED_OFF
LED_DELAY
SELECT_LED3
if(led3_buf.7)
{
LED_A_ON
}
LED_DELAY
LED_A_OFF
if(led3_buf.6)
{
LED_B_ON
}
LED_DELAY
LED_B_OFF
if(led3_buf.5)
{
LED_C_ON
}
LED_DELAY
LED_C_OFF
if(led3_buf.4)
{
LED_D_ON
}
LED_DELAY
LED_D_OFF
if(led3_buf.3)
{
LED_E_ON
}
LED_DELAY
LED_E_OFF
if(led3_buf.2)
{
LED_F_ON
}
LED_DELAY
LED_F_OFF
if(led3_buf.1)
{
LED_G_ON
}
LED_DELAY
LED_G_OFF
if(led3_buf.0)
{
LED_DP_ON
}
LED_DELAY
LED_DP_OFF
}
else//數碼管不需要顯示
{
ALL_LED_OFF
}

gotomain1_loop

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6039

    文章

    44579

    瀏覽量

    636454
收藏 人收藏

    評論

    相關推薦

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發中的一個重要環節,它幫助開發者發現和修復代碼中的錯誤,優化程序性能。不同的單片機和開發環境可能使用不同的調試工具和命令
    的頭像 發表于 12-19 09:56 ?340次閱讀

    單片機怎么寫入程序

    程序通常涉及以下幾個步驟: 選擇單片機和開發環境 : 確定項目需求,選擇合適的單片機型號。 安裝相應的開發環境,如Keil、IAR、MPLAB等。 硬件連接 : 將單片機連接到開發板或
    的頭像 發表于 10-21 11:21 ?544次閱讀

    單片機的中斷機制

    單片機的中斷機制是一種重要的處理方式,它允許單片機在執行主程序的過程中,能夠暫停當前任務,轉而處理外部或內部緊急事件。這種機制極大地提高了系統的響應速度和處理能力,使得單片機在各種應用
    的頭像 發表于 10-17 18:03 ?822次閱讀

    通過DaVinci TMS320DM644x的串行接口加載基本應用程序

    電子發燒友網站提供《通過DaVinci TMS320DM644x的串行接口加載基本應用程序.pdf》資料免費下載
    發表于 10-16 11:52 ?0次下載
    通過DaVinci TMS320DM644x的串行接口加載基<b class='flag-5'>本應用程序</b>

    MCU前沿市場趨勢:8位單片機和32位單片機

    的處理能力,所需的接口程度以及對于電池供電的設計的所有重要功耗曲線,仔細確定對MCU的要求。毫無疑問,32位單片機比8位設備具有更高的性能,但是工程師面臨傳統的選擇,即在市場上最好的設備與應用程序的實際
    發表于 09-24 17:47

    keil可以讀出單片機程序

    Keil是一款廣泛應用于單片機程序開發的軟件,它提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案。然而,關于Keil是否能直接“讀出”單片機程序
    的頭像 發表于 09-02 10:32 ?1075次閱讀

    單片機燒錄程序用什么軟件

    單片機燒錄程序單片機開發過程中的一個重要環節,涉及到將編寫好的程序代碼通過燒錄器寫入單片機的ROM中,以實現對
    的頭像 發表于 09-02 10:05 ?1391次閱讀

    單片機燒錄程序可以重新燒嗎

    單片機(Microcontroller Unit, MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等集成在一塊芯片上,用于控制各種電子設備。單片機燒錄程序是指將編寫
    的頭像 發表于 09-02 10:04 ?1349次閱讀

    單片機燒錄程序的線比單片機上的少還能燒錄嗎

    單片機燒錄原理 單片機燒錄是指將編寫好的程序代碼通過一定的方式傳輸到單片機的存儲器中,使其能夠按照程序的指令運行。這個過程通常需要使用燒錄器
    的頭像 發表于 09-02 09:54 ?534次閱讀

    單片機燒錄程序的基本步驟是什么

    單片機燒錄程序的基礎,它包含了單片機芯片、電源、接口等基本元件。在選擇單片機開發板時,需要考慮以下幾個方面: (1)單片機型號:根據項目需
    的頭像 發表于 09-02 09:47 ?1164次閱讀

    stm32單片機燒錄程序會擦除原來的程序

    在STM32單片機燒錄程序的過程中, 通常情況下會擦除原來的程序 ,并將新程序寫入單片機的閃存(Flash)中。這一過程是通過燒錄工具(如S
    的頭像 發表于 09-02 09:42 ?2215次閱讀

    單片機的最小系統由什么組成 單片機的最小系統包括哪些

    Unit,CPU)、存儲器、輸入輸出接口電路等核心功能,常見的單片機有以8051為代表的8位單片機、PIC系列單片機和AVR系列
    的頭像 發表于 02-02 11:27 ?1.1w次閱讀

    單片機中斷功能及其應用

    單片機中斷功能及其應用? 單片機中斷是指在程序執行過程中,根據特定的條件或事件自動暫時中斷當前程序的執行,轉而執行特定的中斷服務程序。中斷是
    的頭像 發表于 01-30 14:45 ?5621次閱讀

    單片機科技的一款8位MTP型單片機PFS123介紹

    PFS123單片機片概述 PFS123 是一款基于 CMOS 帶 8位 ADC 的 MTP 的8 位微控制器。它運用 RISC 的架構基礎使大部分的指令執行時間都是一個指令周期,只有少部分
    的頭像 發表于 01-17 11:31 ?1522次閱讀

    單片機原理及應用是什么

    能力。單片機被廣泛應用于各個領域,包括家電、汽車、通信、電子設備及工業自動化等。本文將詳細介紹單片機的原理及應用。 核心部分:單片機的核心是中央處理器(CPU)。它負責執行程序指令、處
    的頭像 發表于 01-12 15:28 ?2185次閱讀
    主站蜘蛛池模板: 1024人成网站色www下载| 舔1V1高H糙汉| 国产高清在线观看| 99久久精品免费精品国产| 一级片mp4| 亚洲色视在线观看视频| 午夜天堂一区人妻| 网友自拍偷拍| 午夜福利不卡片在线播放免费| 色久久久综合88一本道| 日本熟妇多毛XXXXX视频| 青草影院内射中出高潮-百度| 欧美xxbb| 男女后进式猛烈xx00动态图片 | 国产精品在线手机视频| 国产国产人免费观看在线视频| 国产51麻豆二区精品AV视频| 第一次处破女完整版电影| 广东95后小情侣酒店自拍流出| 俄罗斯爱爱| 国产精品久久久久永久免费看 | 亚洲精品www久久久久久| 亚洲日本香蕉视频观看视频| 一边捏奶头一边啪高潮会怎么样 | 国产极品美女视频福利| 国产精品视频免费视频| 国产午夜永久福利视频在线观看 | 色爱AV综合区| 午夜视频在线瓜伦| 亚洲日本va中文字幕久久| 约艺术院校96年清纯白嫩| 6080伦理久久亚洲精品| gayxxxxgay呻吟受日本| 国产AV亚洲精品久久久久| 国产亚洲精品久久无亚洲| 久久精品国产亚洲AV忘忧草蜜臀| 免费看黄的片多多APP下载| 日韩a在线看免费观看视频| 亚洲AV精品无码喷水直播间 | 空姐厕所啪啪啪| 漂亮的保姆5电影免费观看完整版中文 |