📄 yi1602.lst
字号:
__start:
__text_start:
005E E5CF LDI R28,0x5F
005F E0D4 LDI R29,4
0060 BFCD OUT P3D,R28
0061 BFDE OUT P3E,R29
0062 51C0 SUBI R28,0x10
0063 40D0 SBCI R29,0
0064 EA0A LDI R16,0xAA
0065 8308 STD R16,0+Y
0066 2400 CLR R0
0067 E7EB LDI R30,0x7B
0068 E0F0 LDI R31,0
0069 E010 LDI R17,0
006A 37EB CPI R30,0x7B
006B 07F1 CPC R31,R17
006C F011 BEQ 0x006F
006D 9201 ST R0,Z+
006E CFFB RJMP 0x006A
006F 8300 STD R16,0+Z
0070 EAE0 LDI R30,0xA0
0071 E0F0 LDI R31,0
0072 E6A0 LDI R26,0x60
0073 E0B0 LDI R27,0
0074 E010 LDI R17,0
0075 3BEB CPI R30,0xBB
0076 07F1 CPC R31,R17
0077 F021 BEQ 0x007C
0078 95C8 LPM
0079 9631 ADIW R30,1
007A 920D ST R0,X+
007B CFF9 RJMP 0x0075
007C 940E0186 CALL _main
_exit:
007E CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
007F 940E01DB CALL push_gset2
0081 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0082 E005 LDI R16,5
0083 E010 LDI R17,0
0084 019B MOVW R18,R22
0085 940E01B4 CALL empy16s
0087 01B8 MOVW R22,R16
0088 9576 LSR R23
0089 9567 ROR R22
008A 9576 LSR R23
008B 9567 ROR R22
(0031) for( i=0;i<US;i++);
008C 2744 CLR R20
008D 2755 CLR R21
008E C002 RJMP 0x0091
008F 5F4F SUBI R20,0xFF
0090 4F5F SBCI R21,0xFF
0091 1746 CP R20,R22
0092 0757 CPC R21,R23
0093 F3D8 BCS 0x008F
(0032) }
0094 940E01DF CALL pop_gset2
0096 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0097 940E01DB CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
0099 2744 CLR R20
009A 2755 CLR R21
009B C00B RJMP 0x00A7
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
009C 2766 CLR R22
009D 2777 CLR R23
009E C002 RJMP 0x00A1
009F 5F6F SUBI R22,0xFF
00A0 4F7F SBCI R23,0xFF
00A1 3765 CPI R22,0x75
00A2 E0E4 LDI R30,4
00A3 077E CPC R23,R30
00A4 F3D0 BCS 0x009F
00A5 5F4F SUBI R20,0xFF
00A6 4F5F SBCI R21,0xFF
00A7 1740 CP R20,R16
00A8 0751 CPC R21,R17
00A9 F390 BCS 0x009C
(0044) }
00AA 940E01DF CALL pop_gset2
00AC 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
00AD EF8F LDI R24,0xFF
00AE BB8A OUT P1A,R24
(0054) DDRB=0xFF;
00AF BB87 OUT P17,R24
(0055) DDRC=0xFF;
00B0 BB84 OUT P14,R24
(0056) DDRD=0xFF;
00B1 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
00B2 2422 CLR R2
00B3 B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
00B4 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
00B5 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
00B6 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
00B7 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
00B8 9ADA SBI P1B,2
(0065) Delayus(5);
00B9 E005 LDI R16,5
00BA E010 LDI R17,0
00BB DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
00BC 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
00BD 2422 CLR R2
00BE BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00BF 9ADB SBI P1B,3
(0070) Delayus(50);
00C0 E302 LDI R16,0x32
00C1 E010 LDI R17,0
00C2 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00C3 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00C4 EF8F LDI R24,0xFF
00C5 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00C6 9ADC SBI P1B,4
(0075) Delayus(50);
00C7 E302 LDI R16,0x32
00C8 E010 LDI R17,0
00C9 DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00CA 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00CB EF8F LDI R24,0xFF
00CC BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00CD 9ADF SBI P1B,7
(0080) Delayus(50);
00CE E302 LDI R16,0x32
00CF E010 LDI R17,0
00D0 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00D1 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00D2 9508 RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
(0001) /*******************************************
(0002) 文件:YJ1602.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的1602液晶
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012) #include <AVR_PQ1A.h> //包含自定义常量头文件
(0013)
(0014) #pragma data:code
(0015) const uchar CGRAM[LCDa_CGMAX] =
(0016) {
(0017) //8*5字模
(0018) 0x00,0x01,0x1F,0x11,0x1F,0x01,0x01,0x01, // 第1、2行显示"中"字
(0019) 0x00,0x00,0x1E,0x02,0x1E,0x00,0x00,0x00,
(0020) 0x00,0x01,0x1F,0x04,0x02,0x01,0x02,0x04, // 第3、4行显示"文"字
(0021) 0x00,0x00,0x1f,0x04,0x08,0x10,0x08,0x04,
(0022) 0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01, // 第5、6行显示心型
(0023) 0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,
(0024) 0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01, // 第7、8行显示心型
(0025) 0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,
(0026) };
(0027) #pragma data:data
(0028) /*******************************************
(0029) 函数名称: LCD1602_portini
(0030) 功 能: 初始化1602液晶用到的IO口
(0031) 参 数: 无
(0032) 返回值 : 无
(0033) /********************************************/
(0034) void LCD1602_portini(void)
(0035) {
(0036) LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
00D3 B381 IN R24,P11
00D4 6780 ORI R24,0x70
00D5 BB81 OUT P11,R24
(0037) LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
00D6 B387 IN R24,P17
00D7 6F8F ORI R24,0xFF
00D8 BB87 OUT P17,R24
(0038) }
00D9 9508 RET
_LCD1602_readbyte:
dByte --> R20
DatCmd --> R20
00DA 940E01C4 CALL push_gset1
00DC 2F40 MOV R20,R16
(0039) /*******************************************
(0040) 函数名称: LCD1602_readbyte
(0041) 功 能: 从1602液晶读出一个字节数据或者指令
(0042) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0043) 返回值 : dByte--读回的数据或者指令
(0044) /********************************************/
(0045) uchar LCD1602_readbyte(uchar DatCmd)
(0046) {
(0047) uchar dByte;
(0048) if (DatCmd == iCmd) //指令操作
00DD 2344 TST R20
00DE F411 BNE 0x00E1
(0049) LCDa_CLR_RS;
00DF 9894 CBI P12,4
00E0 C001 RJMP 0x00E2
(0050) else
(0051) LCDa_SET_RS;
00E1 9A94 SBI P12,4
(0052)
(0053) LCDa_SET_RW; //读操作
00E2 9A95 SBI P12,5
(0054) LCDa_SET_E;
00E3 9A96 SBI P12,6
(0055) LCDa_DATA_DDR=0x00; //数据总线定义为输入
00E4 2422 CLR R2
00E5 BA27 OUT P17,R2
(0056) dByte=LCDa_DI; //读数据或者指令
00E6 B346 IN R20,P16
(0057) Delayms(1); //时序调整
00E7 E001 LDI R16,1
00E8 E010 LDI R17,0
00E9 DFAD RCALL _Delayms
(0058) LCDa_CLR_E;
00EA 9896 CBI P12,6
(0059) LCDa_DATA_DDR|=0xff; //数据总线还原为输出
00EB B387 IN R24,P17
00EC 6F8F ORI R24,0xFF
00ED BB87 OUT P17,R24
(0060) return dByte;
00EE 2F04 MOV R16,R20
00EF 940E01C7 CALL pop_gset1
00F1 9508 RET
_LCD1602_sendbyte:
dByte --> R20
DatCmd --> R22
00F2 940E01DB CALL push_gset2
00F4 2F42 MOV R20,R18
00F5 2F60 MOV R22,R16
(0061) }
(0062) /*******************************************
(0063) 函数名称: LCD1602_sendbyte
(0064) 功 能: 向1602液晶写入一个字节数据或者指令
(0065) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0066) dByte--为写入1602的数据或者指令
(0067) 返回值 : 无
(0068) /********************************************/
(0069) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0070) {
(0071) if (DatCmd == iCmd) //指令操作
00F6 2366 TST R22
00F7 F411 BNE 0x00FA
(0072) LCDa_CLR_RS;
00F8 9894 CBI P12,4
00F9 C001 RJMP 0x00FB
(0073) else
(0074) LCDa_SET_RS;
00FA 9A94 SBI P12,4
(0075)
(0076) LCDa_CLR_RW; //写操作
00FB 9895 CBI P12,5
(0077) LCDa_SET_E;
00FC 9A96 SBI P12,6
(0078) LCDa_DO = dByte; //写入数据
00FD BB48 OUT P18,R20
(0079) Delayms(1);
00FE E001 LDI R16,1
00FF E010 LDI R17,0
0100 DF96 RCALL _Delayms
(0080) LCDa_CLR_E;
0101 9896 CBI P12,6
(0081) }
0102 940E01DF CALL pop_gset2
0104 9508 RET
_LCD1602_sendstr:
ptString --> R20
0105 940E01C4 CALL push_gset1
0107 01A8 MOVW R20,R16
(0082) /*******************************************
(0083) 函数名称: LCD1602_sendstr
(0084) 功 能: 向1602液晶写入一个字符串
(0085) 参 数: ptString--字符串指针
(0086) 返回值 : 无
(0087) /********************************************/
(0088) void LCD1602_sendstr(uchar *ptString)
(0089) {
0108 C005 RJMP 0x010E
(0090) while((*ptString)!='\0') //字符串未结束
(0091) {
(0092) LCD1602_sendbyte(iDat, *ptString++);
0109 01FA MOVW R30,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -