📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\avr\2-1-4\main.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 24
;
; //ICC-AVR application builder : 2007-1-29 10:04:38
; // Target : M16
; // Crystal: 7.3728Mhz
; // 用途:演示通过PINB读按键的值,赋值给PORTA,键盘扫描模型。
; // 作者:古欣
; // AVR与虚拟仪器 [url]http://www.avrvi.com[/url]
; // 使用7.3728M外部晶振,请短接跳线JP2的1和2,电源跳线连接3.3V或者5V
; // 开发板连接:LED0~3——PA0~3,独立按键A~D接PB0~3
;
; #include <iom16v.h>
; #include <macros.h>
;
; #define led_port PORTA
; //定义输出端口
; #define led_ddr DDRA
; //定义输出控制寄存器
; #define key_PORT PORTB
; #define key_DDR DDRB
;
;
;
; void port_init(void)
; {
.dbline 25
; PORTA = 0x0F; //LED灭
ldi R24,15
out 0x1b,R24
.dbline 26
; DDRA = 0x00;
clr R2
out 0x1a,R2
.dbline 27
; PORTB = 0xFF; //按键的端口为输入
ldi R24,255
out 0x18,R24
.dbline 28
; DDRB = 0x00;
out 0x17,R2
.dbline 29
; PORTC = 0x00; //m103 output only
out 0x15,R2
.dbline 30
; DDRC = 0x00;
out 0x14,R2
.dbline 31
; PORTD = 0x00;
out 0x12,R2
.dbline 32
; DDRD = 0x00;
out 0x11,R2
.dbline 33
; led_ddr=0xff; //设置LED的端口为输出
out 0x1a,R24
.dbline 34
; key_PORT=0x0F; //使能按键的IO口的内部上拉
ldi R24,15
out 0x18,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 40
; }
;
; //call this routine to initialize all peripherals
; //此处为ICC系统生成,未做更改
; void init_devices(void)
; {
.dbline 42
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 43
; port_init();
xcall _port_init
.dbline 45
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 46
; GICR = 0x00;
out 0x3b,R2
.dbline 47
; TIMSK = 0x00; //timer interrupt sources
out 0x39,R2
.dbline 48
; SEI(); //re-enable interrupts
sei
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Delay _Delay fV
; j -> R1
; i -> R0
.even
_Delay::
.dbline -1
.dbline 53
; //all peripherals are now initialized
; }
;
; void Delay(void) //延时,没有详细计算
; {
.dbline 62
; unsigned char i,j;
; /*
; for(i=20;i>0;i--)
; {
; for(j=200;j>0;j--)
; ;
; }
; */
; ;
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym l j 1 c
.dbsym l i 1 c
.dbend
.dbfunc e main _main fV
; tmp -> R20
.even
_main::
.dbline -1
.dbline 66
; }
;
; void main(void)
; {
.dbline 67
; unsigned char tmp=0; //定义变量
clr R20
.dbline 68
; init_devices(); //初始化
xcall _init_devices
xjmp L6
L5:
.dbline 70
; while(1)
; {
.dbline 71
; tmp=(PINB&0x0F); //与0x0F 只取低四位的值
in R20,0x16
andi R20,15
.dbline 72
; if(tmp!=0x0F)
cpi R20,15
breq L8
.dbline 73
; {
.dbline 74
; Delay(); //延时去抖
xcall _Delay
.dbline 75
; if((PINB&0x0F)==tmp) //再次读IO口,如果和上次的值相等,则说明确实是键盘按下
in R24,0x16
andi R24,15
cp R24,R20
brne L10
.dbline 76
; {
.dbline 77
; PORTA = tmp&0x0F; //将键盘的值输出到PORTA上
mov R24,R20
andi R24,15
out 0x1b,R24
.dbline 78
; }
L10:
.dbline 79
; }
L8:
.dbline 80
xcall _Delay
.dbline 81
L6:
.dbline 69
xjmp L5
X0:
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbsym r tmp 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -