资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,编辑课件,*,定时液晶显示实验,实验目的,实验器材,硬件接线,软件功能,程序清单,备注说明,1,编辑课件,实验目的:,LCD,与定时中断的联合编程,,显示时钟,2,编辑课件,实验器材:,1.,SD-1,型在线编程实验仪,2.导线若干,3,编辑课件,硬件接线:,使用实验板,LCD,固定接线,(1.单片机的,PTB0-PTB7,作为输出与,LCD,的,D0-D7,连接;,2.单片机的,PTC0,PTC1,PTC2,分别接,LCD,的,RS R/W E;,3.,单片机的,PTA7-4,接4根键盘列线(,X4-1),,PTA3-0,接4根键盘行线(,Y4-1)),4,编辑课件,软件功能:,开始时,LCD,显示两行“,Current Time is:,00:00:00 SUDA”,“*”,键为设置键,按下后可设置时,分,秒,随后,按“#”时钟开始运行。,5,编辑课件,程序清单:,口地址定义,定时器的寄存器地址定义,变量定义,系统初始化,总循环,扫描读键值子程序,键盘中断子程序,定时器溢出子程序,键盘中断初始化子程序,键盘转化为具体值子程序,LCD,初始化子程序,LCD,命令执行子程序,LCD,显示子程序,转码子程序,中断矢量,6,编辑课件,备注说明:,运行时请与标准时间进行校对,7,编辑课件,口地址定义,*单片机的,PTA7-4,接4根键盘列线(,X4-1),PTA3-0,接4根键盘行线(,Y4-1),DDRA EQU$0004 ;A,口数据方向寄存器,PTA EQU$0000 ;A,口数据寄存器,PTAPUE EQU$000D ;A,口上拉电阻允许寄存器,*单片机的,PTB0-PTB7,作为输出与,LCD,的,D0-D7,连接,DDRB equ$0005 ;B,口数据方向寄存器,PTB equ$0001 ;B,口数据寄存器,*单片机的,PTC0,PTC1,PTC2,分别接,LCD,的,RS R/W E,PTC EQU$0002 ;C,口数据寄存器,DDRC EQU$0006 ;C,口数据方向寄存器,LCD-RS EQU 0 ;LCD,寄存器选择信号接,PTC0,LCD-RW EQU 1 ;,读写信号接,PTC1,LCD_E EQU 2 ;LCD,使能信号接,PTC2,INTKBSCR EQU$001A ;,键盘状态和控制寄存器,INTKBIER EQU$001B ;,键盘中断允许寄存器,8,编辑课件,定时器的寄存器地址定义,T1SC EQU$0020 ;,定时器1状态和控制寄存器,T1CNTHEQU$0021 ;,定时器1计数寄存器(高位),T1CNTLEQU$0022 ;,定时器1计数寄存器(低位),T1MODHEQU$0023 ;,定时器1模数寄存器(高位),T1MODLEQU$0024 ;,定时器1模数寄存器(低位),9,编辑课件,变量定义,RAMstartAddr equ$0040;RAM,的起始地址(因芯片不同可以更改),FlashStartAddr equ$8000;,程序开始地址(因芯片不同可以更改),ORG RAMstartAddr,LCD_Buffer1 RMB 16 ;,存放16字节显示缓冲数据(第一行),LCD_Buffer2 RMB 16 ;,存放16字节显示缓冲数据(第二行),Sec RMB 1 ;,时钟的秒,Min RMB 1 ;,时钟的分,Hou RMB 1 ;,时钟的小时,BeginRun RMB 1 ;,SetByte RMB 1 ;,KBValue RMB 1 ;,执行键盘中断程序后,存放键值的内存,KbValue,Tmpvar1 RMB 1 ;,变量,Tmpvar1,,缓冲使用,Tmpvar2 RMB 1 ;,变量,Tmpvar2,,缓冲使用,Tmpvar3 RMB 1 ;,变量,Tmpvar3,Tmpvar4 RMB 1 ;,变量,Tmpvar4,10,编辑课件,初始化,系统初始化,PLL,初始化,口初始化,定时器1初始化,设定初始时间,键盘中断初始化,11,编辑课件,系统初始化,NOP ;,初始化开始,SEI ;,禁止所有中断,LDHX#$023F ;,堆栈初始化,放入,GP32,的,RAM,最高端,TXS,MOV#%00000001,$001E ;,初始化,CONFIG2,内部总线时钟用作,SCI,的时钟,MOV#%00111101,$001F ;,初始化,CONFIG1,允许,LVI,复位信号,;禁止,LIV,模块的电源,LIV,工作在5,V,;,经过32个周期退出,STOP,模式,禁止,COP,模块,12,编辑课件,PLL,初始化,;外接晶阵32.768,KHz,初始化成总线频率为2.4576,MHz,CLR$0036 ;,清零,初始化,PCTL,MOV#$01,$0036,MOV#$01,$0038,MOV#$2C,$0039,MOV#$80,$003A,BSET 5,$0036,BSET 7,$0037 ;,自动方式,BSET 4,$0036 ;,选择,PLL,为系统时钟源,13,编辑课件,口初始化,LDA#%11110000,STA PTAPUE,LDA#%11111111 ;B,口为输出,STA DDRB,LDA#%00000111 ;C,口的,PTC0-2,为输出,STA DDRC,14,编辑课件,定时器1初始化,LDA#%01100110 ;,允许溢出中断、不启动计数、分频因子=64,STA T1SC,LDHX#$0000 ;,计数寄存器初值=$0000,STHX T1CNTH,LDHX#$9600 ;,设1秒产生1次溢出中断,STHX T1MODH ;,模数寄存器设定值=1(2457600/64)=$9600,15,编辑课件,设定初始时间,LDHX#$0000,Display1:;,把要显示的16个初始字符放入,LCD_Buffer12,中,LDA DisplayBytes1,X,STA LCD_Buffer1,X,LDA DisplayBytes2,X,STA LCD_Buffer2,X,AIX#1,CPHX#$10,BNE Display1 ;,循环16次,JSR Init_LCD ;LCD,初始化,JSR Show_LCD ;,将内存,LCD_Buffer12,的32字节,ASCII,字符送,LCD,显示,MOV#$00,SEC,MOV#$00,MIN,MOV#$00,HOU,16,编辑课件,键盘中断初始化,JSR KBInit ;,执行键盘中断初始化子程序,-初始化完毕-,17,编辑课件,总循环,;允许定时器1计数寄存器计数,,;开放定时中断,开放键盘中断,BCLR 1,INTKBSCR ;,开放键盘中断,BCLR 5,T1SC ;,允许定时器1计数寄存器计数,CLI ;,开放中断,*总循环,Start_1:;,总循环开始处,NOP ;,仅为实验例程,主循环无实际工作,BRA Start_1,18,编辑课件,扫描读键值子程序(从,KBA,开始),功能:扫描一次接在,PTA,口的4*4键盘,(,PTA7-4,接4根键盘列线(,X4-1),PTA3-0,接,4根键盘行线(,Y4-1),上的按键(使用行扫描法),,键值放在,A,中若无按键,A,中值$,FF,占用内存:,Tmpvar1(,缓冲使用),出口:,A=,键值,-,19,编辑课件,扫描读键值子程序,KBA:MOV#%11111110,Tmpvar1 ;,第一根行线为0,LDX#$04 ;,扫描4根行线,KB1:LDA PTA ;,取,PTA,给,A ORA#%00001111 ;PTA7-4,保留原态,,PTA3-0,为1,AND Tmpvar1 ;,令,PTAn=0,n=0,1,2,3 STA PTA ;,处理后给,PTA,以便查询,NOP NOP LDA PTA ;,查第,n,列上是否有键按下,AND#%11110000 ;,保留,PTA7-4,列值,令低,PTA3-0=0 CBEQA#$F0,KB2 ;A,等于$,F0,,本行线没键按下,转到,KB2 ;A,不等于$,F0,本行有键按下,LDA PTA ;A,放键值,BRA KB3 ;,转到,KB3,结束中断,KB2:SEC ;,令,C=1 ROL Tmpvar1 ;,使下一个行线为0,查下一行,DBNZX KB1 ;,对行线循环,LDA#$FF ;,没有键被按下为$,FFKB3:RTS,20,编辑课件,键盘中断初始化子程序(从,KBInit,开始),功能:对被定义为键盘中断的引脚进行初始化,,但未开放 键盘中断,占用,CPU,内寄存器:,A,21,编辑课件,键盘中断初始化子程序,KBInit:,LDA#$00 ;,定义,A,口之前复位,PTA,STA PTA,LDA#%00001111 ;,定义,A,口7-4输入(作为列),3-0输出(作为行),STA DDRA,LDA#%11110000 ;,定义,A,口7-4有上拉电阻,STA PTAPUE,BSET 1,INTKBSCR ;,屏蔽键盘中断,LDA#%11110000 ;,允许,KBIE7-4PIN,中断进入,STA INTKBIER,BSET 2,INTKBSCR ;,清除键盘中断,RTS,22,编辑课件,键盘中断子程序(从,KBint,开始),-键盘中断子程序(从,KBint,开始)-,功能:键盘中断程序,键值放入内存,KbValue,中,调用子程序:扫描法读键值子程序(,KBA),,键盘中断初始化子程序(,KBInit),出口:第0页内存单元,KbValue,中为键值 -,23,编辑课件,键盘中断子程序1,KBint:,PSHH ;,保护,H,SEI ;,禁止中断,BSET 1,INTKBSCR ;,禁止键盘中断,JSR KBA ;,调子程序,KBA,,键值放在,A,中,STA KbValue ;,放入内存,KbValue,JSR KBdef ;,执行键盘转化为具体值子程序,转成键定义值,;是否为*?,不是退出,KBint_Exit,CMP#!42 ;ASCI*,键,BEQ SetUpBegin,JMP KBint_Exit ;,不是,等待*键,SetUpBegin:;,是*,xx:xx:xx,BSET 2,INTKBSCR ;,清除键盘中断,MOV#$0,SetByte ;,赋初值0,SetUpStore:;,保存原来每位显示的数据,LDHX#$00,LDX SetByte,LDA LCD_Buffer2,X,STA Tmpvar4,SetUp:,LDHX#$00,LDX SetByte,LDA#!32 ;,$39(,数值9)转,SetUp,CMP#$30,BLO SetUp ;$30(,数值0)转,SetUp,$32(,数值2)无效 转,SetUp,BRA SetUp3,数值,LDX#!10,MUL ;(A)*(X)-A,STA TmpVar3 ;A-,临时单元,TmpVar3,PULA,PSHA,SUB#$30 ;ASCII,值-数值,ADD TmpVar3,CMP#!23,PULA,BHI SetUp ;23,无效 转,SetUp,BRA SetUp3 ;,有效 转,SetUp3,SetUp2:;,第3、6位小于6(,ASCII,值小于36),PULA,CMP#$36,BHS SetUp ;=36(,数值=6)无效 转,SetUp,SetUp3:;,是有效的数,则置于相应位置,LDHX#$00,LDX SetByte,STA LCD_Buffer2,X,数值,LDX#!10,MUL,LDHX#!1,ADD LCD_Buffer2,X,数值,LDX#!10,MUL,LDHX#!4,ADD LCD_Buffer2,X,SUB#$30,STA Min,LDHX#!6,LDA LCD_Buffer2,X,SUB#$30 ;ASCII,值-数值,LDX#!10,MUL,LDHX#!7,ADD LC
展开阅读全文