已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,定时液晶显示实验,实验目的 实验器材 硬件接线,软件功能 程序清单 备注说明,2,实验目的:,LCD与定时中断的联合编程, 显示时钟,3,实验器材:,1.SD-1型在线编程实验仪 2.导线若干,4,硬件接线:,使用实验板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)),5,软件功能:,开始时,LCD显示两行“Current Time is: 00:00:00 SUDA ” “*”键为设置键,按下后可设置时,分,秒, 随后 按“#”时钟开始运行 。,6,程序清单:,口地址定义 定时器的寄存器地址定义 变量定义 系统初始化 总循环 扫描读键值子程序 键盘中断子程序 定时器溢出子程序,键盘中断初始化子程序 键盘转化为具体值子程序 LCD初始化子程序 LCD命令执行子程序 LCD显示子程序 转码子程序 中断矢量,7,备注说明:,运行时请与标准时间进行校对,8,口地址定义,*单片机的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 ;键盘中断允许寄存器,9,定时器的寄存器地址定义,T1SC EQU $0020 ;定时器1状态和控制寄存器 T1CNTH EQU $0021 ;定时器1计数寄存器(高位) T1CNTL EQU $0022 ;定时器1计数寄存器(低位) T1MODH EQU $0023 ;定时器1模数寄存器(高位) T1MODL EQU $0024 ;定时器1模数寄存器(低位),10,变量定义,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,11,初始化,系统初始化 PLL初始化 口初始化 定时器1初始化 设定初始时间 键盘中断初始化,12,系统初始化,NOP ;初始化开始 SEI ;禁止所有中断 LDHX #$023F ;堆栈初始化,放入GP32的RAM最高端 TXS MOV #%00000001,$001E ;初始化CONFIG2,内部总线时钟用作SCI的时钟 MOV #%00111101,$001F ;初始化CONFIG1,允许LVI复位信号, ;禁止LIV模块的电源,LIV工作在5V, ;经过32个周期退出STOP模式,禁止COP模块,13,PLL初始化,;外接晶阵32.768KHz,初始化成总线频率为2.4576MHz 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为系统时钟源,14,口初始化,LDA #%11110000 STA PTAPUE LDA #%11111111 ;B口为输出 STA DDRB LDA #%00000111 ;C口的PTC0-2为输出 STA DDRC,15,定时器1初始化,LDA #%01100110 ;允许溢出中断、不启动计数、分频因子=64 STA T1SC LDHX #$0000 ;计数寄存器初值=$0000 STHX T1CNTH LDHX #$9600 ;设1秒产生1次溢出中断 STHX T1MODH ;模数寄存器设定值=1(2457600/64)=$9600,16,设定初始时间,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,17,键盘中断初始化,JSR KBInit ;执行键盘中断初始化子程序 -初始化完毕-,18,总循环,; 允许定时器1计数寄存器计数, ;开放定时中断,开放键盘中断 BCLR 1,INTKBSCR ;开放键盘中断 BCLR 5,T1SC ;允许定时器1计数寄存器计数 CLI ;开放中断 * 总循环 Start_1: ;总循环开始处 NOP ;仅为实验例程,主循环无实际工作 BRA Start_1,19,扫描读键值子程序(从KBA开始),功能:扫描一次接在PTA口的4*4键盘 (PTA7-4接4根键盘列线(X4-1),PTA3-0接 4根键盘行线(Y4-1)上的按键(使用行扫描法), 键值放在A中若无按键, A中值$FF 占用内存:Tmpvar1(缓冲使用) 出口:A=键值 -,20,扫描读键值子程序,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 ;没有键被按下为$FF KB3:RTS,21,键盘中断初始化子程序(从KBInit开始),功能:对被定义为键盘中断的引脚进行初始化, 但未开放 键盘中断 占用CPU内寄存器:A,22,键盘中断初始化子程序,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,23,键盘中断子程序(从KBint开始),-键盘中断子程序(从KBint开始)- 功能:键盘中断程序,键值放入内存KbValue中 调用子程序:扫描法读键值子程序(KBA),键盘中断初始化子程序(KBInit) 出口:第0页内存单元KbValue中为键值 -,24,键盘中断子程序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 ;“ “,25,键盘中断子程序2,STA LCD_Buffer2,X JSR Show_LCD ;将内存LCD_Buffer12的32字节ASCII字符送LCD显示 LDHX #!90 ;延时90毫秒 JSR Delay_ms LDHX #$00 LDX SetByte LDA Tmpvar4 ;原来的值 STA LCD_Buffer2,X JSR Show_LCD ;将内存LCD_Buffer12的32字节ASCII字符送LCD显示 LDHX #!90 JSR Delay_ms JSR KBA ;调子程序KBA,键值放在A中 STA KbValue ;放入内存KbValue JSR KBdef ;执行键盘转化为具体值子程序,转成键定义值放入A中 CMP #$23 ;是“#“ BEQ KBint_Exit0 CMP #$39 BHI SetUp ;$39(数值9)转SetUp CMP #$30 BLO SetUp ;$30(数值0)转SetUp,26,键盘中断子程序3,PSHA ;保护A(ASCII值) ;判断当前位的输入是否有效 ;第0位只能是02,第0位和第1位合在一起小于24 ;第3、6位小于6 LDA SetByte CMP #!0 BEQ SetUp0 CMP #!1 BEQ SetUp1 CMP #!3 BEQ SetUp2 CMP #!6 BEQ SetUp2 PULA BRA SetUp3 SetUp0: ;第0位只能是02(ASCII值小于等于32) PULA CMP #$32 BHI SetUp ;$32(数值2) 无效 转SetUp BRA SetUp3,27,键盘中断子程序4,SetUp1: ;第0位和第1位合在一起小于24 LDA LCD_Buffer2 SUB #$30 ;ASCII 值-数值 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,28,键盘中断子程序5,INC SetByte ;设置下一位 ;判断下一位是不是第2、5(:)、8位 LDA SetByte CMP #!2 BEQ SetUp4 CMP #!5 BEQ SetUp4 CMP #!8 ;是第8位,退出设置 BHS KBint_Exit0 BRA SetUp5 SetUp4: ;是第2、5位(:),跳过该位的设置 INC SetByte SetUp5: JMP SetUpStore KBint_Exit0: ;将当前的设置值放到变量Hou、Min、Sec中 LDA LCD_Buffer2 SUB #$30 ;ASCII 值-数值 LDX #!10 MUL LDHX #!1 ADD LCD_Buffer2,X,29,键盘中断子程序6,SUB #$30 STA Hou LDHX #!3 LDA LCD_Buffer2,X SUB #$30 ;ASCII 值-数值 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 LCD_Buffer2,X SUB #$30 STA Sec JSR Show_LCD ;将内存LCD_Buffer12的32字节ASCII字符送LCD显示,30,键盘中断子程序7,BCLR 7,T1SC ;清除定时器溢出标志位 KBint_Exit: PULH ;H出栈 BSET 1,INTKBSCR ;禁止键盘中断 BSET 2,INTKBSCR ;清除键盘中断 JSR KBInit ;调用键盘中断初始化子程序 BCLR 1,INTKBSCR ;开放键盘中断 CLI RTI,31,键盘转化为具体值子程序(从KBdef开始),功能:键值转为键盘表面具体的字符或符号代表值 入口:内存第0页中KBValue为键值, 使用键值编号表 占用CPU寄存器:X(存放相对地址) 出口:A=键定义值,32,键盘转化为具体值子程序,KBdef: LDHX #$0000 KBkey1: LDA KBTABLE,X BEQ KBkey3 ;=0,表示表中未定义此键值 CMP KBValue ;与KBValue入口键值相比较 BNE KBkey2 ;不等,未找到转KBkey2 INCX ;找到地址加1 LDA KBTABLE,X ;取键定义值给A BRA KBkeyr KBkey2: INCX INCX BRA KBkey1 KBkey3: LDA #$FF ;未定义键用FF标志 KBkeyr:RTS KBTABLE FCB $EE,“1“,$DE,“2“,$BE,“3“,$7E,“A“ FCB $ED,“4“,$DD,“5“,$BD,“6“,$7D,“B“ FCB $EB,“7“,$DB,“8“,$BB,“9“,$7B,“C“ FCB $E7,“*“,$D7,“0“,$B7,“#“,$77,“D“ FCB $00,33,Init_LCD(LCD初始化子程序),入口:无 功能:初始化LCD(HD44780) 调用子程序:LCD_Command(LCD命令执行子程序) 占用CPU内部寄存器:A,X,34,Init_LCD,Init_LCD: BCLR LCD-RS,PTC ;令LCD的RS=0,R/W=0,进行LCD初始化 BCLR LCD-RW,PTC LDA #%00111000 ;功能设置:8位数据接口,2行显示,5*7点阵模式 JSR LCD_Command LDA #%00001000 ;显示开关控制:关显示,关光标显示,不闪烁 JSR LCD_Command LDHX #$0020 ;等待40us DBNZX * BCLR LCD-RS,PTC ;RS,RW清零开始清屏 BCLR LCD-RW,PTC LDA #%00000001 ;清屏指令 JSR LCD_Command LDHX #$2DF ;等待清屏完毕,时间1.6ms CLR-LCD-2-MS: ;延时 AIX #-1 CPHX #0 BNE CLR-LCD-2-MS LDA #%00000110 ;输入方式设置:数据读写操作后,AC自动增1 ;显示不动,光标左移 JSR LCD_Command LDA #%00010100 ;光标移位设置:光标右移一个字符位,AC自动加1 JSR LCD_Command LDA #%00001100 ;显示开关设置:开显示,关光标显示,不闪烁 JSR LCD_Command RTS,35,LCD_Command(LCD命令执行子程序),入口:A 功能:对A中指令使用PORTA作为输出口, 到LCD进行命令执行或字符显示 占用CPU内部寄存器:A,36,LCD_Command,LCD_Command: PSHH ;保护现场 PSHX LDHX #$0020 ;等待40us DBNZX * STA PTB ;把指令码送到A口 NOP NOP BSET LCD_E,PTC ;LCD开始接受数据,置使能位为1 NOP NOP BCLR LCD_E,PTC ;LCD结束接受数据,置使能位为0 LDHX #$0020 ;等待40us DBNZX * PULX ;恢复现场 PULH RTS,37,Show_LCD(LCD显示子程序),入口:A,HX 出口:HX所指的内存二字节地址为A中 描述:转一字节16进制数为二字节ASCII码字符,38,Show_LCD,;第一行 Show_LCD: ;进行显示数据寄存器(DD RAM)地址设置 BCLR LCD-RS,PTC BCLR LCD-RW,PTC ;设置前8个字符首DD RAM地址 LDA #%10000000 JSR LCD_Command LDHX #$00 ;显示前8个字符 Show-First-8Byte: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0,写入数据到DD RAM中 BCLR LCD-RW,PTC LDA LCD_Buffer1,X ;将LCD_Buffer+X的数据放入A作为入口 JSR LCD_Command AIX #1 CPHX #$8 BNE Show-First-8Byte LDA #%10001000 ;设置后8个字符首DD RAM地址 BCLR LCD-RS,PTC BCLR LCD-RW,PTC JSR LCD_Command LDHX #$08 ;显示后8个字符,39,Show_LCD1,Show-Next-8Byte: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0,写入数据到DD RAM中 BCLR LCD-RW,PTC LDA LCD_Buffer1,X ;将LCD_Buffer+X的数据放入A作为入口 JSR LCD_Command AIX #1 CPHX #$10 BNE Show-Next-8Byte ;第二行,进行DD RAM地址设置 BCLR LCD-RS,PTC ;令LCD的RS0、R/W=0 BCLR LCD-RW,PTC LDA #%11000000 ;设置DD RAM地址为#%1000000(即40H) JSR Lcd_Command ;执行设置光标在DDRAM位置 LDHX #$0 ;显示前8个字符 Show_F_8b2: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0:写数据 BCLR LCD-RW,PTC LDA LCD_Buffer2,x ;将LCD_Buffer开始的中第x位数据存放入A中 JSR Lcd_Command ;执行命令 AIX #1 CPHX #$8 BNE Show_F_8b2 ;完成前8个字符的显示,40,Show_LCD2,;进行DD RAM地址设置 LDA #%11001000 ;设置DDRAM地址为#%1000000(即48H) BCLR LCD-RS,PTC ;令LCD的RS0、R/W=0 BCLR LCD-RW,PTC JSR Lcd_Command ;执行命令 LDHX #$08 ;显示后8个字符 Show_N_8b2: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0:写数据 BCLR LCD-RW,PTC LDA LCD_Buffer2,x ;将LCD_Buffer开始的中第x位数据存放入A中 JSR Lcd_Command ;执行命令 AIX #1 CPHX #$10 BNE Show_N_8b2 ;完成后8个字符的显示 RTS,41,转码子程序,TimeCH: PSHA ;进栈,保存A,H,X中的内容 PSHH PSHX LDHX #$000A ;取10 DIV ;除以10,A中放商,H中放余数 ADD #$30 ;实际数值加上$30(!48)变ASCII码 P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国中古艺术品行业市场深度调研及发展趋势与投资前景研究报告
- 2026年心理咨询师《心理测验技能》阶段测试卷(附答案)
- 2026人工智能驾驶辅助系统市场需求深度调研报告
- 2026汽车保养市场调查与分析优先方案报告
- 2026皮革制造行业低碳转型政策研究及清洁能源投资背景调查报告
- 基于磁感应成像的生物组织测量系统:原理、应用与展望
- 基于电子鼻技术的稻谷储藏品质快速判定体系构建与应用
- 基于用户行为分析的个性化电商网站系统构建与实践
- 基于生物行为的群体智能优化方法:原理、应用与展望
- 2026年湖南省汨罗市高三数学下册期末考试模拟测试卷附答案【轻巧夺冠】
- 2026年注册(营养师、营养指导员)资格证必过考试题库与答案
- 2026年软件工程开发工程师试题及答案
- 消防培训防盗、防火安全课件
- 2026中国母婴新零售全渠道融合与私域流量运营策略报告
- 新国职健身教练考试题库及答案
- 2025年10月自考02126应用文写作试卷及答案
- 2026年监理员考试题库及答案
- 妇科肿瘤整合加速康复外科管理中国专家共识(2026年版)
- 2026年小学道德与法治教师专业考试试题及答案
- 2026年屠宰兽医卫生检验员考试题库(含考点)
- 2026安徽交控集团所属企业招聘笔试历年典型考点题库附带答案详解
评论
0/150
提交评论