📄 方波生成器.lst
字号:
__start:
__text_start:
0059 E5CF LDI R28,0x5F
005A E0D4 LDI R29,4
005B BFCD OUT 0x3D,R28
005C BFDE OUT 0x3E,R29
005D 51C0 SUBI R28,0x10
005E 40D0 SBCI R29,0
005F EA0A LDI R16,0xAA
0060 8308 STD Y+0,R16
0061 2400 CLR R0
0062 EBED LDI R30,0xBD
0063 E0F0 LDI R31,0
0064 E010 LDI R17,0
0065 3CE0 CPI R30,0xC0
0066 07F1 CPC R31,R17
0067 F011 BEQ 0x006A
0068 9201 ST R0,Z+
0069 CFFB RJMP 0x0065
006A 8300 STD Z+0,R16
006B E5E4 LDI R30,0x54
006C E0F0 LDI R31,0
006D E6A0 LDI R26,0x60
006E E0B0 LDI R27,0
006F E010 LDI R17,0
0070 3BE1 CPI R30,0xB1
0071 07F1 CPC R31,R17
0072 F021 BEQ 0x0077
0073 95C8 LPM
0074 9631 ADIW R30,1
0075 920D ST R0,X+
0076 CFF9 RJMP 0x0070
0077 940E0262 CALL _main
_exit:
0079 CFFF RJMP _exit
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ;
(0013)
(0014) void delay_1us(void) //1us延时函数
(0015) {
(0016) asm("nop");
_delay_1us:
007A 0000 NOP
007B 9508 RET
_delay_nus:
i --> R20
n --> R22
007C 940E0284 CALL push_gset2
007E 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
007F 2744 CLR R20
0080 2755 CLR R21
(0022) for (i=0;i<n;i++)
0081 C003 RJMP 0x0085
(0023) delay_1us();
0082 DFF7 RCALL _delay_1us
0083 5F4F SUBI R20,0xFF
0084 4F5F SBCI R21,0xFF
0085 1746 CP R20,R22
0086 0757 CPC R21,R23
0087 F3D0 BCS 0x0082
0088 940E0278 CALL pop_gset2
008A 9508 RET
(0024) }
(0025)
(0026) void delay_1ms(void) //1ms延时函数
(0027) {
(0028) unsigned int i;
(0029) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
008B 2700 CLR R16
008C 2711 CLR R17
008D C002 RJMP 0x0090
008E 5F0F SUBI R16,0xFF
008F 4F1F SBCI R17,0xFF
0090 3704 CPI R16,0x74
0091 E0E4 LDI R30,4
0092 071E CPC R17,R30
0093 F3D0 BCS 0x008E
0094 9508 RET
_delay_nms:
i --> R20
n --> R22
0095 940E0284 CALL push_gset2
0097 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0098 2744 CLR R20
0099 2755 CLR R21
(0035) for (i=0;i<n;i++)
009A C003 RJMP 0x009E
(0036) delay_1ms();
009B DFEF RCALL _delay_1ms
009C 5F4F SUBI R20,0xFF
009D 4F5F SBCI R21,0xFF
009E 1746 CP R20,R22
009F 0757 CPC R21,R23
00A0 F3D0 BCS 0x009B
00A1 940E0278 CALL pop_gset2
00A3 9508 RET
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PC4 ->RS
(0009) PC5 ->EN
(0010) 地 ->RW
(0011) PC0 ->D4
(0012) PC1 ->D5
(0013) PC2 ->D6
(0014) PC3 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT PORTC //以下2个要设为同一个口
(0018) #define LCD_EN_DDR DDRC
(0019) #define LCD_RS_PORT PORTC //以下2个要设为同一个口
(0020) #define LCD_RS_DDR DDRC
(0021) #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR DDRA //默认情况下连线必须使用高四位端口,如果不是请注意修改
(0023) #define LCD_DATA_PIN PINA
(0024) #define LCD_RS (1<<PC6) //0x20 portC6 out
(0025) #define LCD_EN (1<<PC7) //0x40 portC7 out
(0026) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA 4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037)
(0038) //-----------------------------------------------------------------------------------------
(0039)
(0040) #include <macros.h>
(0041) #include "delay.h"
(0042)
(0043) void LCD_init(void) //液晶初始化
(0044) {
(0045) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
00A4 B38A IN R24,0x1A
00A5 6F80 ORI R24,0xF0
00A6 BB8A OUT 0x1A,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
00A7 9AA7 SBI 0x14,7
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
00A8 9AA6 SBI 0x14,6
(0048) LCD_write_command(0x28);
00A9 E208 LDI R16,0x28
00AA D014 RCALL _LCD_write_command
(0049) LCD_en_write();
00AB D00D RCALL _LCD_en_write
(0050) delay_nus(40);
00AC E208 LDI R16,0x28
00AD E010 LDI R17,0
00AE DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
00AF E208 LDI R16,0x28
00B0 D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
00B1 E00C LDI R16,0xC
00B2 D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
00B3 E001 LDI R16,1
00B4 D00A RCALL _LCD_write_command
(0054) delay_nms(2);
00B5 E002 LDI R16,2
00B6 E010 LDI R17,0
00B7 DFDD RCALL _delay_nms
00B8 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00B9 9AAF SBI 0x15,7
(0063) delay_nus(1);
00BA E001 LDI R16,1
00BB E010 LDI R17,0
00BC DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
00BD 98AF CBI 0x15,7
00BE 9508 RET
_LCD_write_command:
command --> R20
00BF 940E0286 CALL push_gset1
00C1 2F40 MOV R20,R16
(0065) }
(0066)
(0067) void LCD_write_command(unsigned char command) //写指令
(0068) {
(0069) //连线为高4位的写法
(0070) delay_nus(16);
00C2 E100 LDI R16,0x10
00C3 E010 LDI R17,0
00C4 DFB7 RCALL _delay_nus
(0071) LCD_RS_PORT&=~LCD_RS; //RS=0
00C5 98AE CBI 0x15,6
(0072) LCD_DATA_PORT&=0X0f; //清高四位
00C6 B38B IN R24,0x1B
00C7 708F ANDI R24,0xF
00C8 BB8B OUT 0x1B,R24
(0073) LCD_DATA_PORT|=command&0xf0; //写高四位
00C9 2F84 MOV R24,R20
00CA 7F80 ANDI R24,0xF0
00CB B22B IN R2,0x1B
00CC 2A28 OR R2,R24
00CD BA2B OUT 0x1B,R2
(0074) LCD_en_write();
00CE DFEA RCALL _LCD_en_write
(0075) command=command<<4; //低四位移到高四位
00CF 2F84 MOV R24,R20
00D0 708F ANDI R24,0xF
00D1 9582 SWAP R24
00D2 2F48 MOV R20,R24
(0076) LCD_DATA_PORT&=0x0f; //清高四位
00D3 B38B IN R24,0x1B
00D4 708F ANDI R24,0xF
00D5 BB8B OUT 0x1B,R24
(0077) LCD_DATA_PORT|=command&0xf0; //写低四位
00D6 2F84 MOV R24,R20
00D7 7F80 ANDI R24,0xF0
00D8 B22B IN R2,0x1B
00D9 2A28 OR R2,R24
00DA BA2B OUT 0x1B,R2
(0078) LCD_en_write();
00DB DFDD RCALL _LCD_en_write
00DC 940E0289 CALL pop_gset1
00DE 9508 RET
_LCD_write_data:
data --> R20
00DF 940E0286 CALL push_gset1
00E1 2F40 MOV R20,R16
(0079)
(0080) /*
(0081) //连线为低四位的写法
(0082) delay_nus(16);
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
(0084) LCD_DATA_PORT&=0xf0; //清高四位
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
(0086) LCD_en_write();
(0087) LCD_DATA_PORT&=0xf0; //清高四位
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
(0089) LCD_en_write();
(0090) */
(0091)
(0092) }
(0093)
(0094) void LCD_write_data(unsigned char data) //写数据
(0095) {
(0096) //连线为高4位的写法
(0097) delay_nus(16);
00E2 E100 LDI R16,0x10
00E3 E010 LDI R17,0
00E4 DF97 RCALL _delay_nus
(0098) LCD_RS_PORT|=LCD_RS; //RS=1
00E5 9AAE SBI 0x15,6
(0099) LCD_DATA_PORT&=0X0f; //清高四位
00E6 B38B IN R24,0x1B
00E7 708F ANDI R24,0xF
00E8 BB8B OUT 0x1B,R24
(0100) LCD_DATA_PORT|=data&0xf0; //写高四位
00E9 2F84 MOV R24,R20
00EA 7F80 ANDI R24,0xF0
00EB B22B IN R2,0x1B
00EC 2A28 OR R2,R24
00ED BA2B OUT 0x1B,R2
(0101) LCD_en_write();
00EE DFCA RCALL _LCD_en_write
(0102) data=data<<4; //低四位移到高四位
00EF 2F84 MOV R24,R20
00F0 708F ANDI R24,0xF
00F1 9582 SWAP R24
00F2 2F48 MOV R20,R24
(0103) LCD_DATA_PORT&=0X0f; //清高四位
00F3 B38B IN R24,0x1B
00F4 708F ANDI R24,0xF
00F5 BB8B OUT 0x1B,R24
(0104) LCD_DATA_PORT|=data&0xf0; //写低四位
00F6 2F84 MOV R24,R20
00F7 7F80 ANDI R24,0xF0
00F8 B22B IN R2,0x1B
00F9 2A28 OR R2,R24
00FA BA2B OUT 0x1B,R2
(0105) LCD_en_write();
00FB DFBD RCALL _LCD_en_write
00FC 940E0289 CALL pop_gset1
00FE 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00FF 940E0284 CALL push_gset2
0101 2F42 MOV R20,R18
0102 2F60 MOV R22,R16
(0106)
(0107) /*
(0108) //连线为低四位的写法
(0109) delay_nus(16);
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
(0113) LCD_en_write();
(0114)
(0115) LCD_DATA_PORT&=0Xf0; //清高四位
(0116) LCD_DATA_PORT|=data&0x0f; //写低四位
(0117) LCD_en_write();
(0118) */
(0119)
(0120) }
(0121)
(0122)
(0123) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0124) {
(0125) unsigned char address;
(0126) if (y == 0) address = 0x80 + x;
0103 2344 TST R20
0104 F419 BNE 0x0108
0105 2F46 MOV R20,R22
0106 5840 SUBI R20,0x80
0107 C002 RJMP 0x010A
(0127) else address = 0xc0 + x;
0108 2F46 MOV R20,R22
0109 5440 SUBI R20,0x40
(0128) LCD_write_command( address);
010A 2F04 MOV R16,R20
010B DFB3 RCALL _LCD_write_command
010C 940E0278 CALL pop_gset2
010E 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
010F 940E0282 CALL push_gset3
0111 2EA2 MOV R10,R18
0112 2F60 MOV R22,R16
0113 814E LDD R20,Y+6
0114 815F LDD R21,Y+7
(0129) }
(0130)
(0131) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0132) {
(0133) LCD_set_xy( X, Y ); //写地址
0115 2D2A MOV R18,R10
0116 2F06 MOV R16,R22
0117 DFE7 RCALL _LCD_set_xy
0118 C005 RJMP 0x011E
(0134) while (*s) // 写显示字符
(0135) {
(0136) LCD_write_data( *s );
0119 01FA MOVW R30,R20
011A 8100 LDD R16,Z+0
011B DFC3 RCALL _LCD_write_data
(0137) s ++;
011C 5F4F SUBI R20,0xFF
011D 4F5F SBCI R21,0xFF
011E 01FA MOVW R30,R20
011F 8020 LDD R2,Z+0
0120 2022 TST R2
0121 F7B9 BNE 0x0119
0122 940E027B CALL pop_gset3
0124 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0125 940E0284 CALL push_gset2
0127 2F62 MOV R22,R18
0128 2F40 MOV R20,R16
(0138) }
(0139)
(0140) }
(0141)
(0142) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0143) {
(0144) LCD_set_xy( X, Y ); //写地址
0129 2F26 MOV R18,R22
012A 2F04 MOV R16,R20
012B DFD3 RCALL _LCD_set_xy
(0145) LCD_write_data( data);
012C 810C LDD R16,Y+4
012D DFB1 RCALL _LCD_write_data
012E 940E0278 CALL pop_gset2
0130 9508 RET
_get_key:
i --> R20
0131 940E0286 CALL push_gset1
FILE: D:\avr\+++精华+++\+M16范例+\方波生成器2(PWM)\main.c
(0001) /***************************************
(0002) * 方波生成器 *
(0003) * 程序功能: 生成占空比可调方波 *
(0004) * 时钟频率: 外部7.3728M *
(0005) * 设 计:莫锦攀 *
(0006) * 修改日期:2007年07月26日 *
(0007) * 编译环境:ICC-AVR6.31 *
(0008) * 实验环境:M16学习板 *
(0009) * 使用端口: LCD:PC6,PC7,PA4~PA7 *
(0010) * KEY:PB0,PD2,PD3 *
(0011) * 程序说明:方波范围:28HZ~22800HZ,步进*
(0012) * 2HZ,低频时可以观测到LED闪烁*
(0013) * *
(0014) ***************************************/
(0015) #include <iom16v.h>
(0016) #include "1602.h"
(0017) #include "delay.h"
(0018)
(0019) #define uchar unsigned char
(0020) #define uint unsigned int
(0021)
(0022) uchar get_key(void)
(0023) {
(0024) unsigned char i;
(0025) static unsigned char j;//按键记录
(0026) PORTD|=0x0c;//pd2,pd3上拉电阻
0133 B382 IN R24,0x12
0134 608C ORI R24,0xC
0135 BB82 OUT 0x12,R24
(0027) DDRD&=0xf3;//pd2,pd3为输入
0136 B381 IN R24,0x11
0137 7F83 ANDI R24,0xF3
0138 BB81 OUT 0x11,R24
(0028)
(0029)
(0030) if((PIND&0x04)==0)i='A';
0139 9982 SBIC 0x10,2
013A C002 RJMP 0x013D
013B E441 LDI R20,0x41
013C C005 RJMP 0x0142
(0031) else if((PIND&0x08)==0)i='B';
013D 9983 SBIC 0x10,3
013E C002 RJMP 0x0141
013F E442 LDI R20,0x42
0140 C001 RJMP 0x0142
(0032) else i=0x00;
0141 2744 CLR R20
(0033)
(0034) if (i == 0x00)//无有效按键按下
0142 2344 TST R20
0143 F429 BNE 0x0149
(0035) {
(0036) j = 0x00;//清除按键记录
0144 2422 CLR R2
0145 922000BD STS j,R2
(0037) return 0x00;//程序退出
0147 2700 CLR R16
0148 C019 RJMP 0x0162
(0038) }
(0039) if (j == 0x00) //为新按键
0149 902000BD LDS R2,j
014B 2022 TST R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -