51单片机的嵌入式BIOS程序.docx
《51单片机的嵌入式BIOS程序.docx》由会员分享,可在线阅读,更多相关《51单片机的嵌入式BIOS程序.docx(34页珍藏版)》请在冰豆网上搜索。
51单片机的嵌入式BIOS程序
RemoteControl程序说明
BIOS(basedonhh4035)
OPEShanghai
Version0.1
Tableofcontents:
page
1BIOS简述
音响系统一般有三种基本人机输入接口:
音量控制器(Encoder)、面板键盘(PanelKey)、遥控器(Remote)。
对于系统来说,音量控制器的功能是控制音量(volume)向上或向下调整,这与面板键盘VOL-UP,VOL-DOWN的功能完全一样;面板键盘作为最基本的人机接口,定义了常用的基本键盘名称,由于面板键盘数量常受面板面积的限制,遥控器的键盘在面板键盘的基础上另外增加定义了一些键盘名称。
三种人机接口之间的关系如下图所示:
人机接口关系结构图
由于底层硬件的差别,虽然三种人机输入接口的功能一致,硬件级的基本输入输出(BIOS)驱动却完全不同,为此设计了一种接口协议CommonKeyProtocol,该协议对硬件级BIOS和上层处理进行规范。
这种协议的优点在于:
1、在符合该协议的条件下,硬件级BIOS和上层的响应可以独立编程和修改,互不影响。
2、当硬件改变时对硬件重新编程。
3、当上层改变时,屏蔽(有目的的取舍)部分接口编码;三种硬件(未来可能继续增加其他类别的硬件)可自由取舍。
4、测试方便,BIOS和上层通过接口协议相互隔离。
5、由于REMOTE部分的编码包括了全部人机输入接口BIOS的内容,调试时可以使用遥控器进行。
2CommonKeyProtocol(CKP)描述
下面所述的各个标志由BIOS自由设置,与上层无关,上层通过查询这些标志的状态,再生成各种高级键盘事件-PRESS_DOWN,PRESS_HOLD,PRESS_UP等,对这些事件的详尽说明见KEP描述部分。
CKP协议主要生成以下标志和编码:
REMVALID–位标志,对于BIOS当遥控有效波码被接收成功时,置位该标志,接收到Repeat波或超时
以后,复位该标志。
RPTVALID–每接收到一个Repeat波时,该标志被置位,超时以后复位该标志。
设立这两个标志的目的是在高层处理时能够恰当的区分PanelKey和Remote按键事件
KEYDATA–存储了人机接口通用信息一个字节,其中
KeyStatus–KEYDATA的b7,b6两位,表示外部输入消息的来源。
定义:
00–S_IDLE,表示没有外部输入事件,或外部事件已经被响应。
01–S_PANEL_KEY,表示外部事件为面板键盘。
10–S_ENCODER,表示外部事件为Encoder.
11–S_REMOTE,表示外部事件为遥控按键
CommonCode–对三种外部输入接口信息的编码,其定义与硬件无关,见下表:
Cdefine
Name
CommonCode(Hex)
PKCODE(Hex)
For905hardware
REMDATA(Hex)
For905hardware
K_POWER
POWER
01
11
00
K_MEM_UP
MEM-UP
02
12
17
K_MEM_DOWN
MEM-DOWN
03
13
1A
K_MODE_REMAIN
MODE/REMAIN
04
14
20
K_MEM_CLK_ADJ
MEM/CLK-ADJ
05
15
0E
K_FM_MO_ST
FM-MO/ST
06
16
0F
K_RANDOM
RANDOM
07
21
1F
K_REPEAT
REPEAT
08
22
23
K_INTRO
INTRO
09
23
24
K_STOP
STOP
0A
24
15
K_PLAY_PAUSE
PLAY/PAUSE
0B
25
18
K_UP_F_SKIP
UP/F-SKIP
0C
26
1B
K_DOWN_R_SKIP
DOWN/R-SKIP
0D
31
1C
K_EQ
EQ
0E
32
0D
K_MUTE
MUTE
0F
33
10
K_CD
CD
10
34
1E
K_TAPE
TAPE
11
35
25
K_TUNER_BAND
TUNER/BAND
12
36
21
K_AUX
AUX
13
41
16
K_H_S_DUBBING
H.S.DUBBING
14
42
13
K_DISC1
DISC1
15
43
27
K_DISC2
DISC2
16
44
26
K_DISC3
DISC3
17
45
28
K_SLEEP
SLEEP
18
46
22
K_TIMER
TIMER
19
51
01
K_DISC_SKIP
DISC-SKIP
1A
52
12
K_OPEN_CLOSE
OPEN/CLOSE
1B
53
14
K_VOL_UP
VOL-UP
1C
54
19
K_VOL_DOWN
VOL-DOWN
1D
55
1D
K_BBS
BBS
1E
56
11
K_1
1
30
-
02
K_2
2
31
-
04
K_3
3
32
-
05
K_4
4
33
-
06
K_5
5
34
-
07
K_6
6
35
-
03
K_7
7
36
-
08
K_8
8
37
-
09
K_9
9
38
-
0A
K_0
0
39
-
0B
K_10
+10
3A
-
0C
1ENCODERBIOS描述
●基本原理Encoder使用相位检测原理工作,它主要产生两种消息:
UP,DOWN。
当ENCODE被旋转时,两个输出端(A和B)会分别输出方波信号,如果顺时针旋转,A端的方波下降沿超前于B端的方波下降沿;而逆时针旋转时B端会超前与A端。
●硬件使用ALPS公司的EC16B24104,Spec文件为Encoder.pdf。
对于MCU有两个输入引脚。
●BIOS基本工作原理软件以分时扫描方式工作,每隔一定时间进入BIOS,通过测试得知,间隔时间4ms时可以得到最佳结果(一般情况可检测出70%以上的相位差信号),超过8ms就几乎检测不到信号了(少于30%)。
因此扫描时间定为4ms。
●BIOS软件流程图
●使用系统RAM资源及源程序(汇编)
PUBLICKEYDATA
ECDUPPR:
DBIT1;Readytoup
ECDDOWNPR:
DBIT1;Readytodown
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Name:
ENCODER;
;Purpose:
Detecttheencoderevent,upordown;
;Input:
HardwareENCODERA,ENCODERBpins;
;Output:
ByteKEYDATA9DH-up,9CH-down;
;Function:
Becalledevery4ms,iflegaleventdetected;
;KEYDATAwillbereturned;
;Scope:
None;
;Used:
bitECDUPPRE,ECDDOWNPRE;
;TimeMax:
14T;
;Ref.Flowchart:
Encoder.pcx;
;C-Declare:
voidENCODER(void);;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PUBLICENCODER
ECSEGMENTCODE
RSEGEC
ENCODER:
JBENCODERA,ECD1;;2
JBENCODERB,ECD2;;2
JBECDUPPR,ECD4;UP;;2
JNBECDDOWNPR,ECD5;;2
MOVKEYDATA,#9CH;DOWN;;2
ECD5:
CLRECDUPPR;;1
CLRECDDOWNPR;;1
RET;;2
ECD1:
JBENCODERB,ECD8
SETBECDDOWNPR
RET
ECD8:
CLRECDDOWNPR
CLRECDUPPR
RET
ECD2:
SETBECDUPPR;READYTOUP
RET
ECD4:
MOVKEYDATA,#9DH;UP
AJMPECD5
2PanelKeyBIOS描述
●基本原理面板键盘输入BIOS使用行列扫描方式,列输出使用了MC4094扩展,为了节省MCUI/O口,另外有一列固定接地,作为Default列。
在行扫描时,MCUI/O口没有输出信号,当有按键按下时,再向列输出分别输出扫描信号。
有多个按键按下时BIOS作如下处理:
1、同时有两行以上检测到按键时,作出错处理。
2、按键在同一行上,如果有两列以上出现按键,其中一列为DEFAULT,只响应DEFAULT列。
3、按键在同一行上,如果有两列以上出现按键,其中没有DEFAULT列,作出错处理。
●BIOS基本工作原理软件以分时扫描方式工作,每隔8ms进入BIOS一次,每次的运行状态都与以前的运行结果有关系,由于CPU需要处理多任务,键扫描BIOS不允许在原地等待,而必须在等待时将CPU控制权交还(即退出BIOS运行),这也是分时式程序的共同特点。
●BIOS软件流程图
●使用系统RAM资源及源程序(汇编)
PUBLICKEYDATA
KEYDATA:
DS1
PKCODE:
DS1
PKTEMPDATA2FH
KEYVALIDBIT0FFH
KEYTEMPBIT0FEH
;;;*****************************************************************************
;;;*Name:
KEYSCAN*
;;;*Purpose:
Scankeyboard,checkandchangethevalue*
;;;*intocommandcode.*
;;;*Function:
Becalledevery8ms,andKEYDATAbereturn*
;;;*whenthekeypressed.*
;;;*Scope:
KS_LINE,KS_COLUMN,*
;;;*Input:
SeehardwareI/Odescription.*
;;;*Output:
KEYDATA*
;;;*Time:
21T(nokeypressed)~525T(max)*
;;;*Used:
Byte-KEYDATA,PKCODE,PKTEMP(Bit:
KEYVALID,KEYTEMP)*
;;;*SFR-ACC,R7,DPTR,CF*
;;;*Ref.Flowchart:
KeyScan.wmf*
;;;*C-Declare:
voidKEYSCAN(void);*
;;;*unsignedcharKEYDATA;*
;;;******************************************************************************
PUBLICKEYSCAN
KSSEGMENTCODE
RSEGKS
KEYSCAN:
ACALLKS_LINE
CJNER7,#0H,KS_FOUND
JBKEYVALID,DOWN_TEMP
JNBKEYTEMP,KEYSCAN_RTN
CLRKEYTEMP
RET
DOWN_TEMP:
SETBKEYTEMP
CLRKEYVALID;UPditherreturn
RET
KEYSCAN_RTN:
;ERRORRETURN
MOVPKTEMP,#0H
MOVPKCODE,#0H
RET
KS_FOUND:
MOVA,PKTEMP
ANLA,#0C0H
ORLA,R7
MOVPKTEMP,A;TempsavelineNo.
CALLKS_COLUMN
CJNER7,#0,KS_KEYPRESSED
JNBKEYVALID,KEYSCAN_RTN
RET
KS_KEYPRESSED:
JBKEYVALID,KEYSCAN_TEMP
JBKEYTEMP,KEYSCAN_TEMP
MOVPKCODE,R7
SETBKEYTEMP
RET
KEYSCAN_TEMP:
MOVA,R7
CJNEA,PKCODE,KEYSCAN_LOCK;CURRENT=PREVIOUS?
JNBKEYVALID,UP_TEMP
MOVDPTR,#KEY_REPLACE_TAB
SUBBA,#11H
MOVCA,@A+DPTR
MOVKEYDATA,A
RET
KEYSCAN_LOCK:
JNBKEYVALID,KEYSCAN_RTN
RET
UP_TEMP:
CLRKEYTEMP
SETBKEYVALID
RET;DOWNditherreturn
KEY_REPLACE_TAB:
DB41H,42H,43H,44H,45H,46H,0H,0H
DB0H,0H,0H,0H,0H,0H,0H,0H
DB47H,48H,49H,04AH,04BH,04CH,0H,0H
DB0H,0H,0H,0H,0H,0H,0H,0H
DB04DH,04EH,04FH,50H,51H,52H,0H,0H
DB0H,0H,0H,0H,0H,0H,0H,0H
DB53H,54H,55H,56H,57H,58H,0H,0H
DB0H,0H,0H,0H,0H,0H,0H,0H
DB59H,5AH,5BH,5CH,5DH,5EH,0H
DB0H,0H,0H,0H,0H,0H,0H,0H
;;;********************************************************************
;;;*Name:
KS_LINE*
;;;*Inputparameter:
SeehardwareI/Odescription.*
;;;*Outputparameter:
R7-thevalueofline*
;;;*0-nokeypressed*
;;;*1~6-onekeypressed*
;;;*7-twokeyoraboveispressed*
;;;*UseRAM:
sfr-ACC,DPTR,R7*
;;;*Usetime:
10T*
;;;********************************************************************
KS_LINE:
MOVA,P1
ORLA,#0C0H;maskp1.7,p1.6
CPLA
MOVDPTR,#KSLINE_TAB
MOVCA,@A+DPTR
MOVR7,A
RET
KSLINE_TAB:
DB0H,1H,2H,7H,3H,7H,7H,7H
DB4H,7H,7H,7H,7H,7H,7H,7H
DB5H,7H,7H,7H,7H,7H,7H,7H
DB7H,7H,7H,7H,7H,7H,7H,7H
DB6H,7H,7H,7H,7H,7H,7H,7H
DB7H,7H,7H,7H,7H,7H,7H,7H
DB7H,7H,7H,7H,7H,7H,7H,7H
DB7H,7H,7H,7H,7H,7H,7H,7H
DB7H,7H,7H,7H,7H,7H,7H,7H
;;;******************************************************************************
;;;*Name:
KS_COLUMN*
;;;*Purpose:
Scancolumnswhentheispressed.*
;;;*Function:
Becalledevery8mswhenthekeyis*
;;;*pressed,andR7wilbereturn*
;;;*Scope:
KS_LINE,MC4094.*
;;;*Input:
SeehardwareI/Odescription.*
;;;*Output:
R7-thevalueoflineandcolumn*
;;;*bit0~3-thevalueofline*
;;;*bit4~7-thevalueofcolumn*
;;;*RAM:
ACC,DPTR,R7*
;;;*Time(max):
68T+5*Tline+6*Tmc4094=490T*
;;;******************************************************************************
KS_COLUMN:
MOVA,#0FH
MOVR3,A
ACALLMC4094
ACALLKS_LINE
CJNER7,#0H,KSCOL_VALID
MOVA,#1H
KSCOL_LOOP:
MOVR3,A
ACALLMC4094
ACALLKS_LINE
CJNER7,#0H,KSCOL_INVALID
AJMPKSCOL_VALID
KSCOL_INVALID:
MOVA,R3
RLA
CJNER3,#8H,KSCOL_LOOP
ERROR_RTN:
MOVR7,#0H
MOVA,#0H
ACALLMC4094
RET
KSCOL_VALID:
MOVA,R3
MOVDPTR,#KSCOL_TAB
MOVCA,@A+DPTR
MOVR7,A
MOVA,PKTEMP
ANLA,#0FH
ORLA,R7
MOVR7,A
MOVA,#0H
ACALLMC4094
RET
KSCOL_TAB:
DB0H,10H,20H,0H,30H,0H,0H,0H
DB40H,0H,0H,0H,0H,0H,0H,50H
;;;********************************************************************
;;;*Name:
MC4094*
;;;*Purpose:
Drivemc4094*
;;;*Function:
BecalledbyKS_COLUMN.ASM*
;;;*Scope:
None.*
;;;*Input:
ACC.*
;;;*Output:
None.*
;;;*Time(max):
62T*
;;;********************************************************************
MC4094:
CLRSTROBE
SETBC
AJMPSHIFT_LOOP1
SHIFT_LOOP:
CLRC
SHIFT_LOOP1:
RLCA
MOVDAT,C
SETBCLK
CLRCLK
CJNEA,#80H,SHIFT_LOOP
SETBSTROBE
RET
3RemoteBIOS描述
●基本原理遥控接收通过一个引脚与MCU接口,该引脚接在MCU的外部中断输入端上。
遥控器发出的红外线调制波经过接收器接收解调后送给MCU解码,RemoteBIOS使用中断方式工作。
●硬件遥控发送编码芯片–使用PT2221,SPEC文件为Remote.pdf。
遥控接收芯片使用ROHM公司的RPH-600CBR,SPEC文件为Reciever.pdf。
●BIOS基本工作原理MCU使用外部中断与定时器交替中断的方式工作,INT0使用下降沿中断,中断以后启动定时器T1计时,所有波码的接收都使用这种方式在两种中断服务程序中处理。
●BIOS软件