单片机电子秤设计软件程序清单.docx
单片机电子秤设计软件程序清单程序清单;定义中文LCD液晶128X64的地址W_C_GLCDXDATA0E000HW_D_GLCDXDATA0E001HR_B_GLCDXDATA0E002HR_D_GLCDXDATA0E003H;-TIMER0DATA30H;延时时间的初值TIMER1DATA31H;调用延时子程序的次数DATA1DATA32H;点阵显示的变量1DATA2DATA33H;点阵显示的变量2XDATA34H;X方向的位置YDATA35H;Y方向的位置COUNTERDATA36H;计数器NDATA37H;行数变量D1DATA38H;点变量1D2DATA39H;点变量1ADDRDATA3AH;起始的显示位置ADDR1DATA3BH;起始的显示位置临时变量N1DATA3CH;行数的临时变量;*;*主程序开场;*ORG0000HAJMPSTARTORG0030HSTART:CLRP1.0SETBP1.1MOVSP,#60HLCALLINITIAL_GLCD;调用LCD初始化LCALLKAIJI;显示开机画面LCALLDELAY500LCALLDELAY500LCALLDELAY500LCALLTISHI;显示主界面LCALLINI_8279;-;判定能否继续;-KEY_A:MOVDPTR,#8101H;8101H为8279命令MOVXA,DPTR;读状态字ANLA,#07H;判定低三位能否为0CJNEA,#00H,LP1;不为0有键按下则跳转SJMPKEY_A;为0没键按下则继续查询LP1:MOVDPTR,#8100H;8100H为8279数据口MOVXA,DPTR;读键值CJNEA,#0DBH,KEY_A;判定能否按D键AJMPK1K1:LCALLYUZHI;阈值设定LCALLcelianjieguo;结果显示界面LCALLCELIANGJIEGUO;结果显示AJMP$;*;*主程序开场;*;=;各界面显示内容;=DHbr1:DB"欢迎使用"DHbr2:DB"半桥电子秤"DHbr3:DB"设计人:xxx"DHbr4:DB"时间:xxxx"DHbr5:DB"*"DHbr6:DB"设置报警上限"DHbr7:DB"确定"DHbr8:DB"请按D键"DHbr9:DB""DHbr10:DB"报警上限重量:"DHbr11:DB".g"DHbr12:DB"确定(E)"CELIANG1:DB"电子秤"CELIANG2:DB"重量是:"CELIANG3:DB".g"CELIANG4:DB"返回(F)"=;开机界面子程序;=KAIJI:MOVADDR1,#00H;第一行显示MOVN1,#08H;数量8个MOVDPTR,#DHbr1;需要显示的汉字位置CALLDHZ;调用汉字子序MOVADDR1,#10H;第二行显示MOVN1,#08HMOVDPTR,#DHbr2CALLDHZMOVADDR1,#08H;第三行显示MOVN1,#08HMOVDPTR,#DHbr3CALLDHZMOVADDR1,#18H;第四行显示MOVN1,#08HMOVDPTR,#DHbr4CALLDHZRET;=;提示界面子程序;=TISHI:LCALLCLEAR_GLCD;去除LCD显示屏幕MOVADDR1,#00HMOVN1,#08HMOVDPTR,#DHbr5CALLDHZMOVADDR1,#10HMOVN1,#08HMOVDPTR,#DHbr6CALLDHZMOVADDR1,#08HMOVN1,#08HMOVDPTR,#DHbr7CALLDHZMOVADDR1,#18HMOVN1,#08HMOVDPTR,#DHbr8CALLDHZRET;=;阈值设定界面子程序;=SHEDING:LCALLCLEAR_GLCDMOVADDR1,#00HMOVN1,#08HMOVDPTR,#DHbr9CALLDHZMOVADDR1,#10HMOVN1,#08HMOVDPTR,#DHbr10CALLDHZMOVADDR1,#08HMOVN1,#08HMOVDPTR,#DHbr11CALLDHZMOVADDR1,#18HMOVN1,#08HMOVDPTR,#DHbr12CALLDHZRET;=;测量界面子程序;=celianjieguo:LCALLCLEAR_GLCDMOVADDR1,#00HMOVN1,#08HMOVDPTR,#CELIANG1CALLDHZMOVADDR1,#10HMOVN1,#08HMOVDPTR,#CELIANG2CALLDHZMOVADDR1,#08HMOVN1,#08MOVDPTR,#CELIANG3CALLDHZMOVADDR1,#18HMOVN1,#08MOVDPTR,#CELIANG4CALLDHZRET;=;8279初始化子程序;=INI_8279:MOVDPTR,#8101HMOVA,#00HMOVXDPTR,AMOVA,#32HMOVXDPTR,AMOVA,#0DFHMOVXDPTR,ARET;=;键盘设定阈值子程序;=YUZHI:LCALLSHEDINGMOV44H,#00H;44H单元存按键次数,先清0;*键盘按键存储空间*MOV55H,#00H;存入四次按键值MOV56H,#00HMOV57H,#00HMOV58H,#00HMOV50H,#00H;存阈值百位MOV51H,#00H;存阈值十位和个位MOV52H,#00H;存阈值小数位;*KEY_09:MOVDPTR,#8101H;判定能否有键按下MOVXA,DPTRANLA,#07HCJNEA,#00H,LPP1AJMPKEY_09;-;各个键的处理;-LPP1:MOVDPTR,#8100HMOVXA,DPTRB0:CJNEA,#0D8H,B1AJMPKK0B1:CJNEA,#0D0H,B2AJMPKK1B2:CJNEA,#0D1H,B3AJMPKK2B3:CJNEA,#0D2H,B4AJMPKK3B4:CJNEA,#0C8H,B5AJMPKK4B5:CJNEA,#0C9H,B6AJMPKK5B6:CJNEA,#0CAH,B7AJMPKK6B7:CJNEA,#0C0H,B8AJMPKK7B8:CJNEA,#0C1H,B9AJMPKK8B9:CJNEA,#0C2H,BEAJMPKK9BE:CJNEA,#0DAH,YUZHIAJMPKKEKK0:MOV5BH,#00H;5BH存键值AJMPCOUNT_1KK1:MOV5BH,#01HAJMPCOUNT_1KK2:MOV5BH,#02HAJMPCOUNT_1KK3:MOV5BH,#03HAJMPCOUNT_1KK4:MOV5BH,#04HAJMPCOUNT_1KK5:MOV5BH,#05HAJMPCOUNT_1KK6:MOV5BH,#06HAJMPCOUNT_1KK7:MOV5BH,#07HAJMPCOUNT_1KK8:MOV5BH,#08HAJMPCOUNT_1KK9:MOV5BH,#09HAJMPCOUNT_1KKE:AJMPEND_PCOUNT_1:MOVA,44H;44H存按键次数INCAMOV44H,ACJNEA,#05H,CW1;按键次数能否到达4次AJMPYUZHI;五次按键则重设阈值CW1:ADDA,#54H;键盘按键存储空间MOVR0,ACW2:CLRAMOVA,5BHMOVR0,ALCALLPRO_SHOWAJMPKEY_09RET;=;各次报警值按键处理子程序;=PRO_SHOW:NOPPR_1:CLRA;一次按键MOVA,44HCJNEA,#01H,PR_2MOVR0,#55HMOVA,R0SUBBA,#05HJNCSSMOV51H,55HMOVA,55HMOVADDR1,#0AHLCALLSHUZIXIANSHISJMPEND_PPR_2:CLRA;二次按键MOVA,44HCJNEA,#02H,PR_3CLRAMOVA,55HSWAPAADDA,56HMOV51H,AMOVA,55HMOVADDR1,#09HLCALLSHUZIXIANSHIMOVA,56HMOVADDR1,#0AHLCALLSHUZIXIANSHIAJMPEND_PPR_3:CLRA;三次按键MOVA,44HCJNEA,#03H,PR_4CLRAMOV50H,55HMOVA,56HSWAPAADDA,57HMOV51H,AMOVA,55HMOVADDR1,#08HLCALLSHUZIXIANSHIMOVA,56HMOVADDR1,#09HLCALLSHUZIXIANSHIMOVA,57HMOVADDR1,#0AHLCALLSHUZIXIANSHISJMPEND_PPR_4:CLRA;四次按键MOVA,58HSWAPAMOV52H,ASWAPAMOVADDR1,#0CHLCALLSHUZIXIANSHISJMPEND_PEND_P:RETSS:LJMPYUZHI;=;结果显示子程序;=CELIANGJIEGUO:LCALLADC0809;调用0809采样程序LCALLZHH;调用转换程序MOVADDR1,#08H;采数据送LCD显示MOVA,40HLCALLSHUZIXIANSHIMOVADDR1,#09HMOVA,41HSWAPALCALLSHUZIXIANSHIMOVADDR1,#0AHMOVA,41HLCALLSHUZIXIANSHIMOVADDR1,#0CHMOVA,43HSWAPALCALLSHUZIXIANSHICALLDELAY500;调用延时CALLBJ;判定能否超过阈值,超过则报警;-;F键判定能否返回提示界面;-KEY_F:MOVDPTR,#8101HMOVXA,DPTRANLA,#07HCJNEA,#00H,LP2SJMPCELIANGJIEGUOLP2:MOVDPTR,#8100HMOVXA,DPTRCJNEA,#0D9H,CELIANGJIEGUO;判定能否按F键SETBP1.1CLRP1.0AJMPK1;=;报警子程序;=BJ:MOVR1,#50HMOVA,R1CLRCSUBBA,40HJCWARNINGJZCOMP1SETBP1.1CLRP1.0RETCOMP1:INCR1MOVA,R1CLRCSUBBA,41HJCWARNINGJZCOMP2SETBP1.1CLRP1.0RETCOMP2:INCR1MOVA,R1CLRCSUBBA,43HJCWARNINGSETBP1.1CLRP1.0RETWARNING:CLRP1.1SETBP1.0RET;=;0809采样程序ADC0809:PUSHDPLPUSHDPHPUSHACCMOVDPTR,#W_D_0809;AD0809的启动地址MOVA,#00HMOVXDPTR,A;0通道LCALLDELAY01;延时100USMOVXA,DPTR;读出A/D的结果MOV3FH,A;暂存POPACCPOPDPHPOPDPLRET;=;转换子程序:3FH的内容(A/D采样的结果)*(5V/256(FFH)=十进制结果;40H,41H.例如:3FH=0FFH,那么程序执行后:40H=04H,41H=99H既4.99V;=ZHH:PUSHPSWPUSHACCSETBRS0MOVA,#4eHMOVB,3FHMULABMOVR6,BMOVR7,AHB2:CLRAMOVR3,AMOVR4,AMOVR5,AMOVR2,#10HHB3:MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5ADDCA,R5DAAMOVR5,AMOVA,R4ADDCA,R4DAAMOVR4,AMOVA,R3ADDCA,R3MOVR3,ADJNZR2,HB3MOV40H,R3MOV41H,R4MOV43H,R5POPACCPOPPSWRET;=;点阵式LCD128X64模块显示部分子程序;下面是公共的程序:;=;LCD初始化子程序;=INITIAL_GLCD:PUSHACCMOVA,#30H;功能设定CALLCOMMAND_GLCDMOVA,#30H;功能设定CALLCOMMAND_GLCDMOVA,#30H;功能设定CALLCOMMAND_GLCDMOVA,#06H;显示器控制:游标不显示;CALLCOMMAND_GLCDMOVA,#01H;去除显示器CALLCOMMAND_GLCDMOVA,#0CH;进入形式设定CALLCOMMAND_GLCDPOPACCRET;=;汉字显示子程序16X16点阵;=DHZ:MOVADDR,ADDR1;开场行位置MOVB,N1;显示数量DHZ1:MOVA,ADDR;ORLA,#80H;送显示地址LCALLCOMMAND_GLCD;调写命令子程序DHZ2:CLRAMOVCA,A+DPTR;查找汉字的高位码INCDPTRLCALLWRITE_GLCD;送显示CLRAMOVCA,A+DPTR;查找汉字的低位码INCDPTRLCALLWRITE_GLCD;送显示DJNZB,DHZ2RET;=;数字显示子程序;=SHUZIXIANSHI:MOV42H,AMOVADDR,ADDR1;开场行位置MOVA,ADDR;ORLA,#80H;送显示地址LCALLCOMMAND_GLCDMOVA,42H;-;将ACC内容,以十六进制值显示;-HEX_LCD:PUSHDPHPUSHDPLPUSHACCANLA,#0FHMOVDPTR,#ASCII_CODE;DPTR指到ASCII_CODEMOVCA,A+DPTR;获得ASCII码CALLWRITE_GLCD;写到LCDPOPACCPOPDPLPOPDPHRETASCII_CODE:DB''''0123456789ABCDEF''''=;检查LCD繁忙标志;=CHKBUSY_GLCD:PUSHDPHPUSHDPLPUSHACCMOVDPTR,#R_B_GLCDCHK:MOVXA,DPTRJBACC.7,CHK;判别是不是忙?POPACCPOPDPLPOPDPHRET;=;写命令到GLCD;=COMMAND_GLCD:PUSHDPHPUSHDPLCALLCHKBUSY_GLCD;判别是不是忙?MOVDPTR,#W_C_GLCDMOVXDPTR,A;写入命令POPDPLPOPDPHRET;=;写资料到GLCD;=WRITE_GLCD:PUSHDPHPUSHDPLCALLCHKBUSY_GLCD;判别是不是忙?MOVDPTR,#W_D_GLCD;写入数据MOVXDPTR,APOPDPLPOPDPHRET;=;去除LCD的显示幕;=CLEAR_GLCD:PUSHACCMOVA,#01H;去除显示器CALLCOMMAND_GLCDPOPACCRET;=;延时子程序;=DELAY:PUSHTIMER1;延时TIMER1*1msfor12MHzPUSHTIMER0DELAY1:MOVTIMER0,#250;时间为4*1SDELAY2:NOP;1个周期NOP;1个周期DJNZTIMER0,DELAY2;2个周期DJNZTIMER1,DELAY1POPTIMER0POPTIMER1RETNOP;-;延时1ms;-DELAY01:NOPPUSHTIMER1MOVTIMER1,#01HLCALLDELAYPOPTIMER1RETNOP;-;延时500ms;-DELAY500:NOPPUSHTIMER1MOVTIMER1,#250LCALLDELAYLCALLDELAYPOPTIMER1RETNOP