单片机原理及其嵌入式应用实验.ppt
单片机原理及其嵌入式应用实验 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望基本实验基本实验程序框架程序框架开关量输入输出开关量输入输出(IO)实验实验串行通信及串行通信及AD转换实验转换实验键盘编程实验键盘编程实验液晶显示实验液晶显示实验数码管显示实验数码管显示实验FLASH编程实验编程实验定时器溢出中断实验定时器溢出中断实验定时器输入中断捕捉定时器输入中断捕捉实验实验2程序框架程序框架实验目的实验目的实验器材实验器材硬件接线硬件接线软件功能软件功能程序清单程序清单备注说明备注说明3实验目的实验目的:了解程序基本框架了解程序基本框架4实验器材实验器材:1.SD-1型在线编程实验仪型在线编程实验仪2.导线若干导线若干5硬件接线硬件接线:VCCPTC3PTA7PTA6PTA5PTA4PTA3PTA2PTA1PTA0PTC0PTC1PTC2MOTOROLA GP32 MCU PTC4PTB7PTB6PTB5PTB4PTB3PTB2PTB1PTB06软件功能软件功能:PTAPTA口的模拟量输出,控制指示灯口的模拟量输出,控制指示灯程序执行指示灯闪烁程序执行指示灯闪烁7程序清单:程序清单:文件说明文件说明口地址定义口地址定义数据区定义数据区定义主程序主程序系统初始化及中断矢量系统初始化及中断矢量延时子程序延时子程序8*-*-文件说明文件说明-*文件名文件名:PrgFrame.ASM PrgFrame.ASM *硬件连接硬件连接:PTA.1PTA.1接指示灯接指示灯 *程序描述程序描述:指示灯指示灯PTA.1PTA.1闪烁闪烁 *目的目的:第一个第一个Motorola MCUMotorola MCU程序框架程序框架 *说明说明:提供提供Motorola MCUMotorola MCU的编程框架,供教学入门使用的编程框架,供教学入门使用 *-*-9*-*-口地址定义口地址定义-PTA EQU$0000 PTA EQU$0000 ;A;A口数据寄存器口数据寄存器DDRA EQU$0004 DDRA EQU$0004 ;A;A口数据方向寄存器口数据方向寄存器10RAMstartAddr equ$0040 ;RAMRAMstartAddr equ$0040 ;RAM的起始地址(因芯片不同可以更改)的起始地址(因芯片不同可以更改)FlashStartAddr equ$8000 ;FlashStartAddr equ$8000 ;程序开始地址(因芯片不同可以更改)程序开始地址(因芯片不同可以更改)*数据区定义(变量名定义)数据区定义(变量名定义)org RAMstartAddr ;RAMorg RAMstartAddr ;RAM的起始地址的起始地址N1 rmb 1 ;N1 rmb 1 ;变量变量N1,N1,缓冲使用缓冲使用11*主程序主程序 org FlashStartAddr ;org FlashStartAddr ;程序起始地址程序起始地址MainInit:;MainInit:;复位后程序从此开始执行复位后程序从此开始执行 ;系统初始化系统初始化 SEI ;SEI ;禁止所有中断禁止所有中断 LDHX#$023F ;LDHX#$023F ;堆栈初始化,放入堆栈初始化,放入GP32GP32的的RAMRAM最高端最高端 TXSTXS JSR Init0 ;JSR Init0 ;调系统初始化子程序调系统初始化子程序Init0Init0,初始学习时跳过此处初始学习时跳过此处 ;I/OI/O初始化初始化 BSET 1,DDRA ;BSET 1,DDRA ;设置设置PTA.1PTA.1为输出为输出 BSET 1,PTA ;BSET 1,PTA ;初始时,初始时,PTA.1PTA.1指示灯指示灯 暗暗 MainLoop:;MainLoop:;程序总循环入口程序总循环入口 BCLR 1,PTA ;PTA.1BCLR 1,PTA ;PTA.1指示灯指示灯“亮亮”MOV#$2,N1 ;MOV#$2,N1 ;延时子程序延时子程序DelaySubDelaySub的时间长度入口的时间长度入口 JSR DelaySub ;JSR DelaySub ;调用延时子程序调用延时子程序 BSET 1,PTA ;BSET 1,PTA ;初始时,初始时,PTA.1PTA.1指示灯指示灯 暗暗 MOV#$4,N1 ;MOV#$4,N1 ;延时子程序延时子程序DelaySubDelaySub的时间长度入口的时间长度入口 JSR DelaySub ;JSR DelaySub ;调用延时子程序调用延时子程序 ;-;-JMP MainLoop ;JMP MainLoop ;转总循环入口处转总循环入口处12Init0:;Init0:;系统初始化系统初始化Init0Init0子程序子程序 LDA#%00000001 ;LDA#%00000001 ;初始化初始化CONFIG2CONFIG2 STA$001E STA$001E LDA#%00111101 ;LDA#%00111101 ;初始化初始化CONFIG1CONFIG1 STA$001F STA$001F CLR$0036 ;CLR$0036 ;初始化初始化PTCLPTCL MOV#$01,$0036 MOV#$01,$0036 MOV#$01,$0038 MOV#$01,$0038 MOV#$2C,$0039 MOV#$2C,$0039 MOV#$80,$003A MOV#$80,$003A BSET 5,$0036 BSET 5,$0036 BSET 7,$0037 BSET 7,$0037 BSET 4,$0036 BSET 4,$0036 RTS RTS*-*-中断矢量中断矢量-ORG$FFFE ORG$FFFE ;复位矢量复位矢量 DW MainInitDW MainInit13延时子程序DelaySub:;延时0.1秒 PSHH ;保据寄存器HX PSHX DelaySub1:LDHX#$FFFF DelaySub2:PSHA ;保护寄存器A LDA#$FFDelaySub3:DBNZA DelaySub3 PULA DBNZX DelaySub2 DBNZA DelaySub1 PULX PULH RTS14开关量输入输出开关量输入输出(IO)实验实验实验实验目的目的实验器材实验器材硬件接线硬件接线程序功能程序功能程序清单程序清单备注说明备注说明A.3-0A.7-4-A.3-0 COMA COMA STA PTA STA PTA LDA PTB LDA PTB ;取开关取开关PTB0PTB0状态状态,0-,0-闭合闭合 AND#%00000001 AND#%00000001 ;剩下剩下PTB0PTB0位位 STA TmpVar STA TmpVar ;放入变量放入变量TmpVarTmpVar25 NOPNOP LDA PTC LDA PTC ;取开关取开关PTC0PTC0状态状态,0-,0-闭合闭合 AND#%00000001 AND#%00000001 ;剩下剩下PTC0PTC0位位 NOPNOP ADD TmpVar ADD TmpVar ;经过此运算经过此运算 若若A=0,A=0,两个均闭合两个均闭合 ;若若=1,=1,有一个闭合有一个闭合;=2,;=2,均未闭合均未闭合 CBEQA#$0,Light0 CBEQA#$0,Light0 ;比较比较,相等转移相等转移,A=0A=0转向转向Light0Light026 NOPNOP CBEQA#$1,Light1 CBEQA#$1,Light1 ;A=1;A=1转转Light1Light1 NOP NOP ;A=2,;A=2,两排均不亮两排均不亮 LDA#$FF LDA#$FF ;两排灯均不亮两排灯均不亮 1-1-不亮不亮 STA PTBSTA PTB STA PTC STA PTC BRA IO_End BRA IO_End ;转转IO_END,IO_END,延时延时27Light0:Light0:LDA#$00 LDA#$00 ;两排灯均亮两排灯均亮 0-0-亮亮 STA PTBSTA PTB STA PTC STA PTC BRA IO_End BRA IO_End ;无条件转无条件转IO_ENDIO_ENDLight1:Light1:LDA Light_BC LDA Light_BC ;两排灯之一亮两排灯之一亮 0-0-亮亮 STA PTB STA PTB ;驱动驱动B B口灯口灯 NEGA NEGA ;求补命令求补命令 STA PTC STA PTC ;驱动驱动B B口灯口灯 STA Light_BC STA Light_BC ;保存状态保存状态28IO_End:IO_End:LDA#$FE LDA#$FE ;延时延时Delay1:Delay1:LDX#$FC LDX#$FCDelay2:Delay2:NOP NOP NOP NOP NOP NOP DBNZX Delay2 DBNZX Delay2 DBNZA Delay1 DBNZA Delay1 BRA Start BRA Start ;无条件转开始处无条件转开始处*-*-29*-*-子程序子程序-*-*Init0:Init0:;系统初始化系统初始化Init0Init0子程序子程序 LDA#%00000001 LDA#%00000001 ;初始化初始化CONFIG2CONFIG2 STA$001E STA$001E LDA#%00111101 LDA#%00111101 ;初始化初始化CONFIG1CONFIG1 STA$001F STA$001F CLR$0036 CLR$0036 ;初始化初始化PTCLPTCL MOV#$01,$0036 MOV#$01,$0036 MOV#$01,$0038 MOV#$01,$0038 MOV#$2C,$0039 MOV#$2C,$0039 MOV#$80,$003A MOV#$80,$003A 30 BSET 5,$0036BSET 5,$0036 BSET 7,$0037 BSET 7,$0037 BSET 4,$0036 BSET 4,$0036 RTS RTS*-*-复位矢量复位矢量-ORG$FFFE ORG$FFFE ;复位矢量复位矢量 DW MainInitDW MainInit31备注说明:仅作为基本教学例程仅作为基本教学例程32串行通信及串行通信及ADAD转换实验转换实验实验目的实验目的实验器材实验器材硬件接线硬件接线VBVB界面界面软件功能软件功能程序清单程序清单备注说明备注说明33实验目的实验目的:A/DA/D转换,转换,单片机异步串行通信单片机异步串行通信 34实验器材实验器材:1.SD-1型在线编程实验仪型在线编程实验仪2.导线若干导线若干35硬件接线硬件接线:VCCPTC3PTA7PTA6PTA5PTA4PTA3PTA2PTA1PTA0PTC0PTC1PTC2MOTOROLA GP32 MCU PTC4PTB7PTB6PTB5PTB4PTB3PTB2PTB1PTB0VCC36VB界面:界面:37软件功能软件功能:由由PORTBPORTB口的模拟量输入,通过单片机的口的模拟量输入,通过单片机的A/DA/D转换器采集转换器采集8 8路数据,并放在路数据,并放在ADBUFADBUF开开始的地址中。始的地址中。再在再在INBUFINBUF中放开关量。中放开关量。发发8686给给PCPC机作为握手信号,进行通信测机作为握手信号,进行通信测试,试,PCPC机判断后确认,发机判断后确认,发8686作为确认信作为确认信号,单片机收到号,单片机收到8686后,把模拟量后,把模拟量0-70-7和开和开关量送关量送PCPC机显示。机显示。38程序清单:程序清单:文件说明文件说明口地址定义口地址定义SCI寄存器寄存器A/D寄存器寄存器数据区定义数据区定义主程序主程序A/D转换转换串行通信输出串行通信输出串行通信输入串行通信输入从从PC机接收数据,机接收数据,并存储后送并存储后送PTA输输出出把在把在INBUF和和ADBUFF的数据送的数据送PC机输出机输出中断矢量中断矢量39*-*-文件说明文件说明-*-*文件名:文件名:sci.assci.as*硬件连接:硬件连接:PORTAPORTA口输出它的口输出它的PTA7-0PTA7-0接接OUTOUT的的7-07-0号号*指示灯(指示灯(A0A0作为运行指示不受其它数据控制)作为运行指示不受其它数据控制)PORTBPORTB作为作为ADAD输入连接,输入连接,*PORTBPORTB口为模拟量输入口口为模拟量输入口,PORTCPORTC的的C0-4C0-4接接ININ的的5 5个拨位开关个拨位开关0-40-4作为开关作为开关*输入串行口与微机串行口相接(输入串行口与微机串行口相接(96009600,N N,8 8,1 1)*程序描述:程序描述:1.1.由由PORTBPORTB口的模拟量输入,通过单片机的口的模拟量输入,通过单片机的A/DA/D转换器采集转换器采集8 8*路数据,并放在路数据,并放在ADBUFADBUF开始的地址中开始的地址中*2.2.再在再在INBUFINBUF中放开关量中放开关量*3.3.发发8686给给PCPC机作为握手信号,进行通信测试机作为握手信号,进行通信测试,PCPC机判断后确机判断后确*认认,发发8686作为确认信号,单片机收到作为确认信号,单片机收到8686后后,把模拟量把模拟量 0-7 0-7和和*开关量送开关量送PCPC机显示机显示*目的:目的:A/DA/D转换,单片机异步串行通信转换,单片机异步串行通信 *-*-*40*-*-口地址定义口地址定义-PTA EQU$0000 PTA EQU$0000 ;A;A口数据寄存器口数据寄存器PTB EQU$0001 PTB EQU$0001 ;B;B口数据寄存器口数据寄存器PTC EQU$0002 PTC EQU$0002 ;C;C口数据寄存器口数据寄存器PTD EQU$0003 PTD EQU$0003 ;D;D口数据寄存器口数据寄存器DDRA EQU$0004 DDRA EQU$0004 ;A;A口数据方向寄存器口数据方向寄存器DDRB EQU$0005 DDRB EQU$0005 ;B;B口数据方向寄存器口数据方向寄存器DDRC EQU$0006 DDRC EQU$0006 ;C;C口数据方向寄存器口数据方向寄存器DDRD EQU$0007 DDRD EQU$0007 ;D;D口数据方向寄存器口数据方向寄存器DDRE EQU$0008 DDRE EQU$0008 ;E;E口数据寄存器口数据寄存器41*-*-SCISCI寄存器寄存器-SCS1 EQU$0016 SCS1 EQU$0016 ;SCI;SCI状态寄存器状态寄存器1 1B-SCTE EQU 7 B-SCTE EQU 7 ;发送缓冲区空标志位发送缓冲区空标志位B-TC EQU 6 B-TC EQU 6 ;发送完成标志位发送完成标志位B-SCRF EQU 5 B-SCRF EQU 5 ;接收器满标志位接收器满标志位SCDR EQU$0018 SCDR EQU$0018 ;SCI;SCI数据寄存器数据寄存器*-*-A/DA/D寄存器寄存器-ADSCR EQU$003C ADSCR EQU$003C ;A/D;A/D转换状态和控制寄存器转换状态和控制寄存器B-COCO EQU 7 B-COCO EQU 7 ;转换完成标志位转换完成标志位ADR EQU$003D ADR EQU$003D ;A/D;A/D转换数据寄存器转换数据寄存器ADCLK EQU$003E ADCLK EQU$003E ;A/D;A/D转换输入时钟寄存器转换输入时钟寄存器RAMstartAddr equ$0040RAMstartAddr equ$0040;RAM;RAM的起始地址(因芯片不同可以更改)的起始地址(因芯片不同可以更改)FlashStartAddr equ$8000FlashStartAddr equ$8000;程序开始地址(因芯片不同可以更改)程序开始地址(因芯片不同可以更改)42*-*-数据区定义(变量定义)数据区定义(变量定义)-ORG RAMstartAddrORG RAMstartAddr ;RAM ;RAM的起始地址的起始地址INBUF RMB 1 INBUF RMB 1 ;1;1字节存放字节存放5 5位开关量位开关量ADBUF RMB 8 ADBUF RMB 8 ;8;8字节存放字节存放8 8路路A/DA/D转换结果转换结果ONOFF RMB 1 ONOFF RMB 1 ;1;1字节存放从字节存放从PCPC的数据的数据 TMPVAR RMB 1 TMPVAR RMB 1 ;暂存使用暂存使用43*-*-主程序主程序-ORG ORG FlashStartAddr ;FlashStartAddr ;程序起始地址程序起始地址MainInit:MainInit:NOP NOP LDA#$3E LDA#$3E ;A/D;A/D初始化初始化2 2分频、使用内部总线时钟分频、使用内部总线时钟 STA ADCLKSTA ADCLK LDA#$FF LDA#$FF ;定义定义PORTAPORTA输出输出 STA DDRASTA DDRA LDA#$00 LDA#$00 STA PTA STA PTA STA ONOFF STA ONOFF ;ONOFF=0;ONOFF=0 LDA#$00 LDA#$00 ;定义定义PORTBPORTB,PORTCPORTC作为输入作为输入 STA DDRBSTA DDRB STA DDRC STA DDRC44*-*-A/DA/D转换转换-Main:Main:NOP NOP ;循环获得循环获得8 8路路ADAD值值 LDHX#$0 LDHX#$0 ;H;H:X=0X=0GA-REPEAT:GA-REPEAT:TXA TXA ;X;X寄存器送到累加器寄存器送到累加器 STA ADSCR STA ADSCR ;选定一路选定一路A/DA/D,启动转换启动转换 BRCLR 7,ADSCR,*BRCLR 7,ADSCR,*;等待等待A/DA/D转换完成转换完成 LDA ADR LDA ADR ;A/D;A/D转换结果给转换结果给A A STA ADBUF,X STA ADBUF,X ;A;A给给 ADBUF+XADBUF+X,储存数据储存数据 AIX#1 AIX#1 ;下一存储单元下一存储单元 CPX#$08 CPX#$08 ;判断判断8 8路转换是否完成路转换是否完成 BNE GA-REPEAT BNE GA-REPEAT ;循环循环8 8次转换次转换8 8个通道模拟量个通道模拟量45*-*-串行通信输出串行通信输出-GET-IN:GET-IN:LDA PTC LDA PTC ;5;5位开关量采集位开关量采集 STA INBUF STA INBUF ;暂放暂放INBUFINBUF NOP NOP LDA#$56 LDA#$56 ;把把8686(1616进制数进制数5656)为握)为握 ;手信号送出到手信号送出到PCPC中中 BRCLR 7,SCS1,*BRCLR 7,SCS1,*;等待以前数据全部发出,等待以前数据全部发出,;SCTESCTE置置1 1,发送缓冲区空,发送缓冲区空 STA SCDR STA SCDR ;发送缓冲区空时,发送缓冲区空时,;可向可向SCISCI数据寄存器送数数据寄存器送数 46*-*-串行通信输入串行通信输入-NOPNOP LDHX#0 LDHX#0WS-REPE1:WS-REPE1:BRSET 5,SCS1,WS-RECE1 BRSET 5,SCS1,WS-RECE1 ;测试测试SCRFSCRF位,位,;判断接收缓冲器是否满判断接收缓冲器是否满 NOPNOP NOP NOP AIX#1 AIX#1 ;延时等待延时等待 CPHX#$FFFFCPHX#$FFFF BNE WS-REPE1 BNE WS-REPE1 BRA DISP1 BRA DISP1 ;超时退出超时退出WS-RECE1:WS-RECE1:LDA SCDR LDA SCDR ;读取收到的数据读取收到的数据 47 CMP#$56 CMP#$56 ;判断是否为确认信号判断是否为确认信号8686 BNE DISP1 BNE DISP1 ;不是退出,是就开始通信不是退出,是就开始通信 NOPNOP LDHX#0 LDHX#0WS-REPE2:WS-REPE2:BRSET 5,SCS1,WS-RECE2 BRSET 5,SCS1,WS-RECE2 ;测试测试SCRFSCRF位,位,;判断接收缓冲器是否满判断接收缓冲器是否满 NOPNOP NOP NOP AIX#1 AIX#1 ;延时等待延时等待 CPHX#$6688CPHX#$6688 BNE WS-REPE2 BNE WS-REPE2 ;超时退出超时退出 BRA DISP1BRA DISP148*-*-从从PCPC机接收数据,并储存后送机接收数据,并储存后送PTAPTA输出输出-*-*-(A.0A.0不受影响)不受影响)-WS-RECE2WS-RECE2 LDA SCDR LDA SCDR NOP NOP AND#$FE AND#$FE ;A0=0;A0=0 STA TMPVAR STA TMPVAR ;暂时缓存暂时缓存 LDA ONOFFLDA ONOFF AND#$1 AND#$1 ;留下留下A.0A.0 ORA TMPVAR ORA TMPVAR ;处理接收的数据,放在处理接收的数据,放在A A中中 STA ONOFF STA ONOFF ;储存接收数据在储存接收数据在ONOFFONOFF中中 NOP NOP ;送送A/DA/D值值49*-*-把在把在INBUFINBUF和和ADBUFFADBUFF的数据送的数据送PCPC机输出机输出-LDHX#$0LDHX#$0SA-REPEAT:SA-REPEAT:LDA INBUF,X LDA INBUF,X BRCLR 7,SCS1,*BRCLR 7,SCS1,*;SCTE;SCTE置置1 1,;发送缓冲区空发送缓冲区空 STA SCDR STA SCDR ;A;A给给SCDRSCDR,发送出去发送出去 AIX#1AIX#1 CPX#$09 CPX#$09 ;9;9个数据输出个数据输出 BNE SA-REPEATBNE SA-REPEAT50DISP1:DISP1:NOP NOP LDA ONOFF LDA ONOFF EOR#$1 EOR#$1 ;把原把原A.0A.0取反,使灯闪烁取反,使灯闪烁 STA ONOFFSTA ONOFF STA PTA STA PTA BRA MAIN BRA MAIN*-*-中断矢量中断矢量-ORG$FFFE ORG$FFFE ;复位矢量复位矢量 DW MainInit:DW MainInit:51备注说明备注说明:单片机与单片机与PCPC机使用串行异机使用串行异步通信。在此程序下,通过步通信。在此程序下,通过PCPC机下的机下的VB6.0VB6.0控制程序构成一定控制程序构成一定功能的微机控制系统。功能的微机控制系统。52键盘编程实验键盘编程实验实验目的实验目的实验器材实验器材硬件接线硬件接线软件功能软件功能程序清单程序清单备注说明备注说明53实验目的实验目的:键盘查询,键盘中断,键盘查询,键盘中断,键值识别,键盘编码键值识别,键盘编码.54实验器材实验器材:1.SD-1型在线编程实验板型在线编程实验板2.导线若干导线若干55硬件接线硬件接线:红线为学生接线红线为学生接线PTC3PTA7PTA6PTA5PTA4PTA3PTA2PTA1PTA0PTC0PTC1PTC2MOTOROLA GP32 MCUPTC4内置电阻内置电阻VCC56 2 DE 键值表键值表:1 EE 3 BE 4 7E 5 ED 6 DD 7 DD 8 7D 9 EB 0 DB A BB B 7B C E7 D D7 E B7 F 77键值键值定义定义57软件功能软件功能:开始运行时,指示灯开始运行时,指示灯7 7亮,等待键盘按键。亮,等待键盘按键。按下按下“D”D”键进入运行状态,指示灯键进入运行状态,指示灯7 7闪烁。闪烁。在指示灯在指示灯7 7闪烁状态,按闪烁状态,按“0-9”“0-9”任意一键,任意一键,指示灯指示灯3-03-0显示对应的二进制值(显示对应的二进制值(0 0为灯亮,为灯亮,1 1为灯暗,如为灯暗,如1 1的二进制为的二进制为00010001,显示应为,显示应为“亮亮亮暗亮亮亮暗”),按),按“A-F”A-F”任意一键,任意一键,指示灯指示灯3-03-0全暗。全暗。58程序清单程序清单:程序说明程序说明口地址定义口地址定义数据区定义数据区定义主程序主程序键盘中断初始化键盘中断初始化子程序子程序扫描读键值子程序扫描读键值子程序键盘中断子程序键盘中断子程序键盘转化为具体值键盘转化为具体值子程序子程序延时程序子程序延时程序子程序中断矢量中断矢量59*-*-程序说明程序说明-*-*文件名:文件名:key.asmkey.asm*使用使用4*44*4键盘实现输入控制键盘实现输入控制*硬件连接:硬件连接:*PTA7-4PTA7-4接接4 4根键盘列线(根键盘列线(X4-1X4-1),),PTA3-0PTA3-0接接4 4根键盘行线根键盘行线*(Y4-1Y4-1)*PTC4*PTC4接指示灯接指示灯7 7(OUT7OUT7),),PTC3-0PTC3-0分别接指示灯分别接指示灯3-3-0 0(OUT3-0OUT3-0)*程序描述:程序描述:1.1.开始运行时,指示灯开始运行时,指示灯7 7亮,等待键盘按键亮,等待键盘按键*2.*2.按下按下“D”D”键进入运行状态,指示灯键进入运行状态,指示灯7 7闪烁闪烁*3.*3.在指示灯在指示灯7 7闪烁状态,按闪烁状态,按“0-9”“0-9”任意一键,指示灯任意一键,指示灯3-03-0*显示对应的二进制值(显示对应的二进制值(0 0为灯亮,为灯亮,1 1为灯暗,如为灯暗,如1 1的二进制为的二进制为00010001*显示应为显示应为“亮亮亮暗亮亮亮暗”),按),按“A-F”A-F”任意一键,指示灯任意一键,指示灯3-03-0全暗。全暗。*目的:键盘查询,键盘中断,键值识别,键盘编码目的:键盘查询,键盘中断,键值识别,键盘编码*-*-*60*-口地址定义口地址定义-DDRA EQU$0004 ;A;A口数据方向寄存器口数据方向寄存器PTA EQU$0000 ;A;A口数据寄存器口数据寄存器PTAPUE EQU$000D ;A;A口上拉电阻允许寄存器口上拉电阻允许寄存器DDRC EQU$0006 ;C;C口数据方向寄存器口数据方向寄存器PTC EQU$0002 ;C;C口数据寄存器口数据寄存器INTKBSCR EQU$001A ;键盘状态和控制寄存器键盘状态和控制寄存器INTKBIER EQU$001B ;键盘中断允许寄存器键盘中断允许寄存器61*-*-数据区定义(变量定义)数据区定义(变量定义)-ORG$0090ORG$0090TMPVAR1 RMB 1 TMPVAR1 RMB 1 ;变量变量TMPVAR1TMPVAR1,缓冲使用缓冲使用TMPVAR2 RMB 1 TMPVAR2 RMB 1 ;变量变量TMPVAR2TMPVAR2,缓冲使用缓冲使用KBVALUE RMB 1 KBVALUE RMB 1 ;存放键盘按键值存放键盘按键值PTCSTATE RMB 1 PTCSTATE RMB 1 ;PTC;PTC口状态变量口状态变量RAMstartAddr equ$0040RAMstartAddr equ$0040;RAM;RAM的起始地址(因芯片不同可以更改)的起始地址(因芯片不同可以更改)FlashStartAddr equ$8000FlashStartAddr equ$8000;程序开始地址程序开始地址(因芯片不同可以更改)(因芯片不同可以更改)*62 ORG ORG FlashStartAddrFlashStartAddr ;程序起始地址程序起始地址*-*-主程序主程序-MainInit:MainInit:NOP NOP LDA#$00 LDA#$00 ;定义定义C C口之前复位口之前复位PTCPTC STA PTC STA PTC LDA#%00011111 LDA#%00011111 ;定义定义C C口口4-04-0为输出为输出 STA DDRC STA DDRC ;C;C口接指示灯口接指示灯 STA PTC STA PTC ;初始时指示灯熄灭初始时指示灯熄灭 BCLR 4,PTC BCLR 4,PTC ;PTC4;PTC4为为0 0,指示灯,指示灯7 7点亮点亮 ;表示进入开始状态表示进入开始状态63;-;-A A口接键盘,查询等待按键口接键盘,查询等待按键-LDA#$00 LDA#$00 ;定义定义A A口前复位口前复位PTAPTA STA PTA STA PTA LDA#%00001111 LDA#%00001111 STA DDRA STA DDRA LDA#%11110000 LDA#%11110000 STA PTAPUE STA PTAPUE64MainIni1:MainIni1:JSR KBA JSR KBA ;取得键值在取得键值在A A中中 STA KBVALUE STA KBVALUE ;键值放在键值放在KBVALUEKBVALUE中中 ;作为作为KBdefKBdef的入口的入口 JSR KBdef JSR KBdef ;具体值在具体值在A A中中 cmp#$46 cmp#$46 ;ASCII;ASCII(“F”“F”)是否为是否为$46$46 BNE MainIni1 BNE MainIni1 ;不是等待不是等待“F”F”键键;-;-设置键盘中断设置键盘中断-JSR KBInit JSR KBInit ;已按已按“F”F”键,进入运行状态,键,进入运行状态,;执行键盘中断初始化子程序执行键盘中断初始化子程序 BCLR 1,INTKBSCR BCLR 1,INTKBSCR ;开放键盘中断开放键盘中断 CLICLI65;-开始总循环处理键盘开始总循环处理键盘-Start:Start:NOP NOP;-使灯闪烁使灯闪烁-BCLR 4,PTC BCLR 4,PTC ;PTA4=0;PTA4=0,电亮指示灯电亮指示灯7 7 LDA#$08LDA#$08 JSR Delaysub JSR Delaysub BSET 4,PTC BSET 4,PTC ;PTA4=1;PTA4=1,熄灭指示灯熄灭指示灯7 7 LDA#$08LDA#$08 JSR Delaysub JSR Delaysub 66 JSR Kbde JSR Kbde ;执行键盘转化为具体值子程序,执行键盘转化为具体值子程序,;转成键定义值转成键定义值 CMP#$39 CMP#$39 ;测试是否是测试是否是0-90-9 BHI Start1 BHI Start1 ;大于大于ASCIIASCII(“9”“9”)到到Start1Start1 SUB#$30 SUB#$30 ;数字实际值数字实际值=ASCIIASCII值值-$30-$30 STA PTC STA PTC ;送送PTCPTC口口,由指示灯由指示灯3-03-0显示显示 BRA StartBRA StartStart1:Start1:LDA#$FF LDA#$FF ;大于大于ASCIIASCII(“9”“9”),消灭指示灯消灭指示灯 STA PTCSTA PTC JMP Start JMP Start ;继续循环处理继续循环处理67*-*-键盘中断初始化子程序(从键盘中断初始化子程序(从KBInitKBInit开始)开始)-*功能:对被定义为键盘中断的引脚初始化,但未开放键盘中断功能:对被定义为键盘中断的引脚初始化,但未开放键盘中断*占用占用CPUCPU内寄存器:内寄存器:A A*-*-KBInit:KBInit:LDA#$00 LDA#$00 ;定义定义A A口之前复位口之前复位PTAPTA STA PTA STA PTA LDA#%00001111 LDA#%00001111 ;定义定义A A口口7-47-4输入作为列,输入作为列,;3-0 ;3-0输出作为行输出作为行 STA DDRASTA DDRA LDA#%11110000 LDA#%11110000 ;定义定义A A口口7-47-4有上拉电阻有上拉电阻 STA PTAPUESTA PTAPUE BSET 1,INTKBSCR BSET 1,INTKBSCR ;屏蔽键盘中断屏蔽键盘中断 LDA#%11110000 LDA#%11110000 ;允许允许KBIE7-4PINKBIE7-4PIN中断进入中断进入 STA INTKBIERSTA INTKBIER BSET 2,INTKBSCR BSET 2,INTKBSCR ;清除键盘中断清除键盘中断 RTSRTS68*-*-扫描读键值子程序(从扫描读键值子程序(从KBAKBA开始)开始)-*功能功能:扫描一次接在扫描一次接在PTAPTA口的口的4*44*4键盘(键盘(PTA7-4PTA7-4接接4 4根键盘根键盘*(X4-1X4-1),),PTA3-0PTA3-0接接4 4根键盘行线(根键盘行线(Y4-1Y4-1)上的按键(使上的按键(使*用行扫描法),键值放在用行扫描法),键值放在A A中中,若无按键,若无按键,A A中值中值$FFFF*占用内存:占用内存:TMPVAR1TMPVAR1(缓冲使用)缓冲使用)*出口:出口:A=A=键值键值*-*-KBA:KBA:MOV#%11111110,TMPVAR1 MOV#%11111110,TMPVAR1 ;第一根行线为第一根行线为0 0 LDX#$04 LDX#$04 ;扫描扫描4 4根行线根行线KB1:KB1:LDA PTA LDA PTA ;取取PTAPTA给给A A ORA#%00001111 ORA#%00001111 ;PTA7-4;PTA7-4保留原态,保留原态,PTA3-0PTA3-0为为1 1 AND TMPVAR1 AND TMPVAR1 ;令令PTAn=0PTAn=0,n=0n=0,1 1,2 2,3 3 STA PTA STA PTA ;处理后给处理后给PTAPTA以便查询以便查询69 NOPNOP NOP NOP LDA PTA LDA PTA ;查第查第n n列上是否有键按下列上是否有键按下 AND#%11110000 AND#%11110000 ;保留保留PTA7-4PTA7-4列值,令低列值,令低PTA3-0=0PTA3-0=0 CBEQA#$F0,KB2 CBEQA#$F0,KB2 ;A;A等于等于$F0F0,本行线没键按下本行线没键按下 ;A A不等于不等于$F0,F0,本行有键按下本行有键按下 LDA PTA LDA PTA ;A;A放键值放键值 BRA KB3 BRA KB3 ;转到转到KB3KB3结束中断结束中断KB2:KB2:SEC SEC ;令令C=1C=1 ROL TMPVAR1 ROL TMPVAR1 ;使下一个行线为使下一个行线为0 0,查下一行,查下一行 DBNZX KB1 DBNZX KB1 ;对行线循环对行线循环 LDA#$FF LDA#$FF ;没有键被按下为没有键被按下为$FFFFKB3:RTSKB3:RTS70*-*-键盘中断子程序(从键盘中断子程序(从KBintKBint开始)开始)-*功能:键盘中断程序,键值放入内存功能:键盘中断程序,键值放入内存KBVALUEKBVALUE中中*调用子程序:扫描法读键值子程序(调用子程序:扫描法读键值子程序(KBAKBA),),*键盘中断初始化子程