秒表程序汇编语言.docx

上传人:b****5 文档编号:12184520 上传时间:2023-04-17 格式:DOCX 页数:12 大小:16.39KB
下载 相关 举报
秒表程序汇编语言.docx_第1页
第1页 / 共12页
秒表程序汇编语言.docx_第2页
第2页 / 共12页
秒表程序汇编语言.docx_第3页
第3页 / 共12页
秒表程序汇编语言.docx_第4页
第4页 / 共12页
秒表程序汇编语言.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

秒表程序汇编语言.docx

《秒表程序汇编语言.docx》由会员分享,可在线阅读,更多相关《秒表程序汇编语言.docx(12页珍藏版)》请在冰豆网上搜索。

秒表程序汇编语言.docx

秒表程序汇编语言

;定义计时单元地址

HOUREQU30H;存放小时变量

MINEQU31H;存放分钟变量

SECEQU32H;存放秒钟变量

DEDAEQU33H;存放10ms计数值

;按键端口状况值

K1_NEQU34H;存放按键当前端口状况值

K1_PEQU35H;存放按键上次端口状况值

K1_CEQU37H;存放按键计数单元

XEQU36H;LCD地址变量

;按键引脚定义

K1EQUP3.3;按键1引脚定义

K2EQUP3.4;按键2引脚定义

;LCD引脚定义

RSEQUP3.5;LCDRS引脚定义

RWEQUP3.6;LCDRW引脚定义

EEQUP3.7;LCDRS引脚定义

ORG0000H;程序由地址0开始执行

JMPMAIN

ORG0BH;定时器0中断地址设置

JMPT0_INT

;―――――――――――――主程序――――――――――――――MAIN:

;开始

MOVSP,#60H;堆栈指针指向60H

CLRE;E=0,禁止读/写LCM

ACALLSET_LCD;调LCD控制子程序

ACALLINIT;初始化变量

MOVK1_P,#01H;按键上次端口设置1

ACALLINIT_TIMER;初始化定时器

ACALLMEU;调用工作菜单子程序

LOOP:

ACALLCONV;时间计数处理

ACALLLOOP1;调用清零键子程序

ACALLKEY;判断是否有键按下

JZLOOP;无键按下转LOOP

MOVK1_P,K1_N;交换数据

ACALLKEY0;调用按键功能子程序

JMPLOOP;跳LOOP处循环

;初始变量清零子程序

INIT:

;初始变量清零

CLRA;A清为零

MOVK1_C,A;K1_C初始为0

MOVDEDA,A;DEDA初始为0

MOVSEC,A;SEC初始为0

MOVMIN,A;MIN初始为0

MOVHOUR,A;HOUR初始为0

MOVK1_N,A;K1_N初始为0

MOVK1_P,A;K1_P初始为0

CLRTR0;启动中断

RET

;定时器初始化设置子程序

INIT_TIMER:

;定时器初始化

MOVTMOD,#01H;定时器0模式1

MOVIE,#10000010B;开通中断

RET

;中断服务程序

T0_INT:

;定时器T0中断程序

PUSHACC;入栈保护

INCDEDA

MOVA,DEDA;10ms计数值加1CJNEA,#100,TT

MOVDEDA,#0

INCSEC;秒加1

MOVA,SEC

CJNEA,#60,TT

INCMIN;分加1

MOVSEC,#0

MOVA,MIN

CJNEA,#60,TT

INCHOUR;时加1

MOVMIN,#0

MOVA,HOUR

CJNEA,#24,TT

MOVDEDA,#0

MOVSEC,#0;秒、分、时单元清0MOVMIN,#0

MOVHOUR,#0

TT:

POPACC;出栈

RETI;中断程序返回

;判断键是否按下子程序

LOOP1:

JBK2,LOOP2;判清零键是否按下

JMPMAIN;跳转主程序处LOOP2:

RET

;判断K1键是否按下

KEY:

CLRA;A清零

MOVK1_N,A;A值送入K1_N

MOVC,K1;K1值送入C

RLCA;同进位标志左移一位

ORLK1_N,A;两个位作逻辑OR运算

MOVA,K1_N;K1_N值送入A

XRLA,K1_P;有键按下,A中内容不为零RET

;K1键第一次按功能子程序

KEY0:

MOVA,K1_P;K1_P值送入A

JBACC.0,KEY3;A的0位是1,转KEY3

INCK1_C;K1_C加1

MOVA,K1_C;K1_C值送入A

CJNEA,#01H,KEY1;K1键是否第一次按?

MOVDPTR,#MENU1;是,存入MENU1信息

MOVA,#1;设置第一行显示

CALLLCD_PRINT;调用显示字符子程序

SETBTR0;启动中断

RET

;K1键第二次按功能子程序

KEY1:

MOVA,K1_C;K1_C值送入A

CJNEA,#02H,KEY2;K1键是否第二次按?

MOVDPTR,#MENU2;是,存入MENU2信息MOVA,#1;设置第一行显示

CALLLCD_PRINT;调用显示字符子程序

CLRTR0;停止中断

RET;

;K1键第三次按功能子程序

KEY2:

MOVA,K1_C;K1_C值送入A

CJNEA,#03H,KEY3;K1键是否第三次按?

MOVDPTR,#MENU3;是,存入MENU3信息MOVA,#1;设置第一行显示

CALLLCD_PRINT;调用显示字符子程序

SETBTR0;启动中断

RET

;K1键第四按功能子程序

KEY3:

MOVA,K1_C;K1_C值送入A

CJNEA,#04H,KEY4;K1键是否第四次按?

MOVDPTR,#MENU4;是,存入MENU4信息

MOVA,#1;设置第一行显示

CALLLCD_PRINT;调用显示字符子程序

CLRTR0;启动中断

KEY4:

RET;子程序返回

;―――――――――――――LCD显示――――――――――――――;LCD控制子程序

SET_LCD:

;

CLRE

ACALLINIT_LCD;初始化LCD

MOVR5,#10

ACALLDELAY

MOVDPTR,#LMESS1;指针指到显示消息1

MOVA,#1;显示在第一行

ACALLLCD_PRINT;调用显示字符子程序

MOVDPTR,#LMESS2;指针指到显示消息2

MOVA,#2;显示在第二行

ACALLLCD_PRINT;调用显示字符子程序

RET

;―――――――――――――――

LMESS1:

DB0;LCD第一行显示消息

LMESS2:

DB0;LCD第二行显示消息

;LCD初始化子程序

INIT_LCD:

MOVA,#38H;设置8位、2行、5x7点阵

ACALLWR_COMM;调用写指令子程序

ACALLDELAY1;调用延时子程序

MOVA,#0CH;开显示,光标不闪烁

ACALLWR_COMM;调用写指令子程序;

ACALLDELAY1;调用延时子程序

MOVA,#01H;清除LCD显示屏

ACALLWR_COMM;调用写指令子程序;

ACALLDELAY1;调用延时子程序

RET

;写指令子程序

WR_COMM:

MOVP1,A

CLRRS;RS=0,选择指令寄存器

CLRRW;RW=0,选择写模式

SETBE;E=1,允许读/写LCM

ACALLDELAY1;调用延时子程序

CLRE;E=0,禁止读/写LCM

RET

;写数据子程序

WR_DATA:

MOVP1,A

SETBRS;RS=1,选择数据寄存器

CLRRW;RW=0,选择写模式

SETBE;E=1,允许读/写LCM

ACALLDE;调用延时子程序

CLRE;E=0,禁止读/写LCM

ACALLDE;调用延时子程序

RET

;清除该行LCD的字符

CLR_LINE:

MOVR0,#24

CL1:

MOVA,#''

ACALLWR_DATA

DJNZR0,CL1

RET

;LCD存入工作菜单

MEU:

MOVDPTR,#MENU0;存入工作菜单

MOVA,#1;第一行

CALLLCD_PRINT

RET

;工作菜单

MENU0:

DB0

MENU1:

DB0

MENU2:

DB0

MENU3:

DB0

MENU4:

DB0

;菜单显示子程序

;一行、二行显示字符

LCD_PRINT:

CJNEA,#1,LINE2;判断是否为第一行

LINE1:

ACALLCLR_LINE;清除该行字符数据

MOVA,#80H;设置LCD的第一行地址ACALLWR_COMM;写入命令

JMPFILL

LINE2:

ACALLCLR_LINE;清除该行字符数据

MOVA,#0C0H;设置LCD的第二行地址ACALLWR_COMM

FILL:

CLRA;填入字符

MOVCA,@A+DPTR;由消息区取出字符

CJNEA,#0,LC1;判断是否为结束码

RET

;写入数据

LC1:

ACALLWR_DATA

INCDPTR;指针加1

JMPFILL;继续填入字符

RET

;转换数据子程

CONV:

;转换为ASCII码并显示

MOVA,HOUR;加载小时数据

MOVX,#5;设置位置

ACALLSKOW_LINE2;显示数据

INCX;

MOVA,#':

';

MOVB,X;

ACALLLCDP2;

MOVA,MIN;加载分钟数据

INCX;设置位置

ACALLSKOW_LINE2;显示数据

INCX;

MOVA,#':

';

MOVB,X;

ACALLLCDP2;

MOVA,SEC;加载秒数数据

INCX;设置位置

ACALLSKOW_LINE2;显示数据

INCX;

MOVA,#':

';

MOVB,X;

CALLLCDP2;

MOVA,DEDA;加载秒数数据

INCX;设置位置

ACALLSKOW_LINE2;显示数据

RET;

;在LCD的第二行显示数字

SKOW_LINE2:

MOVB,#10;设置被除数

DIVAB;结果A存商数,B存余数

ADDA,#30H;A为十位数,转换为字符PUSHB;B放入堆栈暂存

MOVB,X;设置LCD显示的位置

ACALLLCDP2;由LCD显示出来

POPB;出栈

MOVA,B;B为个位数

ADDA,#30H;转换为字符

INCX;LCD显示位置加1

MOVB,X;设置LCD显示的位置

ACALLLCDP2;由LCD显示出来

RET

;在LCD的第二行显示字符

LCDP2:

PUSHACC;

MOVA,B;设置显示地址

ADDA,#0C0H;设置LCD的第二行地址

CALLWR_COMM;写入命令

POPACC;由堆栈取出A

CALLWR_DATA;写入数据

RET

DEX:

MOVR7,#180

DE1:

NOP

DJNZR7,DE1

RET

;延时10MS

DELAY:

MOVR6,#50

D1:

MOVR7,#100

DJNZR7,$

DJNZR6,D1

DJNZR5,DELAY

RET

;延时5MS子程序

DELAY1:

MOVR6,#25

DEY:

MOVR7,#100

DJNZR7,$

DJNZR6,DEY

RET

;延时500微秒

DE:

DJNZR7,$

RET

END

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1