📄 hc595.s
字号:
.module hc595.c
.area lit(rom, con, rel)
_Seg7_Data::
.byte 63,6
.byte 91,'O
.byte 'f,'m
.byte 125,7
.byte 127,'o
.byte 'w,124
.byte 57,94
.byte 'y,'q
.byte 0
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_seg7\source\lib\hc595.c
.dbsym e Seg7_Data _Seg7_Data A[17:17]kc
.area data(ram, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_seg7\source\lib\hc595.c
_point::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_seg7\source\lib\hc595.c
.dbsym e point _point c
_point_pos::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_seg7\source\lib\hc595.c
.dbsym e point_pos _point_pos c
.area text(rom, con, rel)
.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_seg7\source\lib\hc595.c
.dbfunc e HC_595_init _HC_595_init fV
.even
_HC_595_init::
.dbline -1
.dbline 25
; /************************************************
; 文件:spi.c
; 用途:SPI驱动
; 注意:
; 创建:2008.1.25
; 修改:2008.1.25
; Copy Right (c) www.avrvi.com AVR与虚拟仪器
; ************************************************/
; #include "..\config.h"
; const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4
; 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9
; 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f
; volatile unsigned char Seg7_Led_Buf[4],point=0,point_pos=0;//point是小数点标志1代表有小数点point_pos表示小数点位置
; /*************************************************************************
; ** 函数名称:HC595初始化
; ** 功能描述:
; ** 输 入:
; ** 输出 :
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void HC_595_init(void)
; {
.dbline 26
; OE_DDR |= (1<<OE);
sbi 0x14,7
.dbline 27
; OE_PORT &= (1<<OE);
in R24,0x15
andi R24,128
out 0x15,R24
.dbline 28
; PORTB = 0x0F;
ldi R24,15
out 0x18,R24
.dbline 29
; spi_init();
xcall _spi_init
.dbline 30
; Seg7_Led_Buf[0]=16;
ldi R24,16
sts _Seg7_Led_Buf,R24
.dbline 31
; Seg7_Led_Buf[1]=16;
sts _Seg7_Led_Buf+1,R24
.dbline 32
; Seg7_Led_Buf[2]=16;
sts _Seg7_Led_Buf+2,R24
.dbline 33
; Seg7_Led_Buf[3]=16;
sts _Seg7_Led_Buf+3,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e HC_595_OUT _HC_595_OUT fV
; data -> R20
.even
_HC_595_OUT::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 46
; }
; /*************************************************************************
; ** 函数名称:HC595送数据
; ** 功能描述:
; ** 输 入:
; ** 输出 :
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void HC_595_OUT(unsigned char data)
; {
.dbline 47
; SS_L();
cbi 0x18,0
.dbline 48
; SPI_MasterTransmit(data);
mov R16,R20
xcall _SPI_MasterTransmit
.dbline 49
; SS_H();
sbi 0x18,0
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e Seg7_Led_Update _Seg7_Led_Update fV
.even
_Seg7_Led_Update::
.dbline -1
.dbline 62
; }
; /*************************************************************************
; ** 函数名称:HC595刷新显示
; ** 功能描述:
; ** 输 入:
; ** 输出 :
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void Seg7_Led_Update(void)
; {
.dbline 63
; HC_595_OUT(Seg7_Data[Seg7_Led_Buf[0]]);
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
xcall _HC_595_OUT
.dbline 64
; Seg7_Bit0_En();
.dbline 64
sbi 0x17,4
.dbline 64
sbi 0x18,4
.dbline 64
.dbline 64
.dbline 65
; delay_nus(60);
ldi R16,60
ldi R17,0
xcall _delay_nus
.dbline 66
; Seg7_Bit0_Dis();
.dbline 66
sbi 0x17,4
.dbline 66
cbi 0x18,4
.dbline 66
.dbline 66
.dbline 68
;
; HC_595_OUT(Seg7_Data[Seg7_Led_Buf[1]]);
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+1
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
xcall _HC_595_OUT
.dbline 69
; if((point==1)&&(point_pos==1))
lds R24,_point
cpi R24,1
brne L8
lds R24,_point_pos
cpi R24,1
brne L8
.dbline 70
; HC_595_OUT((Seg7_Data[Seg7_Led_Buf[1]])|(1<<dp));
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+1
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
ori R16,128
xcall _HC_595_OUT
L8:
.dbline 71
; Seg7_Bit1_En();
.dbline 71
sbi 0x17,5
.dbline 71
sbi 0x18,5
.dbline 71
.dbline 71
.dbline 72
; delay_nus(60);
ldi R16,60
ldi R17,0
xcall _delay_nus
.dbline 73
; Seg7_Bit1_Dis();
.dbline 73
sbi 0x17,5
.dbline 73
cbi 0x18,5
.dbline 73
.dbline 73
.dbline 75
;
; HC_595_OUT(Seg7_Data[Seg7_Led_Buf[2]]);
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+2
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
xcall _HC_595_OUT
.dbline 76
; if((point==1)&&(point_pos==2))
lds R24,_point
cpi R24,1
brne L12
lds R24,_point_pos
cpi R24,2
brne L12
.dbline 77
; HC_595_OUT((Seg7_Data[Seg7_Led_Buf[2]])|(1<<dp));
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+2
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
ori R16,128
xcall _HC_595_OUT
L12:
.dbline 78
; Seg7_Bit2_En();
.dbline 78
sbi 0x17,6
.dbline 78
sbi 0x18,6
.dbline 78
.dbline 78
.dbline 79
; delay_nus(60);
ldi R16,60
ldi R17,0
xcall _delay_nus
.dbline 80
; Seg7_Bit2_Dis();
.dbline 80
sbi 0x17,6
.dbline 80
cbi 0x18,6
.dbline 80
.dbline 80
.dbline 82
;
; HC_595_OUT(Seg7_Data[Seg7_Led_Buf[3]]);
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+3
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
xcall _HC_595_OUT
.dbline 83
; if((point==1)&&(point_pos==3))
lds R24,_point
cpi R24,1
brne L16
lds R24,_point_pos
cpi R24,3
brne L16
.dbline 84
; HC_595_OUT((Seg7_Data[Seg7_Led_Buf[3]])|(1<<dp));
ldi R24,<_Seg7_Data
ldi R25,>_Seg7_Data
lds R30,_Seg7_Led_Buf+3
clr R31
add R30,R24
adc R31,R25
lpm R16,Z
ori R16,128
xcall _HC_595_OUT
L16:
.dbline 85
; Seg7_Bit3_En();
.dbline 85
sbi 0x17,7
.dbline 85
sbi 0x18,7
.dbline 85
.dbline 85
.dbline 86
; delay_nus(60);
ldi R16,60
ldi R17,0
xcall _delay_nus
.dbline 87
; Seg7_Bit3_Dis();
.dbline 87
sbi 0x17,7
.dbline 87
cbi 0x18,7
.dbline 87
.dbline 87
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Seg7_Led_display _Seg7_Led_display fV
; data -> R20,R21
.even
_Seg7_Led_display::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 100
; }
; /*************************************************************************
; ** 函数名称:Hc595显示整形数据
; ** 功能描述:
; ** 输 入:0~9999
; ** 输出 :
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; **************************************************************************/
; void Seg7_Led_display(unsigned int data)
; {
.dbline 101
; if(data>9999) //错误处理,超出显示范围则全亮
ldi R24,9999
ldi R25,39
cp R24,R20
cpc R25,R21
brsh L20
.dbline 102
; {
.dbline 103
; HC_595_OUT(0xFF);
ldi R16,255
xcall _HC_595_OUT
.dbline 104
; Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1)|(1<<Seg7_Bit2)|(1<<Seg7_Bit3));
in R24,0x18
ori R24,240
out 0x18,R24
.dbline 105
; }
xjmp L21
L20:
.dbline 106
; else if(data>999)
ldi R24,999
ldi R25,3
cp R24,R20
cpc R25,R21
brsh L22
.dbline 107
; {
.dbline 108
; Seg7_Led_Buf[3]=data/1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall div16u
sts _Seg7_Led_Buf+3,R16
.dbline 109
; Seg7_Led_Buf[2]=(data%1000)/100;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16u
ldi R18,100
ldi R19,0
xcall div16u
sts _Seg7_Led_Buf+2,R16
.dbline 110
; Seg7_Led_Buf[1]=(data%100)/10;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16u
ldi R18,10
ldi R19,0
xcall div16u
sts _Seg7_Led_Buf+1,R16
.dbline 111
; Seg7_Led_Buf[0]=data%10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16u
sts _Seg7_Led_Buf,R16
.dbline 112
; Seg7_Led_Update();
xcall _Seg7_Led_Update
.dbline 113
; }
xjmp L23
L22:
.dbline 114
; else if(data>99)
ldi R24,99
ldi R25,0
cp R24,R20
cpc R25,R21
brsh L27
.dbline 115
; {
.dbline 116
; Seg7_Led_Buf[3]=16;
ldi R24,16
sts _Seg7_Led_Buf+3,R24
.dbline 117
; Seg7_Led_Buf[2]=(data%1000)/100;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16u
ldi R18,100
ldi R19,0
xcall div16u
sts _Seg7_Led_Buf+2,R16
.dbline 118
; Seg7_Led_Buf[1]=(data%100)/10;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16u
ldi R18,10
ldi R19,0
xcall div16u
sts _Seg7_Led_Buf+1,R16
.dbline 119
; Seg7_Led_Buf[0]=data%10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16u
sts _Seg7_Led_Buf,R16
.dbline 120
; Seg7_Led_Update();
xcall _Seg7_Led_Update
.dbline 121
; }
xjmp L28
L27:
.dbline 122
; else if(data>9)
ldi R24,9
ldi R25,0
cp R24,R20
cpc R25,R21
brsh L32
.dbline 123
; {
.dbline 124
; Seg7_Led_Buf[3]=16;
ldi R24,16
sts _Seg7_Led_Buf+3,R24
.dbline 125
; Seg7_Led_Buf[2]=16;
sts _Seg7_Led_Buf+2,R24
.dbline 126
; Seg7_Led_Buf[1]=(data%100)/10;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16u
ldi R18,10
ldi R19,0
xcall div16u
sts _Seg7_Led_Buf+1,R16
.dbline 127
; Seg7_Led_Buf[0]=data%10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16u
sts _Seg7_Led_Buf,R16
.dbline 128
; Seg7_Led_Update();
xcall _Seg7_Led_Update
.dbline 129
; }
xjmp L33
L32:
.dbline 131
; else
; {
.dbline 132
; Seg7_Led_Buf[3]=16;
ldi R24,16
sts _Seg7_Led_Buf+3,R24
.dbline 133
; Seg7_Led_Buf[2]=16;
sts _Seg7_Led_Buf+2,R24
.dbline 134
; Seg7_Led_Buf[1]=16;
sts _Seg7_Led_Buf+1,R24
.dbline 135
; Seg7_Led_Buf[0]=data%10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16u
sts _Seg7_Led_Buf,R16
.dbline 136
; Seg7_Led_Update();
xcall _Seg7_Led_Update
.dbline 137
; }
L33:
L28:
L23:
L21:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -