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

📄 main.s

📁 方波发生器程序。AVR单片机程序。MEGA16
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)/delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 15
; /***************************************
; *              方波生成器              *
; * 程序功能: 生成占空比可调方波         *
; * 时钟频率: 外部7.3728M                *
; * 设    计:莫锦攀                     *
; * 修改日期:2007年07月26日             *
; * 编译环境:ICC-AVR6.31                *
; * 实验环境:M16学习板                  *
; * 使用端口: LCD:PC6,PC7,PA4~PA7        *
; *           KEY:PB0,PD2,PD3            *
; * 程序说明:方波范围:28HZ~22800HZ,步进*
; *           2HZ,低频时可以观测到LED闪烁*
; *                                      *
; ***************************************/
; #include <iom16v.h>
	.dbline 16
; #include "1602.h"
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 20
; #include "delay.h"
; 
; #define uchar unsigned char
; #define uint  unsigned int
	.dbline 21
; 
	clr R20
	clr R21
	.dbline 22
; uchar get_key(void)
	xjmp L6
L3:
	.dbline 23
	xcall _delay_1us
L4:
	.dbline 22
	subi R20,255  ; offset = 1
	sbci R21,255
L6:
	.dbline 22
	cp R20,R22
	cpc R21,R23
	brlo L3
	.dbline -2
L2:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 27
; {
;  unsigned char i;
;  static unsigned char j;//按键记录 
;  PORTD|=0x0c;//pd2,pd3上拉电阻
;  DDRD&=0xf3;//pd2,pd3为输入
	.dbline 29
	clr R16
	clr R17
	xjmp L11
L8:
	.dbline 29
L9:
	.dbline 29
	subi R16,255  ; offset = 1
	sbci R17,255
L11:
	.dbline 29
; 
; 
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L8
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 33
;  if((PIND&0x04)==0)i='A';   
;  else if((PIND&0x08)==0)i='B';
;  else i=0x00;
;     
	.dbline 34
;  if (i == 0x00)//无有效按键按下
	clr R20
	clr R21
	.dbline 35
;    {
	xjmp L16
L13:
	.dbline 36
	xcall _delay_1ms
L14:
	.dbline 35
	subi R20,255  ; offset = 1
	sbci R21,255
L16:
	.dbline 35
	cp R20,R22
	cpc R21,R23
	brlo L13
	.dbline -2
L12:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfile D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)/1602.h
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 44
;     j = 0x00;//清除按键记录
;     return 0x00;//程序退出
;    }
;    if (j == 0x00) //为新按键
;     {j = i;//保存本次采样结果
;      delay_nms(10);//去按键颤抖
;      if((PIND&0x04)==0)i='A';   
;      else if((PIND&0x08)==0)i='B';
;      else i=0x00;	 
	.dbline 45
;      if(i == j) {return i;}
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 46
;     }
	sbi 0x14,7
	.dbline 47
; return 0x00;
	sbi 0x14,6
	.dbline 48
; }
	ldi R16,40
	xcall _LCD_write_command
	.dbline 49
; 
	xcall _LCD_en_write
	.dbline 50
; void init_timer0(void)
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 51
; {
	ldi R16,40
	xcall _LCD_write_command
	.dbline 52
;  DDRB|=0x08;//OC0匹配输出
	ldi R16,12
	xcall _LCD_write_command
	.dbline 53
;  TCNT0=0x00;//清除定时器值
	ldi R16,1
	xcall _LCD_write_command
	.dbline 54
;  TCCR0=0x6d;//快速PWM模式,匹配时OC0清零,top时置数,系统时钟1024分频                                                              频,输出比较匹配清除定时器值
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 61
;  
; 
;  OCR0=0x80;//OCR0置初值,占空比50%
;  
; }
; 
; 
	.dbline 62
; void F_set(void)
	sbi 0x15,7
	.dbline 63
; {
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline 64
;  static unsigned char i;
	cbi 0x15,7
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_command _LCD_write_command fV
;        command -> R20
	.even
_LCD_write_command::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 68
;  if(i!=5)i++;
;  else i=1;
;  switch(i)//频率选择
; 		  {
	.dbline 70
; 		   case 1:
; 		   {
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 71
; 		    TCCR0=0x6d;
	cbi 0x15,6
	.dbline 72
; 		    LCD_write_string(6,0,"   28HZ");
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 73
; 		    break;
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 74
; 		   } //1024分频,F=28HZ
	xcall _LCD_en_write
	.dbline 75
; 		   case 2:
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 76
; 		   {
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 77
; 		    TCCR0=0x6c;
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 78
; 		    LCD_write_string(6,0,"  112HZ");
	xcall _LCD_en_write
	.dbline -2
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r command 20 c
	.dbend
	.dbfunc e LCD_write_data _LCD_write_data fV
;           data -> R20
	.even
_LCD_write_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 95
; 		    break; 
; 		   }// 256分频,F=112HZ
; 		   case 3:
; 		   {
; 		    TCCR0=0x6b;
; 			LCD_write_string(6,0,"  450HZ");
; 			break;
; 		   } //  64分频,F=450HZ
; 		   case 4:
; 		   {
; 		    TCCR0=0x6a;
; 			LCD_write_string(6,0," 7200HZ");
; 			break;
; 		   } //   8分频,F=7200HZ
; 		   case 5:
; 		   {
; 		    TCCR0=0x69;
	.dbline 97
; 			LCD_write_string(6,0,"28800HZ");
; 			break;
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 98
; 		   } //  无分频,F=28800HZ		    
	sbi 0x15,6
	.dbline 99
; 		   default:break;
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 100
; 		  }
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 101
;  
	xcall _LCD_en_write
	.dbline 102
;  
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 103
;  
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 104
; }
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 105
; 
	xcall _LCD_en_write
	.dbline -2
L20:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_set_xy _LCD_set_xy fV
;        address -> R20
;              y -> R20
;              x -> R22
	.even
_LCD_set_xy::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 124
; void R_set(void)
; {
;  static unsigned char i;
;  if(i!=9)i++;
;  else i=1;
;  switch(i)//频率选择
; 		  {
; 		   case 1:
; 		   {
; 		    OCR0=0x0a;//占空比10%
; 		    LCD_write_string(13,0,"10%");
; 		    break;
; 		   } 
; 		   case 2:
; 		   {
; 		    OCR0=0x14;//占空比20%
; 		    LCD_write_string(13,0,"20%");
; 		    break; 
; 		   }
	.dbline 126
; 		   case 3:
; 		   {
	tst R20
	brne L22
	.dbline 126
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L23
L22:
	.dbline 127
; 		    OCR0=0x1e;//占空比30%
	mov R20,R22
	subi R20,64    ; addi 192
L23:
	.dbline 128
; 			LCD_write_string(13,0,"30%");
	mov R16,R20
	xcall _LCD_write_command
	.dbline -2
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r y 20 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              s -> R20,R21
;              Y -> R10
;              X -> R22
	.even
_LCD_write_string::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 132
; 			break;
; 		   } 
; 		   case 4:
; 		   {
	.dbline 133
; 		    OCR0=0x28;//占空比40%
	mov R18,R10
	mov R16,R22
	xcall _LCD_set_xy
	xjmp L26
L25:
	.dbline 135
	.dbline 136
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_data
	.dbline 137
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 138
L26:
	.dbline 134
; 			LCD_write_string(13,0,"40%");
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L25
	.dbline -2
L24:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           data -> y+4
;              Y -> R22
;              X -> R20
	.even
_LCD_write_char::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 143
; 			break;
; 		   } 
; 		   case 5:
; 		   {
; 		    OCR0=0x80;//占空比50%
; 			LCD_write_string(13,0,"50%");
; 			break;
; 		   }
; 		   case 6:
	.dbline 144
; 		   {
	mov R18,R22
	mov R16,R20
	xcall _LCD_set_xy
	.dbline 145
; 		    OCR0=0x3c;//占空比60%
	ldd R16,y+4
	xcall _LCD_write_data
	.dbline -2
L28:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data 4 c
	.dbsym r Y 22 c
	.dbsym r X 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)/1602.h
L30:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)/1602.h
	.dbfile D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\main.c
	.dbfunc e get_key _get_key fc
	.dbsym s j L30 c
;              i -> R20
	.even
_get_key::
	xcall push_gset1
	.dbline -1
	.dbline 23
	.dbline 26
	in R24,0x12
	ori R24,12
	out 0x12,R24
	.dbline 27
	in R24,0x11
	andi R24,243
	out 0x11,R24
	.dbline 30
	sbic 0x10,2
	rjmp L31
	.dbline 30
	ldi R20,65
	xjmp L32
L31:
	.dbline 31
	sbic 0x10,3
	rjmp L33
	.dbline 31
	ldi R20,66
	xjmp L34
L33:
	.dbline 32
	clr R20
L34:
L32:
	.dbline 34
	tst R20
	brne L35
	.dbline 35
	.dbline 36
	clr R2
	sts L30,R2
	.dbline 37
	clr R16
	xjmp L29
L35:
	.dbline 39
	lds R2,L30
	tst R2
	brne L37
	.dbline 40
	.dbline 40
	sts L30,R20
	.dbline 41
	ldi R16,10
	ldi R17,0
	xcall _delay_nms
	.dbline 42
	sbic 0x10,2
	rjmp L39
	.dbline 42
	ldi R20,65
	xjmp L40
L39:
	.dbline 43
	sbic 0x10,3
	rjmp L41

⌨️ 快捷键说明

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