📄 pproject.s
字号:
.byte 0,0
.byte 255,8
.byte 8,8
.byte 8,0
.byte 8,8
.byte 208,48
.byte 208,16
.byte 0,254
.byte 132,132
.byte 132,132
.byte 132,254
.byte 0,0
.dbsym e State14 _State14 A[96:3:32]kc
_State15::
.byte 8,16
.byte 32,203
.byte 'j,'Z
.byte 'J,'Z
.byte 47,202
.byte 'j,'Z
.byte 'N,64
.byte 64,0
.byte 0,4
.byte 4,196
.byte 'H,'H
.byte 'P,96
.byte 255,64
.byte 64,'H
.byte 'D,'x
.byte 0,0
.byte 0,8
.byte 8,31
.byte 0,0
.byte 0,0
.byte 0,31
.byte 16,17
.byte 17,16
.byte 16,0
.byte 0,4
.byte 4,252
.byte 4,4
.byte 0,0
.byte 0,152
.byte 132,4
.byte 4,136
.byte 'p,0
.byte 8,10
.byte 'I,56
.byte 8,15
.byte 8,0
.byte 0,0
.byte 255,8
.byte 8,8
.byte 8,0
.byte 8,8
.byte 208,48
.byte 208,16
.byte 0,254
.byte 132,132
.byte 132,132
.byte 132,254
.byte 0,0
.dbsym e State15 _State15 A[96:3:32]kc
_State16::
.byte 8,16
.byte 32,203
.byte 'j,'Z
.byte 'J,'Z
.byte 47,202
.byte 'j,'Z
.byte 'N,64
.byte 64,0
.byte 0,4
.byte 4,196
.byte 'H,'H
.byte 'P,96
.byte 255,64
.byte 64,'H
.byte 'D,'x
.byte 0,0
.byte 0,8
.byte 8,31
.byte 0,0
.byte 0,0
.byte 0,7
.byte 8,17
.byte 17,24
.byte 0,0
.byte 0,4
.byte 4,252
.byte 4,4
.byte 0,0
.byte 0,240
.byte 136,4
.byte 4,136
.byte 'p,0
.byte 8,10
.byte 'I,56
.byte 8,15
.byte 8,0
.byte 0,0
.byte 255,8
.byte 8,8
.byte 8,0
.byte 8,8
.byte 208,48
.byte 208,16
.byte 0,254
.byte 132,132
.byte 132,132
.byte 132,254
.byte 0,0
.dbsym e State16 _State16 A[96:3:32]kc
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project/project.h
_EOM_Flag::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project/project.h
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e EOM_Flag _EOM_Flag c
_State::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e State _State c
_Speed::
.blkb 1
.area idata
.byte 20
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e Speed _Speed c
_Snd_Info::
.blkb 2
.area idata
.byte 0,17
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e Snd_Info _Snd_Info A[2:2]c
_Snd_Pre_Info::
.blkb 2
.area idata
.byte 18,0
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.blkb 1
.area idata
.byte 19
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e Snd_Pre_Info _Snd_Pre_Info A[3:3]c
_Snd_Spec::
.blkb 2
.area idata
.byte 21,22
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e Snd_Spec _Snd_Spec A[2:2]c
_Snd_Welc::
.blkb 1
.area idata
.byte 20
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbsym e Snd_Welc _Snd_Welc c
.area vector(rom, abs)
.org 2
rjmp _Key_Scan
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.area vector(rom, abs)
.org 4
rjmp _Receive_EOM
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第五章程序\Project\Pproject.c
.dbfunc e delay _delay fV
; i -> R16
.even
_delay::
.dbline -1
.dbline 50
.dbline 50
rjmp L5
L2:
.dbline 50
nop
L3:
.dbline 50
dec R16
L5:
.dbline 50
; //****************************系统程序头文件****************************//
; #include <io8535v.h> //AT90S8535寄存器定义头文件;
; #include <macros.h> // AT90S8535宏定义,系统程序需要用到此宏定义过的函数;
;
; //****************************定义全局变量****************************//
; #define uchar unsigned char
; #define uint unsigned int
; #include "project.h"
;
; uchar Key_Value; //按键键值;
; uchar State_Flag; //站点标志;
; uchar Ack_Flag; //确认标志;
; uchar Pre_Flag; //预报标志;
; uchar Move_Flag; //滚动标志;
; uchar Spec_Flag; //特殊信息标志;
; uchar EOM_Flag=1; //信息结束标志;
; uchar Pst_Flag; //上、下行标志;
; uchar State=1; //站数;
; uchar Spec; //特殊信息数;
; uchar Speed=20; //文字滚动速度;
; uchar Word_Number; //显示字数;
;
; //****************************说明****************************//
; //语音芯片第1~16段分别保存16站的站名信息
; //第17段保存报站信息“到了,请要下车的乘客依次从后门下车”
; //第18、19段分别保存预报信息“前方到站”、“请要下车的乘客做好下车准备”
; //第20段保存欢迎信息及公交车线路说明
; //第21、22段保存特殊提示信息
; uchar Snd_Info[]={0,17}; //报站声音信息
; uchar Snd_Pre_Info[]={18,0,19}; //预报声音信息
; uchar Snd_Spec[]={21,22}; //特殊声音信息
; uchar Snd_Welc=20; //欢迎声音信息
; //****************************说明****************************//
; //本例公交车语音报站系统包含16站
; //为方便起见,所有的站名都以“第n站”代替,其中n为当前站数,n<16
; //报站时显示屏滚动显示“第n站到了”
; //预报站时显示屏显示“前方到站第n站”
; //其中“第n站”字模存放在二维数组State n[3][32]中
; //“到了”字模存放在二维数组DL[2][32]中
; //“前方到站”字模存放在二维数组QFDZ[4][32]中
; uchar text[32]; //当前显示文字
; uchar next[32]; //下一个显示文字
;
;
; //****************************定义中断服务程序****************************//
; #pragma interrupt_handler Key_Scan:2 //定义按键中断INT0的中断服务程序
; #pragma interrupt_handler Receive_EOM:3 //定义语音中断INT1的中断服务程序
;
; void delay(uchar i)
; {for(;i!=0;i--) NOP();}
tst R16
brne L2
.dbline -2
.dbline 50
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Set_SCL _Set_SCL fV
; i -> R16
.even
_Set_SCL::
.dbline -1
.dbline 55
;
; //****************************I2C驱动程序****************************//
; //定义MAX6959时钟线为PA^7
; void Set_SCL(uchar i)
; {
.dbline 56
; if(i)
tst R16
breq L7
.dbline 57
; PORTA |=0x80;
sbi 0x1b,7
rjmp L8
L7:
.dbline 59
in R24,0x1b
andi R24,127
out 0x1b,R24
L8:
.dbline -2
.dbline 60
; else
; PORTA &=0x7f;
; }
L6:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Set_SDA _Set_SDA fV
; i -> R16
.even
_Set_SDA::
.dbline -1
.dbline 64
;
; //定义MAX6959数据线为PA^6
; void Set_SDA(uchar i)
; {
.dbline 65
; if(i)
tst R16
breq L10
.dbline 66
; PORTA |=0x40;
sbi 0x1b,6
rjmp L11
L10:
.dbline 68
in R24,0x1b
andi R24,191
out 0x1b,R24
L11:
.dbline -2
.dbline 69
; else
; PORTA &=0xbf;
; }
L9:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Start _Start fV
.even
_Start::
.dbline -1
.dbline 73
;
; //I2C总线的开始条件:SCL高电平时SDA的下降沿
; void Start()
; {
.dbline 74
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 75
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 76
; delay(100); //等待时钟信号变成高电平以确保总线开始
ldi R16,100
rcall _delay
.dbline 77
; Set_SDA(0); //SDA=0;
clr R16
rcall _Set_SDA
.dbline 78
; delay(100);
ldi R16,100
rcall _delay
.dbline 79
; Set_SCL(0); // SCL=0;
clr R16
.dbline -2
.dbline 80
; }
L12:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Stop _Stop fV
.even
_Stop::
.dbline -1
.dbline 84
;
; //I2C总线结束条件:SCL为高电平时SDA的上升沿
; void Stop()
; {
.dbline 85
; Set_SDA(0); //SDA=0;
clr R16
rcall _Set_SDA
.dbline 86
; delay(100);
ldi R16,100
rcall _delay
.dbline 87
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 88
; delay(100); //等待时钟信号变成低电平以确保总线结束
ldi R16,100
rcall _delay
.dbline 89
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 90
; delay(100);
ldi R16,100
rcall _delay
.dbline 91
; Set_SCL(0); //SCL=0;
clr R16
.dbline -2
.dbline 92
; }
L13:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Ack _Ack fV
.even
_Ack::
.dbline -1
.dbline 96
;
; //I2C总线应答:读完一个字节后将SDA线拉低,即应答0
; void Ack()
; {
.dbline 97
; Set_SDA(0); //SDA=0;
clr R16
rcall _Set_SDA
.dbline 98
; delay(50);
ldi R16,50
rcall _delay
.dbline 99
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 100
; delay(100);
ldi R16,100
rcall _delay
.dbline 101
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 102
; delay(50);
ldi R16,50
rcall _delay
.dbline 103
; Set_SDA(1); //SDA=1;
ldi R16,1
.dbline -2
.dbline 104
; }
L14:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Nack _Nack fV
.even
_Nack::
.dbline -1
.dbline 108
;
; //I2C总线应答:读完所要求的字节数据后将SDA线拉高,为结束IIC总线操作做准备
; void Nack()
; {
.dbline 109
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 110
; delay(50);
ldi R16,50
rcall _delay
.dbline 111
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 112
; delay(100);
ldi R16,100
rcall _delay
.dbline 113
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 114
; delay(50);
ldi R16,50
rcall _delay
.dbline 115
; Set_SDA(0); //SDA=0;
clr R16
.dbline -2
.dbline 116
; }
L15:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Check_Ack _Check_Ack fV
.even
_Check_Ack::
.dbline -1
.dbline 120
;
; //检查I2C器件应答情况
; void Check_Ack()
; {
.dbline 121
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 122
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 123
; Ack_Flag=0; //清除应答标志;
clr R2
sts _Ack_Flag,R2
.dbline 124
; DDRA &=0xbf; //设置SDA为输入
in R24,0x1a
andi R24,191
out 0x1a,R24
.dbline 125
; if(!((PINA & 0x40)>>6))
in R24,0x19
andi R24,64
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
tst R24
brne L17
.dbline 126
; {
.dbline 127
; delay(50);
ldi R16,50
rcall _delay
.dbline 128
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 129
; delay(100);
ldi R16,100
rcall _delay
.dbline 130
; }
rjmp L18
L17:
.dbline 132
; else
; {
.dbline 133
; Ack_Flag=1; //收到应答;
ldi R24,1
sts _Ack_Flag,R24
.dbline 134
; delay(50);
ldi R16,50
rcall _delay
.dbline 135
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 136
; delay(100);
ldi R16,100
rcall _delay
.dbline 137
; }
L18:
.dbline 138
; DDRA |=0xff; //重新设置SDA为输出
in R24,0x1a
ori R24,255
out 0x1a,R24
.dbline -2
.dbline 139
; }
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_Bit0 _Write_Bit0 fV
.even
_Write_Bit0::
.dbline -1
.dbline 143
;
; //写1bit数据:0
; void Write_Bit0()
; {
.dbline 144
; Set_SDA(0); //SDA=0;
clr R16
rcall _Set_SDA
.dbline 145
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 146
; delay(100);
ldi R16,100
rcall _delay
.dbline 147
; Set_SCL(0); //SCL=0;
clr R16
.dbline -2
.dbline 148
; }
L19:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Write_Bit1 _Write_Bit1 fV
.even
_Write_Bit1::
.dbline -1
.dbline 152
;
; //写1bit数据:1
; void Write_Bit1()
; {
.dbline 153
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 154
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 155
; delay(100);
ldi R16,100
rcall _delay
.dbline 156
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 157
; Set_SDA(0); //SDA=0;
clr R16
.dbline -2
.dbline 158
; }
L20:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Write_Byte _Write_Byte fV
; i -> R20
; Data -> R22
.even
_Write_Byte::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 162
;
; //写一字节数据Data
; void Write_Byte(uchar Data)
; {
.dbline 164
; uchar i;
; for(i=0;i<8;i++)
clr R20
rjmp L25
L22:
.dbline 165
; {
.dbline 166
; if(Data & 0x80) //传输位从高位到低位,先传最高位
sbrs R22,7
rjmp L26
.dbline 167
; Write_Bit1();
rcall _Write_Bit1
rjmp L27
L26:
.dbline 169
; else
; Write_Bit0();
rcall _Write_Bit0
L27:
.dbline 170
lsl R22
.dbline 171
L23:
.dbline 164
inc R20
L25:
.dbline 164
cpi R20,8
brlo L22
.dbline -2
.dbline 172
; Data <<=1; //数据左移
; }
; }
L21:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Data 22 c
.dbend
.dbfunc e Read_Byte _Read_Byte fc
; j -> R20
; Read_Data -> R22
.even
_Read_Byte::
rcall push_gset2
.dbline -1
.dbline 176
;
; //读一字节数据:返回值即读的数据
; uchar Read_Byte()
; {
.dbline 177
; uchar Read_Data=0xff; // Read_Data为读入的数据,初始值为0xff
ldi R22,255
.dbline 179
; uchar j;
; for (j=0;j<8;j++)
clr R20
rjmp L32
L29:
.dbline 180
; {
.dbline 181
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 182
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 183
; DDRA &=0xbf; //设置SDA为输入线
in R24,0x1a
andi R24,191
out 0x1a,R24
.dbline 185
; //数据读出,若是0则移位;若是1则与0x01或
; if((PINA & 0x40)==0)
sbic 0x19,6
rjmp L33
.dbline 186
; {
.dbline 187
; Read_Data <<=1;
lsl R22
.dbline 188
; Read_Data=(Read_Data & 0xfe);
andi R22,254
.dbline 189
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 190
; }
rjmp L34
L33:
.dbline 192
; else
; {
.dbline 193
; Read_Data <<=1;
lsl R22
.dbline 194
; Read_Data =( Read_Data | 0x01);
ori R22,1
.dbline 195
; Set_SCL(0); //SCL=0
clr R16
rcall _Set_SCL
.dbline 196
; }
L34:
.dbline 197
L30:
.dbline 179
inc R20
L32:
.dbline 179
cpi R20,8
brlo L29
.dbline 198
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -