📄 bjdj_4.lst
字号:
(0185) arr++;
0138 5F6F SUBI R22,0xFF
0139 4F7F SBCI R23,0xFF
013A 9543 INC R20
013B 2D8A MOV R24,R10
013C 5081 SUBI R24,1
013D 1784 CP R24,R20
013E F7A8 BCC 0x0134
(0186) }
(0187) *arr= TWI_readB(0);
013F 2700 CLR R16
0140 DF79 RCALL _TWI_readB
0141 01FB MOVW R30,R22
0142 8300 STD R16,0+Z
(0188) TWI_stop();
0143 DF5C RCALL _TWI_stop
(0189) }
0144 940E040C CALL pop_gset4
0146 9508 RET
_ZLG7290_WriteReg:
dat --> Y+6
dat --> Y+6
RegAddr --> R20
0147 933A ST R19,-Y
0148 932A ST R18,-Y
0149 940E03DF CALL push_gset1
014B 2F40 MOV R20,R16
014C 9724 SBIW R28,4
FILE: E:\重新整理的文件\控制类\步进电机\程序\avr\zlg7290.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <stdio.h>
(0005) #include "TWI.C"
(0006) #include "zlg7290.h"
(0007)
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010)
(0011)
(0012) /*
(0013) 函数:ZLG7290_WriteReg()
(0014) 功能:向ZLG7290的某个内部寄存器写入数据
(0015) 参数:
(0016) RegAddr:ZLG7290的内部寄存器地址
(0017) dat:要写入的数据
(0018) 返回:
(0019) 1:正常
(0020) 0:访问ZLG7290时出现异常
(0021) */
(0022) void ZLG7290_WriteReg(uchar RegAddr, uchar dat)
(0023) {
(0024) TWI_write(ZLG7290_I2C_ADDR,RegAddr,1,&dat);
014D 01CE MOVW R24,R28
014E 9606 ADIW R24,6
014F 838A STD R24,2+Y
0150 839B STD R25,3+Y
0151 E081 LDI R24,1
0152 8388 STD R24,0+Y
0153 2F24 MOV R18,R20
0154 E700 LDI R16,0x70
0155 DF91 RCALL _TWI_write
(0025) }
0156 9624 ADIW R28,4
0157 940E03E2 CALL pop_gset1
0159 9622 ADIW R28,2
015A 9508 RET
_ZLG7290_ReadReg:
dat --> R22
RegAddr --> R20
015B 940E03F6 CALL push_gset2
015D 01B9 MOVW R22,R18
015E 2F40 MOV R20,R16
015F 9724 SBIW R28,4
(0026)
(0027) /*
(0028) 函数:ZLG7290_ReadReg()
(0029) 功能:从ZLG7290的某个内部寄存器读出数据
(0030) 参数:
(0031) RegAddr:ZLG7290的内部寄存器地址
(0032) *dat:保存读出的数据
(0033) 返回:
(0034) 1:正常
(0035) 0:访问ZLG7290时出现异常
(0036) */
(0037) void ZLG7290_ReadReg(uchar RegAddr, uchar *dat)
(0038) {
(0039) TWI_read(ZLG7290_I2C_ADDR,RegAddr,1,dat);
0160 836A STD R22,2+Y
0161 837B STD R23,3+Y
0162 E081 LDI R24,1
0163 8388 STD R24,0+Y
0164 2F24 MOV R18,R20
0165 E700 LDI R16,0x70
0166 DFBB RCALL _TWI_read
(0040) }
0167 9624 ADIW R28,4
0168 940E0406 CALL pop_gset2
016A 9508 RET
_ZLG7290_cmd:
buf --> Y+4
cmd1 --> R20
cmd0 --> R22
016B 940E03F6 CALL push_gset2
016D 2F42 MOV R20,R18
016E 2F60 MOV R22,R16
016F 9726 SBIW R28,6
(0041)
(0042) /*
(0043) 函数:ZLG7290_cmd()
(0044) 功能:向ZLG7290发送控制命令
(0045) 参数:
(0046) cmd0:写入CmdBuf0寄存器的命令字(第1字节)
(0047) cmd1:写入CmdBuf1寄存器的命令字(第2字节)
(0048) 返回:
(0049) 1:正常
(0050) 0:访问ZLG7290时出现异常
(0051) */
(0052) void ZLG7290_cmd(uchar cmd0, uchar cmd1)
(0053) {
(0054) uchar buf[2];
(0055) buf[0] = cmd0;
0170 836C STD R22,4+Y
(0056) buf[1] = cmd1;
0171 834D STD R20,5+Y
(0057) TWI_write(ZLG7290_I2C_ADDR,ZLG7290_CmdBuf,2,buf);
0172 01CE MOVW R24,R28
0173 9604 ADIW R24,4
0174 838A STD R24,2+Y
0175 839B STD R25,3+Y
0176 E082 LDI R24,2
0177 8388 STD R24,0+Y
0178 E027 LDI R18,7
0179 E700 LDI R16,0x70
017A DF6C RCALL _TWI_write
(0058) }
017B 9626 ADIW R28,6
017C 940E0406 CALL pop_gset2
017E 9508 RET
_ZLG7290_SegOnOff:
cmd --> R20
b --> R22
seg --> R20
017F 940E03F6 CALL push_gset2
0181 2F62 MOV R22,R18
0182 2F40 MOV R20,R16
(0059)
(0060) /*
(0061) 函数:ZLG7290_SegOnOff()
(0062) 功能:段寻址,单独点亮或熄灭数码管(或LED)中的某一段
(0063) 参数:
(0064) seg:取值0~63,表示数码管(或LED)的段号
(0065) b:0表示熄灭,1表示点亮
(0066) 返回:
(0067) 1:正常
(0068) 0:访问ZLG7290时出现异常
(0069) 说明:
(0070) 在每一位数码管中,段号顺序按照“a,b,c,d,e,f,g,dp”进行
(0071) */
(0072) void ZLG7290_SegOnOff(uchar seg, uchar b)
(0073) {
(0074) uchar cmd;
(0075) cmd = seg & 0x3F;
0183 734F ANDI R20,0x3F
(0076) if ( b ) cmd |= 0x80;
0184 2366 TST R22
0185 F009 BEQ 0x0187
0186 6840 ORI R20,0x80
(0077) ZLG7290_cmd(0x01,cmd);
0187 2F24 MOV R18,R20
0188 E001 LDI R16,1
0189 DFE1 RCALL _ZLG7290_cmd
(0078) }
018A 940E0406 CALL pop_gset2
018C 9508 RET
_ZLG7290_Download:
cmd1 --> R22
cmd0 --> R20
dat --> Y+8
f --> Y+6
dp --> R10
addr --> R20
018D 940E03FA CALL push_gset3
018F 2EA2 MOV R10,R18
0190 2F40 MOV R20,R16
(0079) /*
(0080) 函数:ZLG7290_Download()
(0081) 功能:下载数据并译码
(0082) 参数:
(0083) addr:取值0~7,显示缓存DpRam0~DpRam7的编号
(0084) dp:是否点亮该位的小数点,0-熄灭,1-点亮
(0085) flash:控制该位是否闪烁,0-不闪烁,1-闪烁
(0086) dat:取值0~31,表示要显示的数据
(0087) 返回:
(0088) 1:正常
(0089) 0:访问ZLG7290时出现异常
(0090) 说明:
(0091) 显示数据具体的译码方式请参见ZLG7290的数据手册
(0092) */
(0093) void ZLG7290_Download(uchar addr, uchar dp, uchar f, uchar dat)
(0094) {
(0095) uchar cmd0;
(0096) uchar cmd1;
(0097) cmd0 = addr & 0x0F;
0191 704F ANDI R20,0xF
(0098) cmd0 |= 0x60;
0192 6640 ORI R20,0x60
(0099) cmd1 = dat & 0x1F;
0193 8568 LDD R22,8+Y
0194 716F ANDI R22,0x1F
(0100) if ( dp==1 ) cmd1 |= 0x80;
0195 2D8A MOV R24,R10
0196 3081 CPI R24,1
0197 F409 BNE 0x0199
0198 6860 ORI R22,0x80
(0101) if ( f==1 ) cmd1 |= 0x40;
0199 818E LDD R24,6+Y
019A 3081 CPI R24,1
019B F409 BNE 0x019D
019C 6460 ORI R22,0x40
(0102) ZLG7290_cmd(cmd0,cmd1);
019D 2F26 MOV R18,R22
019E 2F04 MOV R16,R20
019F DFCB RCALL _ZLG7290_cmd
(0103) }
01A0 940E0409 CALL pop_gset3
01A2 9508 RET
FILE: E:\重新整理的文件\控制类\步进电机\程序\avr\zlg7290_avr.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <stdio.h> //标准输入输出头文件
(0005) #include "zlg7290.c"
(0006)
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) #pragma interrupt_handler extint0:9
(0010) //#pragma interrupt_handler miao:15
(0011)
(0012) uint FlagINT = 0,flag=0;
(0013)
(0014) /*
(0015) 函数:interrupt_init()
(0016) 功能:ZLG7290键盘中断服务初始化程序
(0017) */
(0018) void interrupt_init(void)
(0019) {
(0020) SEI(); //使能全局中断
_interrupt_init:
01A3 9478 BSET 7
(0021) EIMSK=0x80; //使能外部中断7
01A4 E880 LDI R24,0x80
01A5 BF89 OUT P39,R24
(0022) EICRB=0x80; //外部中断7采用下降沿触发
01A6 BF8A OUT P3A,R24
(0023) DDRE&=~0x80; //配置中断管脚为输入
01A7 9817 CBI P02,7
(0024) PORTE|=BIT(PE7); //使能中断管脚的上拉
01A8 9A1F SBI P03,7
(0025) }
01A9 9508 RET
_extint0:
01AA 938A ST R24,-Y
01AB 939A ST R25,-Y
01AC B78F IN R24,P3F
01AD 938A ST R24,-Y
(0026) /*
(0027) 函数:extint0()
(0028) 功能:ZLG7290键盘中断服务程序
(0029) 说明:中断触发方式选择负边沿触发,因此不必等待中断请求信号恢复为高电平
(0030) */
(0031) void extint0(void)
(0032) {
(0033) FlagINT = 1;
01AE E081 LDI R24,1
01AF E090 LDI R25,0
01B0 93900111 STS R25,0x111
01B2 93800110 STS R24,0x110
(0034) }
01B4 9189 LD R24,Y+
01B5 BF8F OUT P3F,R24
01B6 9199 LD R25,Y+
01B7 9189 LD R24,Y+
01B8 9518 RETI
_delay1:
x --> R20
y --> R22
t --> R16
01B9 940E03F6 CALL push_gset2
(0035) /*
(0036) 函数:delay1()
(0037) 功能:延时10ms~655.36s
(0038) 参数:
(0039) t>0时,延时(t*0.01)s
(0040) t=0时,延时655.36s
(0041) 说明:
(0042) 晶振采用8.31MHz
(0043) */
(0044) void delay1(uint t)
(0045) {
(0046) uint x,y;
(0047) for(x=t;x>0;x--)
01BB 01A8 MOVW R20,R16
01BC C00A RJMP 0x01C7
(0048) for(y=2400;y>0;y--);
01BD E660 LDI R22,0x60
01BE E079 LDI R23,0x9
01BF C002 RJMP 0x01C2
01C0 5061 SUBI R22,1
01C1 4070 SBCI R23,0
01C2 3060 CPI R22,0
01C3 0767 CPC R22,R23
01C4 F7D9 BNE 0x01C0
01C5 5041 SUBI R20,1
01C6 4050 SBCI R21,0
01C7 3040 CPI R20,0
01C8 0745 CPC R20,R21
01C9 F799 BNE 0x01BD
(0049) }
01CA 940E0406 CALL pop_gset2
01CC 9508 RET
(0050)
(0051) /*
(0052) 函数:SystemInit()
(0053) 功能:系统初始化
(0054) */
(0055) void SystemInit()
(0056) {
(0057) TWI_init();
_SystemInit:
01CD DEBF RCALL _TWI_init
(0058) interrupt_init();
01CE DFD4 RCALL _interrupt_init
(0059) delay1(30); //等待ZLG7290复位完毕
01CF E10E LDI R16,0x1E
01D0 E010 LDI R17,0
(0060) }
01D1 CFE7 RJMP _delay1
_ClearAll:
x --> R20
01D2 940E03DF CALL push_gset1
01D4 9723 SBIW R28,3
(0061)
(0062) /*
(0063) 函数:ClearAll()
(0064) 功能:清除所有显示
(0065) */
(0066) void ClearAll()
(0067) {
(0068) uchar x;
(0069) for ( x=0; x<8; x++ )
01D5 2744 CLR R20
01D6 C008 RJMP 0x01DF
(0070) {
(0071) ZLG7290_Download(x,0,0,31);
01D7 E18F LDI R24,0x1F
01D8 838A STD R24,2+Y
01D9 2422 CLR R2
01DA 8228 STD R2,0+Y
01DB 2722 CLR R18
01DC 2F04 MOV R16,R20
01DD DFAF RCALL _ZLG7290_Download
01DE 9543 INC R20
01DF 3048 CPI R20,0x8
01E0 F3B0 BCS 0x01D7
(0072) }
(0073) }
01E1 9623 ADIW R28,3
01E2 940E03E2 CALL pop_gset1
01E4 9508 RET
_Test_DispBuf:
DispDat --> Y+0
n --> R20
dat --> R10
reg --> R12
x --> R22
01E5 940E03FE CALL push_gset4
01E7 9760 SBIW R28,0x10
(0074)
(0075) /*
(0076) 函数:Test_DispBuf()
(0077) 功能:测试直接写显存
(0078) */
(0079) void Test_DispBuf()
(0080) {
(0081) uchar DispDat[16] =
(0082) {//字母AbCdEFgHiJkLoPqr的字形数据
01E8 E88C LDI R24,0x8C
01E9 E090 LDI R25,0
01EA 01FE MOVW R30,R28
01EB E100 LDI R16,0x10
01EC E010 LDI R17,0
01ED 93FA ST R31,-Y
01EE 93EA ST R30,-Y
01EF 939A ST R25,-Y
01F0 938A ST R24,-Y
01F1 940E0412 CALL asgncblk
(0083) 0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xF6,0x6E,
(0084) 0x20,0x70,0x0E,0x1C,0x3A,0xCE,0xE6,0x0A
(0085) };
(0086) uchar n;
(0087) uchar x;
(0088) uchar reg;
(0089) uchar dat;
(0090) for ( n=0; n<16; n++ )
01F3 2744 CLR R20
01F4 C015 RJMP 0x020A
(0091) {
(0092) for ( x=0; x<8; x++ )
01F5 2766 CLR R22
01F6 C00D RJMP 0x0204
(0093) {
(0094) reg = ZLG7290_DpRam + x;
01F7 2F86 MOV R24,R22
01F8 5F80 SUBI R24,0xF0
01F9 2EC8 MOV R12,R24
(0095) dat = DispDat[n];
01FA 01CE MOVW R24,R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -