返回列表 发帖

用1602做显示的音频解码器控制板原代码和原理图(原创)

本帖最后由 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
       

附件: 您需要登录才可以下载或查看附件。没有帐号?注册

电子园商城推荐:


标题没看明白

TOP

按键到功能对应关系
AJ4     开/关机
AJ5    静音
AJ1   音量减
AJ2   音量加
AJ3   音效模式1
AJ6   音效模式2
AJ7   音效模式3
AJ8  音效模式4

TOP

很犀利的汇编 呵呵
我们非常勤奋的去享受痛苦,等待我们不再痛苦!

TOP

版主汇编如此强大了,为何不用C啊,任务多了,汇编吃不消的。也可以试试混合编程啊

TOP

没有C语言基础,正在学习中呀

TOP

嗯。。好东西。。。加精
Email:hnrain1004@gmail.com
如有问题,欢迎随时联系我!

知之为知之,不知“Google、百度” 之!

TOP

汇编好少人用呀,有谁帮忙转成C的.

TOP

很好,支持原创

TOP

呵呵 `  LZ的汇编很强大哦

TOP

返回列表

站长推荐 关闭


Cepark AVR单片机在线免费培训火热报名中

暑假就要来了!在这个暑假,你有什么打算?有没有想到趁着这个假期认真学一些知识呢? 对于单片机知识,你了解吗?有没有想过趁着这个暑假,好好的学习一下单片 ...


查看