![]() |
發布時間: 2018-1-30 14:05
正文摘要:有很多場合都會用到增量型旋轉編碼器 比如:數字PLL收音機、音響中的電子音量、等等 于是找了一個舊的做試驗(型號是EC16-2A) 效果還不錯 給有興趣的壇友做個參考 試驗的圖里: A接單片機(AT89S52)的P32(IN ... |
學習下 裝備試驗 |
模擬調諧電臺的試驗參考代碼: ;1602-LCD模擬調電臺匯編代碼 ;Lxa0最后修改于2018-1-28-V1.0 ;本代碼晶體為11.0592MHz ;代碼中未注明的只占用區0 RS EQU p2.5 ;定義液晶接口 RW EQU p2.6 E EQU p2.7 org 0000h ljmp mm ;主程序********************************************************* org 0100h mm:nop acall ys mov tmod,#90h ;T0設方式0,T1門控與方式1 mov tcon,#04h ;T0原始方式,INT1下降沿觸發 ;mov ie,#84h ;設中斷允許 mov ip,#04h ;設中斷優先級別 mov sp,#7fh ;設堆棧入口 mov 08h,#30h ;解碼轉換用 mov 09h,#07h ;解碼轉換用 mov 10h,#30h ;讀紅外波頭存放首址 mov 11h,#2fh ;讀紅外波頭48個 mov 20h,#00h ;讀紅外、解碼、動作,電臺最大最小標志位06h和05h mov 21h,#00h ;動作指令碼占 mov 22h,#09h ;電臺頻率小數位 mov 23h,#07h ;電臺頻率個位 mov 24h,#00h ;電臺頻率十位 mov 25h,#01h ;電臺頻率百位 mov 26h,#00h ;XX暫存單元 mov 27h,#00h ;XX暫存單元 mov p0,#01H ;清屏 acall wcom MOV p0,#38H ;使用8Bits匯流排,顯示2行5*7字符 acall wcom MOV p0,#0CH ;顯示開,光標關 acall wcom MOV p0,#06H ;字符不動,光標自動右移一格 acall wcom MOV p0,#80H ;第一行的開始位置 acall wcom MOV DPTR,#TAB001 ;到TABLE1取碼 acall xsztab MOV p0,#0C0H ;第二行的開始位置 acall wcom MOV DPTR,#TAB002 ;到TABLE2 取碼 acall xsztab acall cgwr m0:nop acall ys acall xsz sjmp m0 ;顯示tab001和tab002子代碼***************************************** xsztab:nop push dph push dpl push acc push psw clr psw.3 ;進入區0工作寄存器 clr psw.4 mov r1,#00h A1:mov a,r1 MOVC A,@A+DPTR ;到table取碼 mov p0,a acall wdat ;顯示到lcd INC r1 CJNE A,#0,A1 ;是否到00h pop psw pop acc pop dpl pop dph RET ;延時0.5mS子代碼************************************************** ys:nop push dph push dpl push acc push psw clr psw.3 ;進入區0工作寄存器 clr psw.4 MOV R7,#04 ;延時0.5mS子程序 ys00:MOV R6,#0FFH DJNZ R6,$ DJNZ R7,ys00 pop psw pop acc pop dpl pop dph RET ;以下是字符數據表************************************************** tab001: db" Lxa0 ",00h tab002: db" FM--000.0 MHz ",00h ;顯示xsz子程序<占用區0>******************************************** org 0200h xsz:nop push dph ;保護現場 push dpl push acc push psw mov p0,#0c9h ;設置小數位地址 lcall wcom mov a,22h ;取小數位數據 add a,#30h ;加上#30h就是去CGROM取數據 mov p0,a lcall wdat ;送出顯示 mov p0,#0c7h ;設置頻率個位地址 lcall wcom mov a,23h ;取頻率個位數據 add a,#30h mov p0,a lcall wdat ;送出顯示 mov p0,#0c6h ;設置頻率十位地址 lcall wcom mov a,24h ;取頻率十位數據 add a,#30h mov p0,a lcall wdat ;送出顯示 mov p0,#0c5h ;設置頻率百位地址 lcall wcom mov a,25h ;取頻率百位數據 add a,#30h mov p0,a lcall wdat ;送出顯示 mov p0,#80h ;顯示天線符號 lcall wcom mov p0,#00h lcall wdat mov p0,#81h ;顯示信號符號 lcall wcom mov p0,#01h lcall wdat mov p0,#8fh ;顯示電池符號 lcall wcom mov p0,#02h lcall wdat pop psw ;恢復現場 pop acc pop dpl pop dph ret ;返回 ;寫命令和數據子代碼************************************************ org 0280h wcom:CLR RS ;送命令 CLR RW clr E acall ys setb E clr E RET wdat:SETB RS ;送數據 CLR RW clr E acall ys setb E clr E RET ;建立自定義CGRAM字符庫子程序(占用區0工作寄存器)******************** org 0300h cgwr:nop push dph push dpl push acc push psw mov p0,#40h ;設置CGRAM首地址 lcall wcom mov r2,#64 ;設置天線信號電池等共8X8=64個代碼 mov r3,#00h mov dptr,#cgtab1 ;設置字符代碼表首地址 cgwr00:mov a,r3 movc a,@a+dptr ;取字符代碼 mov p0,a lcall wdat inc r3 djnz r2,cgwr00 pop psw pop acc pop dpl pop dph ret ;以下是CGRAM數據表************************************************* cgtab1: db 15H,15H,15H,0EH,04H,04H,04H,00H ;"天線"代碼=0x08h db 00H,00H,01H,03H,07H,0fH,1fH,00H ;"信號"代碼=0x09h db 04H,1FH,11H,15H,15H,11H,1FH,00H ;"電池"代碼=0x10h db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代碼=0x05h db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代碼=0x00h db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代碼=0x01h db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代碼=0x02h db 00h,01h,02h,03h,04h,05h,06h,07h ;"空"代碼=0x03h ;****************************************************************** end |
試驗用的參考代碼: ;這是一個旋轉編碼器的試驗匯編代碼2018-1-20 ;最后試驗修改2018-1-26,幾乎沒有了抖動 ;at89s52,11.0592MHz, ;p32(int0)下降沿做中斷判別A,p34(t0)做引腳B判別 ORG 0000H LJMP mm ORG 0003H LJMP pd ;中斷判別A腳 ;程序入口********************************************************* org 0100h mm:nop mov 17h,#0feh ;循環顯示p0口的led mov 18h,#00h ;4個做判別緩沖用 mov 19h,#00h mov 1ah,#00h mov 1bh,#05h mov p0,17h mov sp,#4fh ;設堆棧入口50h mov tcon,#01h ;int0下降沿中斷 setb ea ;開總中斷 setb ex0 ;開int0 mm0:nop sjmp mm0 ;int0中斷代碼***************************************************** org 0300h pd:nop clr ea push acc push psw push dph push dpl mov a,p3 anl a,#00010100b ;保留p32和p34腳屏蔽其余引腳 mov 18h,a ;暫存在r7 acall ys100 ;延時約1.5ms mov a,p3 anl a,#00010100b cjne a,18h,pd0 ;不是正轉則判別是否反轉 cjne a,#10h,pd0 ;A=L,B=H時右移 mov a,17h rl a mov 17h,a mov p0,a sjmp pd00 pd0:mov a,p3 anl a,#00010100b mov 19h,a acall ys100 ;延時約1.5ms mov a,p3 anl a,#00010100b cjne a,19h,pd00 ;是干擾則返回 cjne a,#00h,pd00 ;A=B=L時左移 mov a,17h rr a mov 17h,a mov p0,a pd00:setb ea pop dpl pop dph pop psw pop acc reti ys100:nop ;延時約1.5mS ys0:djnz 1ah,$ djnz 1bh,ys0 mov 1ah,#00h mov 1bh,#05h ret end |