📄 new_disp.lst
字号:
__text_start:
__start:
0020 EFCF LDI R28,0xFF
0021 E0D4 LDI R29,4
0022 BFCD OUT 0x3D,R28
0023 BFDE OUT 0x3E,R29
0024 51C0 SUBI R28,0x10
0025 40D0 SBCI R29,0
0026 EA0A LDI R16,0xAA
0027 8308 STD Y+0,R16
0028 2400 CLR R0
0029 E0E0 LDI R30,0
002A E0F1 LDI R31,1
002B E011 LDI R17,1
002C 30E0 CPI R30,0
002D 07F1 CPC R31,R17
002E F011 BEQ 0x0031
002F 9201 ST R0,Z+
0030 CFFB RJMP 0x002C
0031 8300 STD Z+0,R16
0032 E3EF LDI R30,0x3F
0033 E0F0 LDI R31,0
0034 E0A0 LDI R26,0
0035 E0B1 LDI R27,1
0036 E010 LDI R17,0
0037 33EF CPI R30,0x3F
0038 07F1 CPC R31,R17
0039 F021 BEQ 0x003E
003A 95C8 LPM
003B 9631 ADIW R30,1
003C 920D ST R0,X+
003D CFF9 RJMP 0x0037
003E D0D0 RCALL _main
_exit:
003F CFFF RJMP _exit
FILE: D:\avr\avr_program\disp_88i\new_disp.c
(0001) #include "iom88v.h"
(0002)
(0003) #define SS PB2
(0004) #define MOSI PB3
(0005) #define SCK PB5
(0006)
(0007) #define _asm asm
(0008) #define WDR() asm("wdr")
(0009) #define SEI() asm("sei")
(0010) #define CLI() asm("cli")
(0011)
(0012) #define a1 0x04
(0013) #define a2 0x0c
(0014) #define a3 0x14
(0015) #define a4 0x1c
(0016) #define a5 0x24
(0017) #define a6 0x2c
(0018) #define a7 0x34
(0019) #define a8 0x3c
(0020) #define a9 0x44
(0021)
(0022) const char S[11]={0xaf,0x06,0x6d,0x4f,0xc6,0xcb,0xeb,0x0e,0xef,0xcf,0x00};
(0023)
(0024) void port_init(void)//口方向设置
(0025) {
(0026) DDRB = 0xff;
_port_init:
0040 EF8F LDI R24,0xFF
0041 B984 OUT 0x04,R24
(0027) DDRC = 0X00;
0042 2422 CLR R2
0043 B827 OUT 0x07,R2
(0028) PORTC=0xff;
0044 B988 OUT 0x08,R24
(0029) DDRD = 0x00;
0045 B82A OUT 0x0A,R2
(0030) PORTD=0xff;
0046 B98B OUT 0x0B,R24
0047 9508 RET
(0031) }
(0032) void delay_us(int time)//微秒级延时程序
(0033) {
(0034) do
(0035) {
(0036) time--;
_delay_us:
time --> R16
0048 5001 SUBI R16,1
0049 4010 SBCI R17,0
(0037) }
(0038) while (time>1);
004A E081 LDI R24,1
004B E090 LDI R25,0
004C 1780 CP R24,R16
004D 0791 CPC R25,R17
004E F3CC BLT 0x0048
004F 9508 RET
_delay_ms:
time --> R10
0050 D0DD RCALL push_gset3x
0051 0158 MOVW R10,R16
(0039) }
(0040) void delay_ms(unsigned int time)//毫秒级延时程序
(0041) {
0052 C006 RJMP 0x0059
(0042) while(time!=0)
(0043) {
(0044) delay_us(1000);
0053 EE08 LDI R16,0xE8
0054 E013 LDI R17,3
0055 DFF2 RCALL _delay_us
(0045) time--;
0056 01C5 MOVW R24,R10
0057 9701 SBIW R24,1
0058 015C MOVW R10,R24
0059 20AA TST R10
005A F7C1 BNE 0x0053
005B 20BB TST R11
005C F7B1 BNE 0x0053
005D D0C2 RCALL pop_gset3x
005E 9508 RET
_SendBit:
i --> R10
bitcnt --> R12
dat --> R14
005F D0D4 RCALL push_gset5x
0060 2EC2 MOV R12,R18
0061 2EE0 MOV R14,R16
(0046) }
(0047) }/*
(0048) void Delay()
(0049) {
(0050) unsigned char i;
(0051) for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
(0052) //}
(0053) void SendBit(unsigned char dat,unsigned char bitcnt)
(0054) {
(0055) unsigned char i;
(0056) CLI();
0062 94F8 BCLR 7
(0057) for(i=0;i<bitcnt;i++)
0063 24AA CLR R10
0064 C00F RJMP 0x0074
(0058) {
(0059) if(( dat & 0X80 ) == 0)
0065 FCE7 SBRC R14,7
0066 C002 RJMP 0x0069
(0060) PORTB &=(~(1<<MOSI));
0067 982B CBI 0x05,3
0068 C001 RJMP 0x006A
(0061) else
(0062) PORTB |=(1<<MOSI); /*发送数据由高位到低位传送*/
0069 9A2B SBI 0x05,3
(0063) //Delay();
(0064) delay_us(10);
006A E00A LDI R16,0xA
006B E010 LDI R17,0
006C DFDB RCALL _delay_us
(0065) PORTB |=(1<<SCK); /*置时钟线为高通知被控器开始接收数位*/
006D 9A2D SBI 0x05,5
(0066) //Delay();
(0067) delay_us(10);
006E E00A LDI R16,0xA
006F E010 LDI R17,0
0070 DFD7 RCALL _delay_us
(0068) PORTB &=(~(1<<SCK)); /*钳住总线准备下一个数据位*/
0071 982D CBI 0x05,5
(0069) dat=dat<<1; /*发送数据左移一位*/
0072 0CEE LSL R14
0073 94A3 INC R10
0074 14AC CP R10,R12
0075 F378 BCS 0x0065
(0070) }
(0071) SEI();
0076 9478 BSET 7
0077 D0B4 RCALL pop_gset5x
0078 9508 RET
(0072) }
(0073)
(0074) void Start_spi()
(0075) {
(0076) PORTB |=(1<<SS);
_Start_spi:
0079 9A2A SBI 0x05,2
(0077) PORTB |=(1<<SCK);
007A 9A2D SBI 0x05,5
(0078) PORTB |=(1<<MOSI);
007B 9A2B SBI 0x05,3
(0079) //Delay();
(0080) delay_us(10);
007C E00A LDI R16,0xA
007D E010 LDI R17,0
007E DFC9 RCALL _delay_us
(0081) PORTB &=(~(1<<SS));PORTB &=(~(1<<SS));
007F 982A CBI 0x05,2
0080 982A CBI 0x05,2
(0082) PORTB &=(~(1<<SCK));PORTB &=(~(1<<SCK));
0081 982D CBI 0x05,5
0082 982D CBI 0x05,5
0083 9508 RET
_SendByte:
dat --> R10
0084 D0A9 RCALL push_gset3x
0085 2EA0 MOV R10,R16
(0083) }
(0084)
(0085) void SendByte(unsigned char dat)
(0086) {
(0087) SendBit(dat,8); /*发送字节*/
0086 E028 LDI R18,0x8
0087 2D0A MOV R16,R10
0088 DFD6 RCALL _SendBit
0089 D096 RCALL pop_gset3x
008A 9508 RET
_SENDCOMA:
com --> R10
008B D0A2 RCALL push_gset3x
008C 2EA0 MOV R10,R16
(0088) }
(0089)
(0090) void SENDCOMA(unsigned char com)
(0091) {
(0092) Start_spi();
008D DFEB RCALL _Start_spi
(0093) SendBit(0X80,4); //*发送设置命令ID=100 0*
008E E024 LDI R18,4
008F E800 LDI R16,0x80
0090 DFCE RCALL _SendBit
(0094) SendByte(com); //*发送命令字*
0091 2D0A MOV R16,R10
0092 DFF1 RCALL _SendByte
0093 D08C RCALL pop_gset3x
0094 9508 RET
_SENDCOMB:
adr --> R10
0095 D098 RCALL push_gset3x
0096 2EA0 MOV R10,R16
(0095) }
(0096)
(0097) void SENDCOMB(unsigned char adr)
(0098) {
(0099) Start_spi();
0097 DFE1 RCALL _Start_spi
(0100) SendBit(0XA0,3); /*发送写显示RAM 命令ID=101 */
0098 E023 LDI R18,3
0099 EA00 LDI R16,0xA0
009A DFC4 RCALL _SendBit
(0101) SendBit(adr,6); /*指定写入地址*/
009B E026 LDI R18,6
009C 2D0A MOV R16,R10
009D DFC1 RCALL _SendBit
009E D081 RCALL pop_gset3x
009F 9508 RET
_disp_init:
i --> R10
00A0 D08D RCALL push_gset3x
(0102) }
(0103) void disp_init(void)
(0104) {
(0105) unsigned char i;
(0106) SENDCOMA(0X0a); /*禁止WDT溢出标志输出*/
00A1 E00A LDI R16,0xA
00A2 DFE8 RCALL _SENDCOMA
(0107) SENDCOMA(0X52); //设置偏压,背极数 定义1/3 偏压4背极
00A3 E502 LDI R16,0x52
00A4 DFE6 RCALL _SENDCOMA
(0108) SENDCOMA(0X30); //*使用内部256KRC 振荡器*
00A5 E300 LDI R16,0x30
00A6 DFE4 RCALL _SENDCOMA
(0109) SENDCOMA(0X02); //*启动振荡器*
00A7 E002 LDI R16,2
00A8 DFE2 RCALL _SENDCOMA
(0110) SENDCOMA(0X06); //LCDON
00A9 E006 LDI R16,6
00AA DFE0 RCALL _SENDCOMA
(0111) SENDCOMA(0X08);//timer dis
00AB E008 LDI R16,0x8
00AC DFDE RCALL _SENDCOMA
(0112) SENDCOMB(0x00); //*把数据指针指回0 接着写入数据*
00AD 2700 CLR R16
00AE DFE6 RCALL _SENDCOMB
(0113) for(i=0;i<15;i++) /*写入16 字节数据*/
00AF 24AA CLR R10
00B0 C003 RJMP 0x00B4
(0114) {
(0115) SendByte(0x0); /*写入数据*/
00B1 2700 CLR R16
00B2 DFD1 RCALL _SendByte
00B3 94A3 INC R10
00B4 2D8A MOV R24,R10
00B5 308F CPI R24,0xF
00B6 F3D0 BCS 0x00B1
00B7 D068 RCALL pop_gset3x
00B8 9508 RET
(0116) }
(0117) }
(0118) void disp_off(void)
(0119) {
(0120) SENDCOMA(0X04);//lcdoff
_disp_off:
00B9 E004 LDI R16,4
00BA DFD0 RCALL _SENDCOMA
(0121) SENDCOMA(0X00);//sys dis
00BB 2700 CLR R16
00BC DFCE RCALL _SENDCOMA
00BD 9508 RET
_disp:
dat --> R10
add --> R12
00BE D075 RCALL push_gset5x
00BF 2EA2 MOV R10,R18
00C0 2EC0 MOV R12,R16
(0122) //SENDCOMA(0X0c);//timer en
(0123) }
(0124) void disp(char add,char dat)
(0125) {
(0126) switch(add)
00C1 2CEC MOV R14,R12
00C2 24FF CLR R15
00C3 01C7 MOVW R24,R14
00C4 3081 CPI R24,1
00C5 E0E0 LDI R30,0
00C6 079E CPC R25,R30
00C7 F109 BEQ 0x00E9
00C8 3082 CPI R24,2
00C9 E0E0 LDI R30,0
00CA 079E CPC R25,R30
00CB F101 BEQ 0x00EC
00CC 3083 CPI R24,3
00CD E0E0 LDI R30,0
00CE 079E CPC R25,R30
00CF F0F9 BEQ 0x00EF
00D0 3084 CPI R24,4
00D1 E0E0 LDI R30,0
00D2 079E CPC R25,R30
00D3 F0F1 BEQ 0x00F2
00D4 3085 CPI R24,5
00D5 E0E0 LDI R30,0
00D6 079E CPC R25,R30
00D7 F0E9 BEQ 0x00F5
00D8 3086 CPI R24,6
00D9 E0E0 LDI R30,0
00DA 079E CPC R25,R30
00DB F0E1 BEQ 0x00F8
00DC 3087 CPI R24,7
00DD E0E0 LDI R30,0
00DE 079E CPC R25,R30
00DF F0D9 BEQ 0x00FB
00E0 3088 CPI R24,0x8
00E1 E0E0 LDI R30,0
00E2 079E CPC R25,R30
00E3 F0D1 BEQ 0x00FE
00E4 3089 CPI R24,0x9
00E5 E0E0 LDI R30,0
00E6 079E CPC R25,R30
00E7 F0C9 BEQ 0x0101
00E8 C01A RJMP 0x0103
(0127) {
(0128) case 1: add=a1;break;
00E9 E084 LDI R24,4
00EA 2EC8 MOV R12,R24
00EB C017 RJMP 0x0103
(0129) case 2: add=a2;break;
00EC E08C LDI R24,0xC
00ED 2EC8 MOV R12,R24
00EE C014 RJMP 0x0103
(0130) case 3: add=a3;break;
00EF E184 LDI R24,0x14
00F0 2EC8 MOV R12,R24
00F1 C011 RJMP 0x0103
(0131) case 4: add=a4;break;
00F2 E18C LDI R24,0x1C
00F3 2EC8 MOV R12,R24
00F4 C00E RJMP 0x0103
(0132) case 5: add=a5;break;
00F5 E284 LDI R24,0x24
00F6 2EC8 MOV R12,R24
00F7 C00B RJMP 0x0103
(0133) case 6: add=a6;break;
00F8 E28C LDI R24,0x2C
00F9 2EC8 MOV R12,R24
00FA C008 RJMP 0x0103
(0134) case 7: add=a7;break;
00FB E384 LDI R24,0x34
00FC 2EC8 MOV R12,R24
00FD C005 RJMP 0x0103
(0135) case 8: add=a8;break;
00FE E38C LDI R24,0x3C
00FF 2EC8 MOV R12,R24
0100 C002 RJMP 0x0103
(0136) case 9: add=a9;break;
0101 E484 LDI R24,0x44
0102 2EC8 MOV R12,R24
(0137) }
(0138) SENDCOMB(add); //write address
0103 2D0C MOV R16,R12
0104 DF90 RCALL _SENDCOMB
(0139) SendByte(S[dat]); //write data
0105 E384 LDI R24,0x34
0106 E090 LDI R25,0
0107 2DEA MOV R30,R10
0108 27FF CLR R31
0109 0FE8 ADD R30,R24
010A 1FF9 ADC R31,R25
010B 9104 LPM R16,0(Z)
010C DF77 RCALL _SendByte
010D D01E RCALL pop_gset5x
010E 9508 RET
(0140) //SendByte(S[dat]); //write data
(0141) }
(0142) void main(void)
(0143) {
(0144) char i,j;
(0145) port_init();
_main:
j --> R10
i --> R12
010F DF30 RCALL _port_init
(0146) disp_init();
0110 DF8F RCALL _disp_init
(0147) for(i=1,j=1;i<10;i++,j++) disp(i,j);
0111 24CC CLR R12
0112 94C3 INC R12
0113 24AA CLR R10
0114 94A3 INC R10
0115 C005 RJMP 0x011B
0116 2D2A MOV R18,R10
0117 2D0C MOV R16,R12
0118 DFA5 RCALL _disp
0119 94C3 INC R12
011A 94A3 INC R10
011B 2D8C MOV R24,R12
011C 308A CPI R24,0xA
011D F3C0 BCS 0x0116
(0148) //disp(2,3);
(0149) while(1);
FILE: <library>
011E CFFF RJMP 0x011E
011F 9508 RET
pop_gset3x:
0120 E0E4 LDI R30,4
popx:
0121 90A9 LD R10,Y+
0122 90B9 LD R11,Y+
0123 FDE2 SBRC R30,2
0124 9508 RET
0125 90C9 LD R12,Y+
0126 90D9 LD R13,Y+
0127 FDE3 SBRC R30,3
0128 9508 RET
0129 90E9 LD R14,Y+
012A 90F9 LD R15,Y+
012B 9508 RET
pop_gset5x:
012C 27EE CLR R30
012D CFF3 RJMP popx
push_gset3x:
012E 92BA ST R11,-Y
012F 92AA ST R10,-Y
0130 9508 RET
push_gset4x:
0131 92DA ST R13,-Y
0132 92CA ST R12,-Y
0133 CFFA RJMP push_gset3x
push_gset5x:
0134 92FA ST R15,-Y
0135 92EA ST R14,-Y
0136 CFFA RJMP push_gset4x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -