⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 基于HC908GP32的电子琴程序
💻 S
字号:
	.module main.c
	.area text
_main::
	ais #-2
	tsx
	jmp L3
L2:
; /*-----------------------------------------------------*
; *工 程 名:	                                
; *硬件连接:                                
; *程序描述: SD-HC08 模板生成                            
; */
; /*[头文件]*/
; #include "GP32C.h"                //映像寄存器地址头文件
; #include "KB.h" 
; void PWMInit(unsigned int);     //PWM初始化
; void PWMconf(unsigned int);      //PWM设置
; void Delay_ms(unsigned char );
; unsigned char KB1,KB2,KB3,KB4,KB5,KB6,i,KB_valve1,KB_valve2;
; //DDRA=0xFF;PTA=0xFF;
; /*[主函数]*/
; void main()
;   {  
;   while(1)
;   {
;   KB_Init(); 
	jsr _KB_Init
;   T1SC0=0x0e;
	lda #14
	sta 0x25
;   KB_valve1=KB_Scan1();
	jsr _KB_Scan1
	sta *__r1
	sta *_KB_valve1
;   KB_valve2=KB_Scan2();
	jsr _KB_Scan2
	tsx
	sta *__r1
	sta *_KB_valve2
;   if((KB_valve1!=0xff)||(KB_valve2!=0xff))  //有键按下
	lda *_KB_valve1
	cmp #-1
	bne L7
	lda *_KB_valve2
	cmp #-1
	bne X9
	jmp L5
X9:
L7:
;   {
;   KB1=KB_valve1;
	mov *_KB_valve1,*_KB1
;   KB2=KB_valve2;
	mov *_KB_valve2,*_KB2
;   KB1&=0b00001000;
	lda *_KB1
	and #8
	sta *_KB1
;   KB2&=0b00001000;
	lda *_KB2
	and #8
	sta *_KB2
;   if(KB1==0||KB2==0)   //L或H按下
	lda *_KB1
	beq L10
	lda *_KB2
	beq X10
	jmp L8
X10:
L10:
;   {
;    KB3=KB5=KB_valve1;
	mov *_KB_valve1,*_KB5
	mov *_KB_valve1,*_KB3
;    KB4=KB6=KB_valve2;
	mov *_KB_valve2,*_KB6
	mov *_KB_valve2,*_KB4
;    KB3&=0b00010000;
	lda *_KB3
	and #16
	sta *_KB3
;    KB4&=0b00010000;
	lda *_KB4
	and #16
	sta *_KB4
;    KB5&=0b00100000;
	lda *_KB5
	and #32
	sta *_KB5
;    KB6&=0b00100000;
	lda *_KB6
	and #32
	sta *_KB6
;    if(KB3==0||KB4==0)  //L按下
	lda *_KB3
	beq L13
	lda *_KB4
	beq X11
	jmp L11
X11:
L13:
;    {
	lda *_KB_valve1
	cmp #-26
	beq L16
	lda *_KB_valve2
	cmp #-26
	bne L14
L16:
;     if((KB_valve1==0xE6)||(KB_valve2==0xE6))PWMconf(262);
	ldhx #262
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L14:
	lda *_KB_valve1
	cmp #-34
	beq L19
	lda *_KB_valve2
	cmp #-34
	bne L17
L19:
;     if((KB_valve1==0xDE)||(KB_valve2==0xDE))PWMconf(294);                   
	ldhx #294
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L17:
	lda *_KB_valve1
	cmp #-66
	beq L22
	lda *_KB_valve2
	cmp #-66
	bne L20
L22:
;     if((KB_valve1==0xBE)||(KB_valve2==0xBE))PWMconf(330);
	ldhx #330
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L20:
	lda *_KB_valve1
	cmp #-27
	beq L25
	lda *_KB_valve2
	cmp #-27
	bne L23
L25:
;     if((KB_valve1==0xE5)||(KB_valve2==0xE5))PWMconf(349);
	ldhx #349
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L23:
	lda *_KB_valve1
	cmp #-35
	beq L28
	lda *_KB_valve2
	cmp #-35
	bne L26
L28:
;     if((KB_valve1==0xDD)||(KB_valve2==0xDD))PWMconf(392);
	ldhx #392
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L26:
	lda *_KB_valve1
	cmp #-67
	beq L31
	lda *_KB_valve2
	cmp #-67
	bne L29
L31:
;     if((KB_valve1==0xBD)||(KB_valve2==0xBD))PWMconf(440);
	ldhx #440
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L29:
	lda *_KB_valve1
	cmp #-29
	beq L34
	lda *_KB_valve2
	cmp #-29
	bne L32
L34:
;     if((KB_valve1==0xE3)||(KB_valve2==0xE3))PWMconf(494);
	ldhx #494
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L32:
;     }
L11:
;     if(KB5==0||KB6==0)   //H按下
	lda *_KB5
	beq L37
	lda *_KB6
	beq X12
	jmp L9
X12:
L37:
;     {
	lda *_KB_valve1
	cmp #-18
	beq L40
	lda *_KB_valve2
	cmp #-18
	bne L38
L40:
;      if((KB_valve1==0xEE)||(KB_valve2==0xEE))PWMconf(1046);
	ldhx #1046
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L38:
	lda *_KB_valve1
	cmp #-42
	beq L43
	lda *_KB_valve2
	cmp #-42
	bne L41
L43:
;      if((KB_valve1==0xD6)||(KB_valve2==0xD6))PWMconf(1175);                   
	ldhx #1175
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L41:
	lda *_KB_valve1
	cmp #-66
	beq L46
	lda *_KB_valve2
	cmp #-66
	bne L44
L46:
;      if((KB_valve1==0xBE)||(KB_valve2==0xBE))PWMconf(1318);
	ldhx #1318
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L44:
	lda *_KB_valve1
	cmp #-19
	beq L49
	lda *_KB_valve2
	cmp #-19
	bne L47
L49:
;      if((KB_valve1==0xED)||(KB_valve2==0xED))PWMconf(1397);
	ldhx #1397
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L47:
	lda *_KB_valve1
	cmp #-43
	beq L52
	lda *_KB_valve2
	cmp #-43
	bne L50
L52:
;      if((KB_valve1==0xD5)||(KB_valve2==0xD5))PWMconf(1568);
	ldhx #1568
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L50:
	lda *_KB_valve1
	cmp #-67
	beq L55
	lda *_KB_valve2
	cmp #-67
	bne L53
L55:
;      if((KB_valve1==0xBD)||(KB_valve2==0xBD))PWMconf(1760);
	ldhx #1760
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
L53:
	lda *_KB_valve1
	cmp #-21
	beq L58
	lda *_KB_valve2
	cmp #-21
	beq X13
	jmp L9
X13:
L58:
;      if((KB_valve1==0xEB)||(KB_valve2==0xEB))PWMconf(1976);                     
	ldhx #1976
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
;      }}
	jmp L9
L8:
;      else
;      {
;      switch(KB_valve1)
	clr ,X
	lda *_KB_valve1
	sta 1,X
	lda ,X
	bne X0
	lda 1,X
	cmp #-35
	bne X14
	jmp L66
X14:
X0:
	lda ,X
	bne X1
	lda 1,X
	cmp #-34
	beq L63
X1:
	lda 1,X
	sta *__r1
	lda ,X
	sta *__r0
	ldhx *__r0
	cphx #222
	tsx
	bgt L70
L69:
	lda ,X
	bne X2
	lda 1,X
	cmp #-67
	beq L67
X2:
	lda ,X
	bne X3
	lda 1,X
	cmp #-66
	beq L64
X3:
	jmp L59
L70:
	lda ,X
	bne X4
	lda 1,X
	cmp #-21
	beq L68
X4:
	lda ,X
	bne X5
	lda 1,X
	cmp #-19
	beq L65
X5:
	lda ,X
	bne X6
	lda 1,X
	cmp #-18
	beq L62
X6:
	bra L59
X7:
;      {
L62:
;      case 0xEE: PWMconf(523);break;                                           
	ldhx #523
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L63:
;      case 0xDE: PWMconf(558);break;
	ldhx #558
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L64:
;      case 0xBE: PWMconf(660);break;
	ldhx #660
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L65:
;      case 0xED: PWMconf(698);break;
	ldhx #698
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L66:
;      case 0xDD: PWMconf(784);break;
	ldhx #784
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L67:
;      case 0xBD: PWMconf(880);break;
	ldhx #880
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L68:
;      case 0xEB: PWMconf(988);break;
	ldhx #988
	pshx
	pshh
	jsr _PWMconf
	ais #2
	tsx
	bra L60
L59:
;      default :  T1SC|=(1<<5);break;                            
	bset #5,0x20
L60:
L9:
L5:
L3:
	jmp L2
X8:
L1:
	ais #2
	.dbline 0 ; func end
	rts
;              j -> 0,X
;              u -> 1,X
;              i -> 4,X
_Delay_ms::
	ais #-2
	tsx
;      }}}}}
; void Delay_ms(unsigned char i)
;   {  unsigned char j;
;      unsigned char u;
;      for(j=0;j<i;j++)
	clr ,X
	bra L75
L72:
	clr 1,X
	bra L79
L76:
L77:
	inc 1,X
L79:
	lda 1,X
	cmp #-6
	bls L76
L73:
	inc ,X
L75:
	lda ,X
	cmp 4,X
	blo L72
L71:
	ais #2
	.dbline 0 ; func end
	rts
;           Duty -> 2,X
;         Period -> 4,X
;             Hz -> 8,X
_PWMconf::
	ais #-6
	tsx
;          for(u=0;u<=250;u++) ;
;   }
; 
; 
; void PWMconf(unsigned int Hz)
;   {
;      unsigned int Period,Duty;
;      Period=2457600/64/Hz;
	clr *__r1
	clr *__r0
	lda 9,X
	sta *__r3
	lda 8,X
	sta *__r2
	clra
	psha
	lda #-106
	psha
	clra
	psha
	psha
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __divmod32s
	ais #4
	pula
	pula
	pula
	sta *__r2
	pula
	sta *__r1
	lda *__r2
	sta 4,X
	lda *__r1
	sta 5,X
;      PWMInit(Period);
	psha
	lda 4,X
	psha
	jsr _PWMInit
	ais #2
	tsx
;      Duty=Period/1.2;
	lda 5,X
	and #1
	sta *__r1
	clra
	sta *__r0
	lda *__r1
	psha
	lda *__r0
	psha
	clra
	psha
	psha
	tst 3,SP
	bpl X15
	com 2,SP
	com 1,SP
X15:
	jsr __long_to_SPfloat
	pula
	sta *__r0
	pula
	sta *__r1
	pula
	sta *__r2
	pula
	sta *__r3
	lda 5,X
	sta *__r5
	lda 4,X
	sta *__r4
	lsr *__r4
	ror *__r5
	lda *__r5
	psha
	lda *__r4
	psha
	clra
	psha
	psha
	tst 3,SP
	bpl X16
	com 2,SP
	com 1,SP
X16:
	jsr __long_to_SPfloat
	clra
	psha
	psha
	psha
	lda #64
	psha
	jsr __SPFloat_mul
	ais #4
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __SPFloat_add
	ais #4
	lda #-102
	psha
	lda #-103
	psha
	psha
	lda #63
	psha
	jsr __SPFloat_div
	ais #4
	pula
	sta *__r0
	pula
	sta *__r1
	pula
	sta *__r2
	pula
	sta *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	clra
	psha
	psha
	psha
	lda #71
	psha
	jsr __SPFloat_cmp_s
	ais #8
	blt L82
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	clra
	psha
	psha
	psha
	lda #71
	psha
	jsr __SPFloat_sub
	ais #4
	jsr __SPFloat_to_long
	ais #2
	pula
	sta *__r4
	pula
	add #0
	sta 1,X
	lda *__r4
	adc #-128
	sta ,X
	bra L83
L82:
	lda *__r3
	psha
	lda *__r2
	psha
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __SPFloat_to_long
	ais #2
	pula
	sta *__r0
	pula
	sta *__r1
	lda *__r0
	sta ,X
	lda *__r1
	sta 1,X
L83:
	lda ,X
	sta 2,X
	lda 1,X
	sta 3,X
;      T1SC|=(1<<5);        //停止定时器1计数器计数
	bset #5,0x20
;      //[设置PWM脉宽]
;      T1CH0H = (Duty>>8);  //设置高字节
	lda 2,X
	sta 0x26
;      T1CH0L = Duty;       //设置低字节
	lda 3,X
	sta 0x27
;      T1SC&=~(1<<5);       //允许定时器1计数器计数
	bclr #5,0x20
;      Delay_ms(190);      //延时100ms
	lda #-66
	psha
	jsr _Delay_ms
	ais #1
	tsx
L80:
	ais #6
	.dbline 0 ; func end
	rts
;           Temp -> 0,X
;         Period -> 4,X
_PWMInit::
	ais #-2
	tsx
;   }
;   
;   
; /*PWMconf:PWM初始化设置--------------------------------*
; * 功  能:PWM脉冲周期、占空比的设置                     *
; * 参  数:rate=脉宽时钟数,cyc=脉冲周期时钟数            *
; * 返  回:无                                            *
; *-----------------------------------------------------*/
; void PWMInit(unsigned int Period)
; {    
;     unsigned int Temp=Period;
	lda 4,X
	sta ,X
	lda 5,X
	sta 1,X
;     //不允许溢出中断,不启动计数,分频因子=64,置位TSTOP,TRST
;     T1SC = 0x36;        
	lda #54
	sta 0x20
;     //[设置PWM周期]
;     T1MODH = (Temp>>8);     
	lda ,X
	sta 0x23
;     T1MODL = Period;      
	lda 5,X
	sta 0x24
;     //[初始化设置PWM脉宽为0]
;     T1CH0H = 0x00;
	clr 0x26
;     T1CH0L = 0x00;
	clr 0x27
;     //设为PWM模式,不允许输出比较中断,输出低电平,不带缓冲
;     T1SC0  = 0x1E;      
	lda #30
	sta 0x25
;     //允许定时器1计数寄存器计数           
;     T1SC  &= 0xDF;      
	lda 0x20
	and #-33
	sta 0x20
L84:
	ais #2
	.dbline 0 ; func end
	rts
	.area bss
_KB_valve2::
	.blkb 1
_KB_valve1::
	.blkb 1
_i::
	.blkb 1
_KB6::
	.blkb 1
_KB5::
	.blkb 1
_KB4::
	.blkb 1
_KB3::
	.blkb 1
_KB2::
	.blkb 1
_KB1::
	.blkb 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -