⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjdj_4.lst

📁 利用mega128控制由L298和L297构成的驱动板
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -