📄 1602_8563_timer.lst
字号:
__start:
__text_start:
004B E5CF LDI R28,0x5F
004C E0D4 LDI R29,4
004D BFCD OUT 0x3D,R28
004E BFDE OUT 0x3E,R29
004F 51C0 SUBI R28,0x10
0050 40D0 SBCI R29,0
0051 EA0A LDI R16,0xAA
0052 8308 STD Y+0,R16
0053 2400 CLR R0
0054 EAE1 LDI R30,0xA1
0055 E0F0 LDI R31,0
0056 E010 LDI R17,0
0057 3AE9 CPI R30,0xA9
0058 07F1 CPC R31,R17
0059 F011 BEQ 0x005C
005A 9201 ST R0,Z+
005B CFFB RJMP 0x0057
005C 8300 STD Z+0,R16
005D E5E4 LDI R30,0x54
005E E0F0 LDI R31,0
005F E6A0 LDI R26,0x60
0060 E0B0 LDI R27,0
0061 E010 LDI R17,0
0062 39E5 CPI R30,0x95
0063 07F1 CPC R31,R17
0064 F021 BEQ 0x0069
0065 95C8 LPM
0066 9631 ADIW R30,1
0067 920D ST R0,X+
0068 CFF9 RJMP 0x0062
0069 940E02DD CALL _main
_exit:
006B CFFF RJMP _exit
FILE: D:\PCF8563\1602_time\timer_io.h
(0001) /*******************************************
(0002) * 联接关系头文件 *
(0003) * 文 件 名:timer_io.h *
(0004) * 设 计:铜河 *
(0005) * 修改日期:2007年07月08日 *
(0006) * 版 本:V1.0 *
(0007) * 主控芯片:Mega16 *
(0008) *******************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011)
(0012) #define SPK_ON PORTD|=1<<6 //蜂鸣器接在PD6
(0013) #define SPK_OFF PORTD&=~(1<<6)
(0014) #define SPK_TG PORTD^=1<<6
(0015)
(0016) #define LED_ON PORTB|=1<<3 //背光接到PB3
(0017) #define LED_OFF PORTB&=~(1<<3)
(0018) #define LED_TG PORTB^=1<<3
(0019)
(0020) //输入端口定义
(0021) //按键定义:S1-0x01,S2-0x02,S3-0x04,S4-0x08
(0022) #define KEY_RD (~(((PIND>>2)|0xFE)&((PINC>>1)|0xF1)))
(0023)
(0024) /**********************************
(0025) * 端口设置函数 *
(0026) **********************************/
(0027) void port_init(void)
(0028) {
(0029) DDRA = 0xFF;
_port_init:
006C EF8F LDI R24,0xFF
006D BB8A OUT 0x1A,R24
(0030) PORTA = 0x00;
006E 2422 CLR R2
006F BA2B OUT 0x1B,R2
(0031) DDRB = 0x08;
0070 E088 LDI R24,0x8
0071 BB87 OUT 0x17,R24
(0032) PORTB = 0x00;
0072 BA28 OUT 0x18,R2
(0033) DDRC = 0x00;
0073 BA24 OUT 0x14,R2
(0034) PORTC = 0xFF;
0074 EF8F LDI R24,0xFF
0075 BB85 OUT 0x15,R24
(0035) DDRD = 0xF0;
0076 EF80 LDI R24,0xF0
0077 BB81 OUT 0x11,R24
(0036) PORTD = 0x0F;
0078 E08F LDI R24,0xF
0079 BB82 OUT 0x12,R24
007A 9508 RET
FILE: D:\PCF8563\1602_time\delay.h
(0001) //延时函数
(0002) #include <iom16v.h>
(0003)
(0004) //数据简化宏定义
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007)
(0008) /***********************************
(0009) * 微秒级延时函数 *
(0010) * 入口参数:i 需延时时长 us *
(0011) * 最大延时:65536 us *
(0012) * 时钟频率:7.3728M 其它频率不适用 *
(0013) ***********************************/
(0014) void delay_us(uint i)
(0015) {
_delay_us:
i --> R16
007B C005 RJMP 0x0081
(0016) while(i)
(0017) {
(0018) i--;
007C 5001 SUBI R16,1
007D 4010 SBCI R17,0
(0019) NOP();
007E 0000 NOP
(0020) NOP();
007F 0000 NOP
(0021) NOP();
0080 0000 NOP
0081 3000 CPI R16,0
0082 0701 CPC R16,R17
0083 F7C1 BNE 0x007C
0084 9508 RET
_delay_ms:
a --> R20
i --> R16
0085 940E052B CALL push_gset1
(0022) }
(0023) }
(0024)
(0025) /***********************************
(0026) * 毫秒级延时函数 *
(0027) * 入口参数:i 需延时时长 ms *
(0028) * 最大延时:65536 ms *
(0029) * 时钟频率:7.3728M 其它频率不适用 *
(0030) ***********************************/
(0031) void delay_ms(uint i)
(0032) {
(0033) uint a;
(0034) for(;i;i--)
0087 C00A RJMP 0x0092
(0035) {
(0036) for(a=1143;a;a--)
0088 E747 LDI R20,0x77
0089 E054 LDI R21,4
008A C002 RJMP 0x008D
008B 5041 SUBI R20,1
008C 4050 SBCI R21,0
008D 3040 CPI R20,0
008E 0745 CPC R20,R21
008F F7D9 BNE 0x008B
0090 5001 SUBI R16,1
0091 4010 SBCI R17,0
0092 3000 CPI R16,0
0093 0701 CPC R16,R17
0094 F799 BNE 0x0088
0095 940E052E CALL pop_gset1
0097 9508 RET
_lcd_da:
a --> R20
data --> R22
0098 940E0529 CALL push_gset2
009A 2F60 MOV R22,R16
FILE: D:\PCF8563\1602_time\lcd1602_4h.h
(0001) /*******************************************
(0002) * LCD1602联接函数 *
(0003) * LCD1602操作函数,4位数据联接关系: *
(0004) * LCD1602:DB4-DB7 __ M16:PA4-PA7 *
(0005) * LCD1602:RS _______ M16:PA2 *
(0006) * LCD1602:E ________ M16:PA3 *
(0007) * LCD1602:R/W ______ GND *
(0008) * 时钟频率:外部7.3728M晶体 *
(0009) * 作 者:铜河 *
(0010) * 日 期:2007年3月31日 *
(0011) *******************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014)
(0015) //LCD相关端口定义
(0016) #define RS1602 PA2 //RS接在PORTA.2上
(0017) #define E1602 PA3 //E接在PORTA.3上
(0018) #define LCD_CON PORTA //控制接在PA口
(0019) #define CLR_RS LCD_CON&=~(1<<RS1602)//RS清0
(0020) #define SET_RS LCD_CON|=1<<RS1602 //RS置1
(0021) #define CLR_E LCD_CON&=~(1<<E1602) //E清0
(0022) #define SET_E LCD_CON|=1<<E1602 //E置1
(0023) #define LCD_DATA PORTA //数据接在PA口
(0024) //简化宏定义
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027)
(0028) /*************************************
(0029) * LCD1602操作函数组 *
(0030) *************************************/
(0031) //写数据到LCD的函数:入口data,需写入的显示数据
(0032) void lcd_da(uchar data)
(0033) {
(0034) uchar a;
(0035) SET_RS; //RS置高,写数据
009B 9ADA SBI 0x1B,2
(0036) SET_E;
009C 9ADB SBI 0x1B,3
(0037) a=data|0x0F; //将低四位置1,保留高4位
009D 2F46 MOV R20,R22
009E 604F ORI R20,0xF
(0038) LCD_DATA=((LCD_DATA|0xF0)&a); //数据高4位送端口
009F B38B IN R24,0x1B
00A0 6F80 ORI R24,0xF0
00A1 2384 AND R24,R20
00A2 BB8B OUT 0x1B,R24
(0039) delay_us(50);
00A3 E302 LDI R16,0x32
00A4 E010 LDI R17,0
00A5 DFD5 RCALL _delay_us
(0040) CLR_E; //E下降沿写入数据
00A6 98DB CBI 0x1B,3
(0041) delay_ms(1); //延时50uS
00A7 E001 LDI R16,1
00A8 E010 LDI R17,0
00A9 DFDB RCALL _delay_ms
(0042)
(0043) SET_E;
00AA 9ADB SBI 0x1B,3
(0044) a=((data<<4)|0x0F); //将低四位移到高四位并保留
00AB 2F46 MOV R20,R22
00AC 704F ANDI R20,0xF
00AD 9542 SWAP R20
00AE 604F ORI R20,0xF
(0045) LCD_DATA=((LCD_DATA|0xF0)&a); //数据低4位送端口
00AF B38B IN R24,0x1B
00B0 6F80 ORI R24,0xF0
00B1 2384 AND R24,R20
00B2 BB8B OUT 0x1B,R24
(0046) delay_us(50);
00B3 E302 LDI R16,0x32
00B4 E010 LDI R17,0
00B5 DFC5 RCALL _delay_us
(0047) CLR_E; //E下降沿写入数据
00B6 98DB CBI 0x1B,3
(0048) delay_ms(1); //延时50uS
00B7 E001 LDI R16,1
00B8 E010 LDI R17,0
00B9 DFCB RCALL _delay_ms
00BA 940E051D CALL pop_gset2
00BC 9508 RET
_lcd_comm:
a --> R20
data --> R22
00BD 940E0529 CALL push_gset2
00BF 2F60 MOV R22,R16
(0049) }
(0050)
(0051) //写指令到LCD的函数:入口data,需写入的控制指令
(0052) void lcd_comm(uchar data)
(0053) {
(0054) uchar a;
(0055) CLR_RS; //RS清0,写指令
00C0 98DA CBI 0x1B,2
(0056) SET_E;
00C1 9ADB SBI 0x1B,3
(0057) a=data|0x0F; //将低四位置1,保留高4位
00C2 2F46 MOV R20,R22
00C3 604F ORI R20,0xF
(0058) LCD_DATA=((LCD_DATA|0xF0)&a); //指令高4位送端口
00C4 B38B IN R24,0x1B
00C5 6F80 ORI R24,0xF0
00C6 2384 AND R24,R20
00C7 BB8B OUT 0x1B,R24
(0059) delay_us(50);
00C8 E302 LDI R16,0x32
00C9 E010 LDI R17,0
00CA DFB0 RCALL _delay_us
(0060) CLR_E; //E下降沿写入指令
00CB 98DB CBI 0x1B,3
(0061) delay_ms(1); //延时50uS
00CC E001 LDI R16,1
00CD E010 LDI R17,0
00CE DFB6 RCALL _delay_ms
(0062)
(0063) SET_E;
00CF 9ADB SBI 0x1B,3
(0064) a=((data<<4)|0x0F); //将低四位移到高四位并保留
00D0 2F46 MOV R20,R22
00D1 704F ANDI R20,0xF
00D2 9542 SWAP R20
00D3 604F ORI R20,0xF
(0065) LCD_DATA=((LCD_DATA|0xF0)&a); //指令低4位送端口
00D4 B38B IN R24,0x1B
00D5 6F80 ORI R24,0xF0
00D6 2384 AND R24,R20
00D7 BB8B OUT 0x1B,R24
(0066) delay_us(50);
00D8 E302 LDI R16,0x32
00D9 E010 LDI R17,0
00DA DFA0 RCALL _delay_us
(0067) CLR_E; //E下降沿写入指令
00DB 98DB CBI 0x1B,3
(0068) delay_ms(1); //延时50uS
00DC E001 LDI R16,1
00DD E010 LDI R17,0
00DE DFA6 RCALL _delay_ms
00DF 940E051D CALL pop_gset2
00E1 9508 RET
_lcd_comm_b:
a --> R20
data --> R20
00E2 940E052B CALL push_gset1
00E4 2F40 MOV R20,R16
(0069) }
(0070)
(0071) //写半指令到LCD的函数:入口data,需写入的控制指令
(0072) void lcd_comm_b(uchar data)
(0073) {
(0074) uchar a;
(0075) CLR_RS; //RS清0,写指令
00E5 98DA CBI 0x1B,2
(0076) SET_E;
00E6 9ADB SBI 0x1B,3
(0077) a=data|0x0F; //将低四位置1,保留高4位
00E7 604F ORI R20,0xF
(0078) LCD_DATA=((LCD_DATA|0xF0)&a); //指令高4位送端口
00E8 B38B IN R24,0x1B
00E9 6F80 ORI R24,0xF0
00EA 2384 AND R24,R20
00EB BB8B OUT 0x1B,R24
(0079) delay_us(50);
00EC E302 LDI R16,0x32
00ED E010 LDI R17,0
00EE DF8C RCALL _delay_us
(0080) CLR_E; //E下降沿写入指令
00EF 98DB CBI 0x1B,3
(0081) delay_ms(1); //延时50uS
00F0 E001 LDI R16,1
00F1 E010 LDI R17,0
00F2 DF92 RCALL _delay_ms
00F3 940E052E CALL pop_gset1
00F5 9508 RET
(0082) }
(0083)
(0084) //LCD1602初始化函数
(0085) void lcd_init(void)
(0086) {
(0087) delay_ms(2);
_lcd_init:
00F6 E002 LDI R16,2
00F7 E010 LDI R17,0
00F8 DF8C RCALL _delay_ms
(0088) lcd_comm_b(0x20); //写半指令:4位数据
00F9 E200 LDI R16,0x20
00FA DFE7 RCALL _lcd_comm_b
(0089) delay_us(400);
00FB E900 LDI R16,0x90
00FC E011 LDI R17,1
00FD DF7D RCALL _delay_us
(0090) lcd_comm(0x28); //写指令:4位数据、2行显示、5*8点阵
00FE E208 LDI R16,0x28
00FF DFBD RCALL _lcd_comm
(0091) delay_us(200);
0100 EC08 LDI R16,0xC8
0101 E010 LDI R17,0
0102 DF78 RCALL _delay_us
(0092) lcd_comm(0x0C); //写指令:显示开
0103 E00C LDI R16,0xC
0104 DFB8 RCALL _lcd_comm
(0093) delay_us(200);
0105 EC08 LDI R16,0xC8
0106 E010 LDI R17,0
0107 DF73 RCALL _delay_us
(0094) lcd_comm(0x06); //写指令:自左向右显示
0108 E006 LDI R16,6
0109 DFB3 RCALL _lcd_comm
(0095) delay_us(100);
010A E604 LDI R16,0x64
010B E010 LDI R17,0
010C DF6E RCALL _delay_us
(0096) lcd_comm(0x01); //写指令:CLS
010D E001 LDI R16,1
010E DFAE RCALL _lcd_comm
(0097) delay_ms(10);
010F E00A LDI R16,0xA
0110 E010 LDI R17,0
0111 DF73 RCALL _delay_ms
0112 9508 RET
(0098) }
(0099)
(0100) //清屏指令函数
(0101) void cls(void)
(0102) {
(0103) lcd_comm(0x01);
_cls:
0113 E001 LDI R16,1
0114 DFA8 RCALL _lcd_comm
(0104) delay_ms(5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -