| 本帖最后由 yaoyb_27 于 2009-6-27 07:25 编辑
RS BIT P0.2 R_W BIT P0.1 E BIT P0.0 DB0_DB7 EQU P1 VOLDOWN EQU P2.3 VOLUP EQU P2.4 START EQU 40H
MODE EQU 40H DI_DO EQU 41H GEW EQU 42H SHIW EQU 43H POWER EQU 20H.0 ;开关机标记,POWER=1,开机 POWER=0,关机 MUTEa EQU 20H.1 ;MUTE=1,开 MUTE=0,关 MODE1 EQU 20H.2 ;MODE1=1是MODE1=0为否 MODE2 EQU 20H.3 ; MODE2=1是MODE2=0为否 MODE3 EQU 20H.4 ;MODE3=1是MODE3=0为否 MODE4 EQU 20H.5 ;MODE4=1是MODE4=0为否 ;*******程序开始******* ORG 0000H LJMP MAIN ORG 030H MAIN: MOV SP,#60H ;主程序开始,堆栈指针指向60H LCALL INITIAL ;调用启动LCM子程序 LCALL CLS ;调用清屏子程序 LCALL XIAN_STANDBY ;调用显示STANDBY子程序 LCALL REST ;调用初始化子程序 LCALL MAIN1 ;调用MAIN子程序 NOP SJMP $ MAIN1: AJ4: JB VOLDOWN,AJ5 ;判断AJ4键是否按下,如没按下转去AJ5处,否则顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB VOLDOWN,AJ5 ;判断VOL-键是否按下,如没按下转AJ5处,否则顺序执行 AJ4_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB VOLDOWN,AJ4_a ;判断AJ4按键是否松开 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB VOLDOWN,AJ4_a ;;判断AJ4按键是否松开 LCALL ON_OFF ;调用开/关机子程序 LJMP MAIN1
AJ5: JNB POWER,MAIN1 JB VOLUP,KEY ;判断AJ5键是否按下,如没按下转KEY2处,否则顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB VOLUP,KEY ; 判断VOL+键是否按下,如没按下转KEY2处,否则顺序执行 AJ5_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB VOLUP,AJ5_a ;判断AJ5按键是否松开 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB VOLUP,AJ5_a ;判断AJ5按键是否松开 LCALL MUTE ;调用静音处理子程序 LJMP MAIN1 KEY: JNB POWER,MAIN1 ;检查开/关机标志位 JNB MUTEa,MAIN1 ;检查静音标志位 CLR P0.3 ;置P0.3为低电平,以便查询AJ1、AJ2、AJ3键的输入情况 SETB P0.4 ;置P0.4你高电平,禁止查询AJ6、AJ7、AJ8键的输入情况 AJ1: JB P0.7, AJ2 ;判断AJ1是否按下,如果没按下转AJ21处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB P0.7,AJ2 ;判断AJ1是否按下,如果没按下转AJ2处继续判断,按下顺序执行 AJ1_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.7, AJ1_a LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.7, AJ1_a LCALL UP ;调用音量减子程序 LJMP KEY_OUT AJ2: JB P0.6,AJ3 ;判断AJ2是否按下,如果没按下转AJ3处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB P0.6,AJ3 ;判断AJ2是否按下,如果没按下转AJ3处继续判断,按下顺序执行 AJ2_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.6, AJ2_a LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.6, AJ2_a LCALL DOWN ;调用音量加子程序 AJ3: JB P0.5,KEY1 ;判断AJ2是否按下,如果没按下转KEY1处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB P0.5,KEY1 ;判断AJ2是否按下,如果没按下转KEY1处继续判断,按下顺序执行 AJ3_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.5, AJ3_a LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.5, AJ3_a LCALL MODE_1 ;调用MODE1子程序 KEY1: CLR P0.4 ;置P0.4为低电平,以便查询AJ6、AJ7、AJ8 键的输入情况 SETB P0.3 ;置P0.3为高电平,禁止查询AJ1、AJ2、AJ3键的输入情况 AJ6: JB P0.7, AJ7 ;判断AJ6是否按下,如果没按下转AJ7处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 AJ6_a: JB P0.7,AJ7 ;判断AJ7是否按下,如果没按下转AJ7处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.7, AJ6_a ;判断AJ6按键是否松开 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.7, AJ6_a ;判断AJ6按键是否松开 LCALL MODE_2 ;调用MODE2子程序 AJ7: JB P0.6, AJ8 ;判断AJ7是否按下,如果没按下转AJ8处继续判断,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB P0.6,AJ8 ;判断AJ7是否按下,如果没按下转AJ8处继续判断,按下顺序执行 AJ7_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.6, AJ7_a ;判断AJ7按键是否松开 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.6, AJ7_a ;判断AJ7按键是否松开 LCALL MODE_3 ;调用MODE3子程序 AJ8: JB P0.5, KEY_OUT ;判断AJ8是否按下,如果没按下转按键退出,按下顺序执行 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JB P0.5,KEY_OUT ;判断AJ8是否按下,如果没按下转按键退出,按下顺序执行 AJ8_a: LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.5, AJ8_a ;判断AJ8按键是否松开 LCALL DEL ;调用2.7MS延时子程序消除键抖 LCALL DEL ;调用2.7MS延时子程序消除键抖 JNB P0.5, AJ8_a ;判断AJ8按键是否松开 LCALL MODE_4 ;调用MODE4子程序 KEY_OUT: LJMP MAIN1 ;程序返回 ;********判断开关机子程序****** PANDUAN: JB POWER,ON_OFF_1; ;判断开关机标志位 RET ;子程序返回 ;********判断静音状态子程序******************* PANDUAN1: JB MUTEa,MUTE_ON RET PANDUAN2: JB POWER,ON_OFF_2; RET ON_OFF: LCALL PANDUAN CPL POWER LCALL CLS LCALL XIAN_2 MOV START,#01H LCALL BIJIAO LCALL XIAN_GAO_DE LJMP MAIN1 ;跳转到MAIN1处 ON_OFF_1: CPL POWER ON_OFF_2: LCALL CLS LCALL XIAN_STANDBY MOV START,#00H LJMP MAIN1 ;跳转到MAIN1处 MUTE: LCALL PANDUAN1 CPL MUTEa LCALL XIAN_2 LCALL XIAN_GAO_DE LJMP MAIN1 MUTE_ON: CPL MUTEa LCALL CLS LCALL XIAN_MUTE LJMP MAIN1 MODE_1: MOV MODE,#1 ;向模式寄存器送立即数#1, LCALL BIJIAO ;调用模式比较子程序 LJMP MAIN1 ;跳转到MAIN1处 MODE_2: MOV MODE,#2 ;向模式寄存器送立即数#2 LCALL BIJIAO ;调用模式比较子程序 LJMP MAIN1 ;跳转到MAIN1处 MODE_3: MOV MODE,#3 ;向模式寄存器送立即数#3 LCALL BIJIAO ;调用模式比较子程序 LJMP MAIN1 ;跳转到MAIN1处 MODE_4: MOV MODE,#4 ;向模式寄存器送立即数#4 LCALL BIJIAO ;调用模式比较子程序 LJMP MAIN1 ;跳转到MAIN1处 DOWN: MOV A,DI_DO CJNE A,#40H,DOWN_1 LJMP MAIN1 DOWN_1: INC A MOV DI_DO,A LCALL XIAN_GAO_DE LJMP MAIN1 ;跳转到MAIN1处 UP: MOV A,DI_DO CJNE A,#00H,UP_1 LJMP MAIN1 UP_1: DEC A ;累加器减1 MOV DI_DO,A ;调整后的累加器A内容送回计数单元 LCALL XIAN_GAO_DE LJMP MAIN1 ;跳转到MAIN1处
;*******判断模式状态子程序*******************
BIJIAO: MOV A,MODE CJNE A,#1,BIJIAO1 LCALL XIAN_MODE1 SJMP BIJIAOOUT BIJIAO1: CJNE A,#2,BIJIAO2 LCALL XIAN_MODE2 SJMP BIJIAOOUT BIJIAO2: CJNE A,#3,BIJIAO3 LCALL XIAN_MODE3 SJMP BIJIAOOUT BIJIAO3: CJNE A,#4,BIJIAOOUT LCALL XIAN_MODE4 BIJIAOOUT: RET
;//////////主显示程序//////
XIAN_2: ;/////////显示"DIA ZI SHI JIE "///// LCALL CLS MOV A,#10000000B ;向累加器送立即数10000000B,设定显示地址为第1行第1列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE2 ;将要显示的字符串起始地址送入DPTR(DIANZISHIJIE) LCALL DISP ;调用写字符串到LCM子程序 MOV A,#11000000B ;向累加器送立即数11000000B,设定显示地址为第2行第1列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE3 ;将要显示的字符串起始地址送入DPTR(MODE:) LCALL DISP ;调用写字符串到LCM子程序 ;//////显示"MVOL"///////// MOV A,#11000111B ;向累加器送立即数11000111B,设定显示地址为第2行第8列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE4 ;将要显示的字符串起始地址送入DPTR( MVOL: ) LCALL DISP ;调用写字符串到LCM子程序 MOV A,#11001110B ;向累加器送立即数11001110B,设定显示地址为第2行每时14列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE5 ;将要显示的字符串起始地址送入DPTR(DB) LCALL DISP ;调用写字符串到LCM子程序 LCALL BIJIAO RET ;子程序返回 ;///////显示"MUTE"///////// XIAN_MUTE: MOV A,#10000001B ;向累加器送立即数10001100B,设定显示地址为第1行第12列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE6 ;将要显示的字符串起始地址送入DPTR(MUTE) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 ;///////显示"1"/////// XIAN_MODE1: MOV A,#11000101B ;向累加器送立即数10000101B,设定显示地址为第2行第5列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE31 ;将显示的字符串起始地址送入DPTR(1) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 ;///////显示"2"//////// XIAN_MODE2: MOV A,#11000101B ;向累加器送立即数10000101B,设定显示地址为第2行第5列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE32 ;将显示的字符串起始地址送入DPTR(2) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 ;//////显示"3"////////// XIAN_MODE3: MOV A,#11000101B ;向累加器送立即数10000101B,设定显示地址为第2行第5列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE33 ;将显示的字符串起始地址送入DPTR(3) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 ;//////显示"4"//////// XIAN_MODE4: MOV A,#11000101B ;向累加器送立即数10000101B,设定显示地址为第2行第5列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE34 ;将显示的字符串起始地址送入DPTR(4) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 ;////////显示"STANBY"/////// XIAN_STANDBY: MOV A,#10000000B ;向累加器送立即数10000110B,设定显示地址为第1行第1列 LCALL WRITE_COM ;调用向LCM写指令子程序 MOV DPTR,#LINE7 ; 将显示的字符串起始地址送入DPTR(STANDBY) LCALL DISP ;调用写字符串到LCM子程序 RET ;子程序返回 XIAN_GAO_DE:
MOV A,DI_DO MOV B,#0AH DIV AB MOV SHIW,A MOV GEW,B MOV A,#11001101B ;指向显示屏第二行第13列 LCALL WRITE_COM ;调用写指令子程序 MOV A,GEW ;将时单元内容送累加器中 ADD A,#30H ;低半字节加30得到ASCLL码. LCALL WRITE_DATA ;调用写数据到LCM子程序 MOV A,#11001100B ;指向显示屏第二行第12列 LCALL WRITE_COM ;调用写指令子程序 MOV A,SHIW ;将十位内容送累加器中 ADD A,#30H ;低半字节加30得到ASCLL码. LCALL WRITE_DATA ;调用写数据到LCM子程序 RET ;子程序返回
;*******初始化子程序***************** REST: CLR POWER ;将开关机数据暂存寄存器ON/OFF送初值#00H SETB MUTEa CLR MODE1 CLR MODE2 CLR MODE3 CLR MODE4 MOV START,#00H MOV MODE,#1 MOV DI_DO, #24 MOV P2, #0FFH ;对P2口进行初始化,送初值#0FFH LCALL INITIAL ;调用启动LCM子程序 LCALL CLS ;调用清除LCM子程序 LCALL XIAN_STANDBY ;调用上电初始显示
RET
;*******显示字符串到LCM子程序******** DISP: PUSH ACC DISP_LOOP: CLR A MOVC A,@A+DPTR JZ END_DISP LCALL WRITE_DATA INC DPTR SJMP DISP_LOOP END_DISP: POP ACC RET ;****** 启动LCM子程序****** INITIAL:MOV A,#00111000B LCALL WRITE_COM MOV A,#00001100B LCALL WRITE_COM MOV A,#00000110B LCALL WRITE_COM RET ;******查询忙碌标志信号子程序****** CHECK_BUSY: PUSH ACC BUSY_LOOP: CLR E SETB R_W CLR RS SETB E MOV A, DB0_DB7 CLR E JB ACC.7,BUSY_LOOP POP ACC LCALL DEL RET ;****** 写指令到LCM子程序****** WRITE_COM: LCALL CHECK_BUSY CLR E CLR RS CLR R_W SETB E MOV DB0_DB7,A CLR E RET ;****** 写数据到LCM子程序****** WRITE_DATA: LCALL CHECK_BUSY CLR E SETB RS CLR R_W SETB E MOV DB0_DB7,A CLR E RET ;*******清除LCM子程序******* CLS: MOV A,#00000001B LCALL WRITE_COM RET ;****延时2.7mS子程序**** DEL: MOV R6,#5 L1: MOV R7,#248 DJNZ R7,$ DJNZ R6,L1 RET
;*******字符串************
LINE2: DB "DIAN ZI SHI JIE ",00H LINE3: DB "MODE:",00H LINE31: DB "1",00H LINE32: DB "2",00H LINE33: DB "3",00H LINE34: DB "4",00H LINE4: DB "MVOL:",00H LINE5: DB "DB",00H LINE6: DB " MUTE",00H LINE7: DB " STANDBY",00H END
|