📄 pro.lst
字号:
__text_start:
__start:
005A E5CF LDI R28,0x5F
005B E0D4 LDI R29,4
005C BFCD OUT 0x3D,R28
005D BFDE OUT 0x3E,R29
005E 51C0 SUBI R28,0x10
005F 40D0 SBCI R29,0
0060 EA0A LDI R16,0xAA
0061 8308 STD Y+0,R16
0062 2400 CLR R0
0063 ECE0 LDI R30,0xC0
0064 E0F0 LDI R31,0
0065 E010 LDI R17,0
0066 3CEE CPI R30,0xCE
0067 07F1 CPC R31,R17
0068 F011 BEQ 0x006B
0069 9201 ST R0,Z+
006A CFFB RJMP 0x0066
006B 8300 STD Z+0,R16
006C E5E4 LDI R30,0x54
006D E0F0 LDI R31,0
006E E6A0 LDI R26,0x60
006F E0B0 LDI R27,0
0070 E010 LDI R17,0
0071 3BE4 CPI R30,0xB4
0072 07F1 CPC R31,R17
0073 F021 BEQ 0x0078
0074 95C8 LPM
0075 9631 ADIW R30,1
0076 920D ST R0,X+
0077 CFF9 RJMP 0x0071
0078 940E04F8 CALL _main
_exit:
007A CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
007B 940E064C CALL push_gset2
007D 01B8 MOVW R22,R16
FILE: E:\张秋伟\我的实验\数字频率计\LCD_PORT.h
(0001) #include <iom16v.h> //包含型号头文件
(0002) #include <macros.h> //包含"位"操作头文件
(0003)
(0004) /******************数据类型宏定义******************/
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007)
(0008) /*******************************************
(0009) 函数名称: Delayus
(0010) 功 能: 延时指定微秒(8M晶振)
(0011) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0012) 返回值 : 无
(0013) /********************************************/
(0014) void Delayus(uint US)
(0015) {
(0016) uint i;
(0017) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
007E E005 LDI R16,5
007F E010 LDI R17,0
0080 019B MOVW R18,R22
0081 940E0600 CALL empy16s
0083 01B8 MOVW R22,R16
0084 9576 LSR R23
0085 9567 ROR R22
0086 9576 LSR R23
0087 9567 ROR R22
(0018) for( i=0;i<US;i++);
0088 2744 CLR R20
0089 2755 CLR R21
008A C002 RJMP 0x008D
008B 5F4F SUBI R20,0xFF
008C 4F5F SBCI R21,0xFF
008D 1746 CP R20,R22
008E 0757 CPC R21,R23
008F F3D8 BCS 0x008B
0090 940E0640 CALL pop_gset2
0092 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
0093 940E064C CALL push_gset2
(0019) }
(0020) /*******************************************
(0021) 函数名称: Delayms
(0022) 功 能: 延时指定毫秒(8M晶振)
(0023) 参 数: MS--延时的毫秒数
(0024) 返回值 : 无
(0025) /********************************************/
(0026) void Delayms(uint MS)
(0027) {
(0028) uint i,j;
(0029) for( i=0;i<MS;i++)
0095 2744 CLR R20
0096 2755 CLR R21
0097 C00B RJMP 0x00A3
(0030) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0098 2766 CLR R22
0099 2777 CLR R23
009A C002 RJMP 0x009D
009B 5F6F SUBI R22,0xFF
009C 4F7F SBCI R23,0xFF
009D 3765 CPI R22,0x75
009E E0E4 LDI R30,4
009F 077E CPC R23,R30
00A0 F3D0 BCS 0x009B
00A1 5F4F SUBI R20,0xFF
00A2 4F5F SBCI R21,0xFF
00A3 1740 CP R20,R16
00A4 0751 CPC R21,R17
00A5 F390 BCS 0x0098
00A6 940E0640 CALL pop_gset2
00A8 9508 RET
FILE: E:\张秋伟\我的实验\数字频率计\12864.c
(0001) /*******************************************
(0002) 文件:12864.C
(0003) 环境:编译为ICC AVR6.31
(0004) ********************************************
(0005) 1 VSS -->接地
(0006) 2 VDD -->电源VCC
(0007) 3 V0 -->高电平
(0008) 4 RS(CS) --> PB4
(0009) 5 RW(STD)-->PB5
(0010) 6 E --> PB6
(0011) 7 ~~~14 -->PA0~~PA7 (输出数据总线)
(0012) 15 PSB-->VCC
(0013) 16 NC
(0014) 17 RST-->VCC
(0015) 18 NC
(0016) 19 LEDA -->VCC
(0017) 20 LEDB -->GND
(0018) /******************************************/
(0019) #include <iom16v.h> //包含型号头文件
(0020) #include <macros.h> //包含"位"操作头文件
(0021) #include "LCD_PORT.h" //包含自定义常量头文件
(0022)
(0023)
(0024) /*******************************************
(0025) 函数名称: LCD12864_portini
(0026) 功 能: 初始化12864液晶用到的IO口
(0027) 参 数: 无
(0028) 返回值 : 无
(0029) /********************************************/
(0030) void LCD12864_portini(void)
(0031) {
(0032) LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E)|BIT(LCDb_RST);//配置控制管脚为输出
_LCD12864_portini:
00A9 B387 IN R24,0x17
00AA 6F80 ORI R24,0xF0
00AB BB87 OUT 0x17,R24
(0033) LCDb_DATA_DDR |= 0xFF; //配置数据管脚为输出
00AC B38A IN R24,0x1A
00AD 6F8F ORI R24,0xFF
00AE BB8A OUT 0x1A,R24
(0034) LCDb_SET_RST; //不使能复位端
00AF 9AC7 SBI 0x18,7
00B0 9508 RET
_LCD12864_readbyte:
dByte --> R20
DatCmd --> R20
00B1 940E064E CALL push_gset1
00B3 2F40 MOV R20,R16
(0035) }
(0036) /*******************************************
(0037) 函数名称: LCD12864_readbyte
(0038) 功 能: 从12864液晶读出一个字节数据或者指令
(0039) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0040) 返回值 : dByte--读回的数据或者指令
(0041) /********************************************/
(0042) uchar LCD12864_readbyte(uchar DatCmd)
(0043) {
(0044) uchar dByte;
(0045) if (DatCmd == iCmd) //指令操作
00B4 2344 TST R20
00B5 F411 BNE 0x00B8
(0046) LCDb_CLR_RS;
00B6 98C4 CBI 0x18,4
00B7 C001 RJMP 0x00B9
(0047) else
(0048) LCDb_SET_RS;
00B8 9AC4 SBI 0x18,4
(0049)
(0050) LCDb_SET_RW; //读操作
00B9 9AC5 SBI 0x18,5
(0051) LCDb_SET_E;
00BA 9AC6 SBI 0x18,6
(0052) LCDb_DATA_DDR=0x00; //数据总线定义为输入
00BB 2422 CLR R2
00BC BA2A OUT 0x1A,R2
(0053) dByte=LCDb_DI; //读数据或者指令
00BD B349 IN R20,0x19
(0054) Delayms(1); //时序调整
00BE E001 LDI R16,1
00BF E010 LDI R17,0
00C0 DFD2 RCALL _Delayms
(0055) LCDb_CLR_E;
00C1 98C6 CBI 0x18,6
(0056) LCDb_DATA_DDR|=0xff; //数据总线还原为输出
00C2 B38A IN R24,0x1A
00C3 6F8F ORI R24,0xFF
00C4 BB8A OUT 0x1A,R24
(0057) return dByte;
00C5 2F04 MOV R16,R20
00C6 940E0651 CALL pop_gset1
00C8 9508 RET
_LCD12864_sendbyte:
dByte --> R20
DatCmd --> R22
00C9 940E064C CALL push_gset2
00CB 2F42 MOV R20,R18
00CC 2F60 MOV R22,R16
(0058) }
(0059) /*******************************************
(0060) 函数名称: LCD12864_sendbyte
(0061) 功 能: 向12864液晶写入一个字节数据或者指令
(0062) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0063) dByte--为写入12864的数据或者指令
(0064) 返回值 : 无
(0065) /********************************************/
(0066) void LCD12864_sendbyte(uchar DatCmd, uchar dByte)
(0067) {
(0068) if (DatCmd == iCmd) //指令操作
00CD 2366 TST R22
00CE F411 BNE 0x00D1
(0069) LCDb_CLR_RS;
00CF 98C4 CBI 0x18,4
00D0 C001 RJMP 0x00D2
(0070) else
(0071) LCDb_SET_RS;
00D1 9AC4 SBI 0x18,4
(0072)
(0073) LCDb_CLR_RW; //写操作
00D2 98C5 CBI 0x18,5
(0074) LCDb_SET_E;
00D3 9AC6 SBI 0x18,6
(0075) LCDb_DO = dByte; //写入数据
00D4 BB4B OUT 0x1B,R20
(0076) Delayus(100);
00D5 E604 LDI R16,0x64
00D6 E010 LDI R17,0
00D7 DFA3 RCALL _Delayus
(0077) LCDb_CLR_E;
00D8 98C6 CBI 0x18,6
00D9 940E0640 CALL pop_gset2
00DB 9508 RET
_LCD12864_sendstr:
ptString --> R20
00DC 940E064E CALL push_gset1
00DE 01A8 MOVW R20,R16
(0078) }
(0079) /*******************************************
(0080) 函数名称: LCD12864_sendstr
(0081) 功 能: 向12864液晶写入一个字符串
(0082) 参 数: ptString--字符串指针
(0083) 返回值 : 无
(0084) /********************************************/
(0085) void LCD12864_sendstr(uchar *ptString)
(0086) {
00DF C005 RJMP 0x00E5
(0087) while((*ptString)!='\0') //字符串未结束一直写
(0088) {
(0089) LCD12864_sendbyte(iDat, *ptString++);
00E0 01FA MOVW R30,R20
00E1 9121 LD R18,Z+
00E2 01AF MOVW R20,R30
00E3 E001 LDI R16,1
00E4 DFE4 RCALL _LCD12864_sendbyte
00E5 01FA MOVW R30,R20
00E6 8020 LDD R2,Z+0
00E7 2022 TST R2
00E8 F7B9 BNE 0x00E0
00E9 940E0651 CALL pop_gset1
00EB 9508 RET
(0090) }
(0091) }
(0092) /*******************************************
(0093) 函数名称: LCD12864_clear
(0094) 功 能: 12864液晶清屏
(0095) 参 数: 无
(0096) 返回值 : 无
(0097) /********************************************/
(0098) void LCD12864_clear(void)
(0099) {
(0100) LCD12864_sendbyte(iCmd,LCDb_CLS);
_LCD12864_clear:
00EC E021 LDI R18,1
00ED 2700 CLR R16
00EE DFDA RCALL _LCD12864_sendbyte
(0101) Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
00EF E002 LDI R16,2
00F0 E010 LDI R17,0
00F1 DFA1 RCALL _Delayms
00F2 9508 RET
_LCD12864_readBF:
busy --> R20
00F3 940E064E CALL push_gset1
(0102) }
(0103) /*******************************************
(0104) 函数名称: LCD12864_readBF
(0105) 功 能: 12864液晶清屏
(0106) 参 数: 无
(0107) 返回值 : busy--为1时忙,为0时可以接收指令
(0108) /********************************************/
(0109) uchar LCD12864_readBF(void)
(0110) {
(0111) uchar busy;
(0112) busy=LCD12864_readbyte(iCmd); //读回BF标志和地址
00F5 2700 CLR R16
00F6 DFBA RCALL _LCD12864_readbyte
00F7 2F40 MOV R20,R16
(0113) if(busy&0x80) //如果忙,返回忙状态
00F8 FF07 SBRS R16,7
00F9 C002 RJMP 0x00FC
(0114) busy=1;
00FA E041 LDI R20,1
00FB C001 RJMP 0x00FD
(0115) else //不忙,可以写入
(0116) busy=0;
00FC 2744 CLR R20
(0117) return busy;
00FD 2F04 MOV R16,R20
00FE 940E0651 CALL pop_gset1
0100 9508 RET
_LCD12864_gotoXY:
Col --> R20
Row --> R22
0101 940E064C CALL push_gset2
0103 2F42 MOV R20,R18
0104 2F60 MOV R22,R16
(0118) }
(0119) /*******************************************
(0120) 函数名称: LCD12864_gotoXY
(0121) 功 能: 移动到指定位置
(0122) 参 数: Row--指定的行
(0123) Col--指定的列
(0124) 返回值 : 无
(0125) /********************************************/
(0126) void LCD12864_gotoXY(uchar Row, uchar Col)
(0127) {
(0128) switch (Row) //选择行
0105 2777 CLR R23
0106 3062 CPI R22,2
0107 E0E0 LDI R30,0
0108 077E CPC R23,R30
0109 F049 BEQ 0x0113
010A 3063 CPI R22,3
010B E0E0 LDI R30,0
010C 077E CPC R23,R30
010D F051 BEQ 0x0118
010E 3064 CPI R22,4
010F E0E0 LDI R30,0
0110 077E CPC R23,R30
0111 F059 BEQ 0x011D
0112 C00F RJMP 0x0122
(0129) {
(0130) case 2:
(0131) LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //写入第2行的指定列
0113 2F24 MOV R18,R20
0114 5720 SUBI R18,0x70
0115 2700 CLR R16
0116 DFB2 RCALL _LCD12864_sendbyte
0117 C00E RJMP 0x0126
(0132) case 3:
(0133) LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //写入第3行的指定列
0118 2F24 MOV R18,R20
0119 5728 SUBI R18,0x78
011A 2700 CLR R16
011B DFAD RCALL _LCD12864_sendbyte
011C C009 RJMP 0x0126
(0134) case 4:
(0135) LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //写入第4行的指定列
011D 2F24 MOV R18,R20
011E 5628 SUBI R18,0x68
011F 2700 CLR R16
0120 DFA8 RCALL _LCD12864_sendbyte
0121 C004 RJMP 0x0126
(0136) default:
(0137) LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //写入第1行的指定列
0122 2F24 MOV R18,R20
0123 5820 SUBI R18,0x80
0124 2700 CLR R16
0125 DFA3 RCALL _LCD12864_sendbyte
0126 940E0640 CALL pop_gset2
0128 9508 RET
(0138) }
(0139) }
(0140) /*******************************************
(0141) 函数名称: LCD12864_initial
(0142) 功 能: 12864液晶初始化
(0143) 参 数: 无
(0144) 返回值 : 无
(0145) /********************************************/
(0146) void LCD12864_initial(void)
(0147) {
(0148) Delayms(100); // 等待内部复位
_LCD12864_initial:
0129 E604 LDI R16,0x64
012A E010 LDI R17,0
012B DF67 RCALL _Delayms
(0149) LCD12864_portini(); //端口初始化
012C DF7C RCALL _LCD12864_portini
(0150)
(0151) LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式设定
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -