📄 zlg7290.lst
字号:
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 + -