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

📄 zlg7290.lst

📁 数码管 按键芯片zlg7290的atmega128 的c语言程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 940E0375  CALL	pop_gset2
    016A 9508      RET
_ZLG7290_cmd:
  buf                  --> Y+4
  cmd1                 --> R20
  cmd0                 --> R22
    016B 940E0365  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 940E0375  CALL	pop_gset2
    017E 9508      RET
_ZLG7290_SegOnOff:
  cmd                  --> R20
  b                    --> R22
  seg                  --> R20
    017F 940E0365  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 940E0375  CALL	pop_gset2
    018C 9508      RET
_ZLG7290_Download:
  cmd1                 --> R22
  cmd0                 --> R20
  dat                  --> Y+8
  f                    --> Y+6
  dp                   --> R10
  addr                 --> R20
    018D 940E0369  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 940E0378  CALL	pop_gset3
    01A2 9508      RET
FILE: E:\PQ-1A\我的AVR\zlg7290\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 940E0365  CALL	push_gset2
(0035) /*
(0036) /void miao()
(0037) {
(0038)   flag=1;
(0039) }
(0040) 
(0041) 
(0042) 函数:delay1()
(0043) 功能:延时10ms~655.36s
(0044) 参数:
(0045) 	t>0时,延时(t*0.01)s
(0046) 	t=0时,延时655.36s
(0047) 说明:
(0048) 	晶振采用8.31MHz
(0049) */
(0050) void delay1(uint t)
(0051) {
(0052)   uint x,y;
(0053)   for(x=t;x>0;x--)
    01BB 01A8      MOVW	R20,R16
    01BC C00A      RJMP	0x01C7
(0054)    for(y=110;y>0;y--);
    01BD E66E      LDI	R22,0x6E
    01BE E070      LDI	R23,0
    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
(0055) }
    01CA 940E0375  CALL	pop_gset2
    01CC 9508      RET
(0056) 
(0057) /*
(0058) 函数:SystemInit()
(0059) 功能:系统初始化
(0060) */
(0061) void SystemInit()
(0062) {
(0063) 	TWI_init();
_SystemInit:
    01CD DEBF      RCALL	_TWI_init
(0064)     interrupt_init();
    01CE DFD4      RCALL	_interrupt_init
(0065) 	delay1(30);		//等待ZLG7290复位完毕
    01CF E10E      LDI	R16,0x1E
    01D0 E010      LDI	R17,0
(0066) }
    01D1 CFE7      RJMP	_delay1
_ClearAll:
  x                    --> R20
    01D2 940E034E  CALL	push_gset1
    01D4 9723      SBIW	R28,3
(0067) 
(0068) /*
(0069) 函数:ClearAll()
(0070) 功能:清除所有显示
(0071) */
(0072) void ClearAll()
(0073) {
(0074) 	uchar x;
(0075) 	for ( x=0; x<8; x++ )
    01D5 2744      CLR	R20
    01D6 C008      RJMP	0x01DF
(0076) 	{
(0077) 		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
(0078) 	}
(0079) }
    01E1 9623      ADIW	R28,3
    01E2 940E0351  CALL	pop_gset1
    01E4 9508      RET
_Test_DispBuf:
  DispDat              --> Y+0
  n                    --> R20
  dat                  --> R10
  reg                  --> R12
  x                    --> R22
    01E5 940E036D  CALL	push_gset4
    01E7 9760      SBIW	R28,0x10
(0080) 
(0081) /*
(0082) 函数:Test_DispBuf()
(0083) 功能:测试直接写显存
(0084) */
(0085) void Test_DispBuf()
(0086) {
(0087) 	uchar DispDat[16] =
(0088) 	{//字母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 940E0381  CALL	asgncblk
(0089) 		0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0xF6,0x6E,
(0090) 		0x20,0x70,0x0E,0x1C,0x3A,0xCE,0xE6,0x0A
(0091) 	};
(0092) 	uchar n;
(0093) 	uchar x;
(0094) 	uchar reg;
(0095) 	uchar dat;
(0096) 	for ( n=0; n<16; n++ )
    01F3 2744      CLR	R20
    01F4 C015      RJMP	0x020A
(0097) 	{
(0098) 		for ( x=0; x<8; x++ )
    01F5 2766      CLR	R22
    01F6 C00D      RJMP	0x0204
(0099) 		{
(0100) 			reg = ZLG7290_DpRam + x;
    01F7 2F86      MOV	R24,R22
    01F8 5F80      SUBI	R24,0xF0
    01F9 2EC8      MOV	R12,R24
(0101) 			dat = DispDat[n];
    01FA 01CE      MOVW	R24,R28
    01FB 2FE4      MOV	R30,R20
    01FC 27FF      CLR	R31
    01FD 0FE8      ADD	R30,R24
    01FE 1FF9      ADC	R31,R25
    01FF 80A0      LDD	R10,0+Z
(0102) 			ZLG7290_WriteReg(reg,dat);
    0200 2D2A      MOV	R18,R10
    0201 2D0C      MOV	R16,R12
    0202 DF44      RCALL	_ZLG7290_WriteReg
    0203 9563      INC	R22
    0204 3068      CPI	R22,0x8
    0205 F388      BCS	0x01F7
(0103) 		}
(0104) 		delay1(50);
    0206 E302      LDI	R16,0x32
    0207 E010      LDI	R17,0
    0208 DFB0      RCALL	_delay1
    0209 9543      INC	R20
    020A 3140      CPI	R20,0x10
    020B F348      BCS	0x01F5
(0105) 	}
(0106) }
    020C 9660      ADIW	R28,0x10
    020D 940E037B  CALL	pop_gset4
    020F 9508      RET
_Test_Download:
  f                    --> R20
  dp                   --> R22
  dat                  --> R10
  x                    --> R12
    0210 940E036D  CALL	push_gset4
    0212 9723      SBIW	R28,3
(0107) 
(0108) /*
(0109) 函数:Test_Download()
(0110) 功能:测试下载数据功能
(0111) */
(0112) void Test_Download()
(0113) {
(0114) 	uchar x;
(0115) 	uchar dp;
(0116) 	uchar f;
(0117) 	uchar dat;
(0118) //点亮所有数码管
(0119) 	dp = 1;
    0213 E061      LDI	R22,1
(0120) 	f= 0;
    0214 2744      CLR	R20
(0121) 	dat = 8;
    0215 E088      LDI	R24,0x8
    0216 2EA8      MOV	R10,R24
(0122) 	for ( x=0; x<8; x++ )
    0217 24CC      CLR	R12
    0218 C006      RJMP	0x021F
(0123) 	{
(0124) 		ZLG7290_Download(x,dp,f,dat);
    0219 82AA      STD	R10,2+Y
    021A 8348      STD	R20,0+Y
    021B 2F26      MOV	R18,R22
    021C 2D0C      MOV	R16,R12
    021D DF6F      RCALL	_ZLG7290_Download
    021E 94C3      INC	R12
    021F 2D8C      MOV	R24,R12
    0220 3088      CPI	R24,0x8
    0221 F3B8      BCS	0x0219
(0125) 	}
(0126) 	delay1(100);
    0222 E604      LDI	R16,0x64
    0223 E010      LDI	R17,0
    0224 DF94      RCALL	_delay1
(0127) //依次显示所有字型
(0128) 	dp = 0;
    0225 2766      CLR	R22
(0129) 	f = 0;
    0226 2744      CLR	R20
(0130) 	for ( dat=0; dat<32; dat++ )
    0227 24AA      CLR	R10
    0228 C00F      RJMP	0x0238
(0131) 	{
(0132) 		for ( x=0; x<8; x++ )
    0229 24CC      CLR	R12
    022A C006      RJMP	0x0231
(0133) 		{
(0134) 			ZLG7290_Download(x,dp,f,dat);
    022B 82AA      STD	R10,2+Y
    022C 8348      STD	R20,0+Y
    022D 2F26      MOV	R18,R22
    022E 2D0C      MOV	R16,R12
    022F DF5D      RCALL	_ZLG7290_Download
    0230 94C3      INC	R12
    0231 2D8C      MOV	R24,R12
    0232 3088      CPI	R24,0x8
    0233 F3B8      BCS	0x022B
(0135) 		}
(0136) 		delay1(50);
    0234 E302      LDI	R16,0x32
    0235 E010      LDI	R17,0
    0236 DF82      RCALL	_delay1
    0237 94A3      INC	R10
    0238 2D8A      MOV	R24,R10
    0239 3280      CPI	R24,0x20
    023A F370      BCS	0x0229
(0137) 	}
(0138) }
    023B 9623      ADIW	R28,3
    023C 940E037B  CALL	pop_gset4
    023E 9508      RET
_Test_ScanNum:
  x                    --> R20
    023F 940E034E  CALL	push_gset1
    0241 9723      SBIW	R28,3
(0139) 
(0140) /*
(0141) 函数:Test_ScanNum()
(0142) 功能:测试不同扫描位数
(0143) 说明:扫描位数越少,数码管就越亮
(0144) */
(0145) void Test_ScanNum()
(0146) {
(0147) 	uchar x;
(0148) 	for ( x=0; x<8; x++ )
    0242 2744      CLR	R20
    0243 C008      RJMP	0x024C
(0149) 	{
(0150) 		ZLG7290_Download(x,1,0,8);
    0244 E088      LDI	R24,0x8
    0245 838A      STD	R24,2+Y
    0246 2422      CLR	R2
    0247 8228      STD	R2,0+Y
    0248 E021      LDI	R18,1
    0249 2F04      MOV	R16,R20
    024A DF42      RCALL	_ZLG7290_Download
    024B 9543      INC	R20
    024C 3048      CPI	R20,0x8
    024D F3B0      BCS	0x0244
(0151) 	}
(0152) 	delay1(100);
    024E E604      LDI	R16,0x64

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -