📄 main.asm
字号:
;------------------------------------------------------------------------------------------------
;控制器简介:
;MPU: ATmega16
;FLASH: 16K*8位 / 8K*16位(0000H--01FFFH) 数据时为:0000H--1FFFH
;RAM: 1120*8位(0000H--045FH)
; 0000H--001FH 32个快速寄存器
; 0020H--005FH 64个I/O寄存器
; 0060H--045FH 内部RAM(1FFH(1024)个)
;EEPROM: 512*8位 (000H--1FFH)
;
;2.4--5.5v: 0--8MHz 选择:7.3728MHZ外部晶振
;------------------------------------------------------------------------------------------------
.include "m16def.inc" ;ATmega16 特殊寄存器定义文件
.include "Define_RAM.def" ;用户寄存器定义文件
.include "Define_constant.def" ;常量定义文件
;--------------------------中断向量地址转移----------------------------------------------------------
.ORG $0000
JMP Reset ;Reset 复位
.ORG INT0addr
JMP Int_External_INT0
;
; .ORG INT1addr
; JMP Int_External_INT1
.ORG OVF2addr ;定时器2 10ms基准
JMP Int_TC2_10ms
.ORG OVF1addr ;定时器1 0.1ms基准
JMP Int_TC1_Server
; .ORG OVF0addr ;定时器0 外部记数字
; JMP Int_TC0_Count
; .ORG URXCaddr
; JMP Int_USART_RxdEnd
; .ORG UTXCaddr
; JMP Int_USART_TxdEnd
;--------------------------程序区----------------------------------------------------------
.ORG 0x0029 ;ATmega16
Reset:
CLI ;关 全局中断
LDI temp1,high(RAMEND)
OUT SPH,temp1 ;堆贱 高位
LDI temp1,low(RAMEND)
OUT SPL,temp1 ;堆贱 低位
LDI temp1,0xFF
MOV R_ValueFFH,temp1
CLR R_Value0 ;置00H寄存器
MOV Time_count,R_Value0
LDI System_Flag,0 ;系统标志
STS EEPROM_Pag,R_Value0
LDI YL,low(Clr_SysRam_Begin) ;系统参数初次上电清零
LDI YH,high(Clr_SysRam_Begin)
LDI temp3,high(Clr_SysRam_End+1)
SysRamClr_Loop:
ST Y+,R_Value0
CPI YL,low(Clr_SysRam_End+1)
CPC YH,temp3
BRLO SysRamClr_Loop
System_InitIO:
LDI temp1,PORTA_Initial ;IO初始化
OUT PORTA,temp1
LDI temp1,PORTB_Initial
OUT PORTB,temp1
LDI temp1,PORTC_Initial
OUT PORTC,temp1
LDI temp1,PORTD_Initial
OUT PORTD,temp1
LDI temp1,PA_DDR
OUT DDRA,temp1
LDI temp1,PB_DDR
OUT DDRB,temp1
LDI temp1,PC_DDR
OUT DDRC,temp1
LDI temp1,PD_DDR
OUT DDRD,temp1
OUT MCUCR,R_Value0 ;总上拉
OUT EEARH,R_Value0 ;地址 高 EEPROM页(00--0FH)
CALL Delay_NOP_50ms
CALL Delay_NOP_50ms
;-------------------------------------------------------------------------------------------------
CALL TC2_Timer_Initial ;定时器2(10ms) 初始化程序
CALL TC1_Timer_Initial ;定时器1(0.1ms) 初始化程序
; CALL TC0_Timer_Initial ;定时器1(220v测频率)
;<---------中断初始化
LDI temp1,(1<<TOIE2)|(1<<TOIE1) ;溢出中断/TC2 溢出中断
OUT TIMSK,temp1
;
; LDI temp1,(1<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
; OUT WDTCR,temp1 ;开 看门狗(111=2.1s)
; LDI temp1,(0<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
; OUT WDTCR,temp1 ;开 看门狗 一定要两遍
;INT0 INT1 下降边沿中断
LDI temp1,(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00)
OUT MCUCR,temp1
LDI temp1,(1<<INT1)|(1<<INT0) ;使能外部中断0
OUT GIMSK,temp1
LDI R_Flag,0 ;标志寄存器清零
SEI ;开 全局中断
System_Init:
System_Example:
;------------------------------实验项目-------------------------------------------------------------
; 功能:红外线接收遥控
; 注意: JP6 2-3脚应该短接 PA0作普通IO口
; JP3 1-2脚应该短接
; 说明:把接受的解码通过LCD1602显示出来
iRomoteControl_Test:
RCALL CLR_LCD_Buf ;清除LCD1602显示缓充区
RCALL LCMInit ;LCM初始化
RCALL Delay_500ms
LDI temp1,0 ;www.mcutek.com
STS R_Position_Y,temp1
LDI temp1,0
RCALL Disp_LineMessage
LDI temp1,1 ;CODE1: CODE2:
STS R_Position_Y,temp1
LDI temp1,1
RCALL Disp_LineMessage
RCALL DispLCD1602Buf
iRomoteControl_Wait:
RCALL irReceive
RJMP iRomoteControl_Wait
;------------------------------------模块文件-----------------------------------------------------
.include "INT0_Server.asm" ;外部中断'0'中断服务模块
.include "TC2_Timer.asm" ;定时器TC2中断服务模块
.include "TC1_Timer.asm" ;定时器TC1中断服务模块
; .include "TC0_Timer.asm" ;定时器TC0中断服务模块
.include "Delay.asm" ;系统延时模块
.include "HS0038.asm"
.include "LCD1602_Driver.asm" ;LCD1602A控制模块
.include "HexBCD.asm"
;-----------------------------------------------------------------------------------------------
.ORG FLASHEND-1
JMP Reset
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -