📄 pproject.lis
字号:
0006 ; //****************************说明****************************//
0006 ; //本例公交车语音报站系统包含16站
0006 ; //为方便起见,所有的站名都以“第n站”代替,其中n为当前站数,n<16
0006 ; //报站时显示屏滚动显示“第n站到了”
0006 ; //预报站时显示屏显示“前方到站第n站”
0006 ; //其中“第n站”字模存放在二维数组State n[3][32]中
0006 ; //“到了”字模存放在二维数组DL[2][32]中
0006 ; //“前方到站”字模存放在二维数组QFDZ[4][32]中
0006 ; uchar text[32]; //当前显示文字
0006 ; uchar next[32]; //下一个显示文字
0006 ;
0006 ;
0006 ; //****************************定义中断服务程序****************************//
0006 ; #pragma interrupt_handler Key_Scan:2 //定义按键中断INT0的中断服务程序
0006 ; #pragma interrupt_handler Receive_EOM:3 //定义语音中断INT1的中断服务程序
0006 ;
0006 ; void delay(uchar i)
0006 ; {for(;i!=0;i--) NOP();}
0006 0023 tst R16
0008 E1F7 brne L2
000A .dbline -2
000A .dbline 50
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r i 16 c
000C .dbend
000C .dbfunc e Set_SCL _Set_SCL fV
000C ; i -> R16
.even
000C _Set_SCL::
000C .dbline -1
000C .dbline 55
000C ;
000C ; //****************************I2C驱动程序****************************//
000C ; //定义MAX6959时钟线为PA^7
000C ; void Set_SCL(uchar i)
000C ; {
000C .dbline 56
000C ; if(i)
000C 0023 tst R16
000E 11F0 breq L7
0010 .dbline 57
0010 ; PORTA |=0x80;
0010 DF9A sbi 0x1b,7
0012 03C0 rjmp L8
0014 L7:
0014 .dbline 59
0014 8BB3 in R24,0x1b
0016 8F77 andi R24,127
0018 8BBB out 0x1b,R24
001A L8:
001A .dbline -2
001A .dbline 60
001A ; else
001A ; PORTA &=0x7f;
001A ; }
001A L6:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbsym r i 16 c
001C .dbend
001C .dbfunc e Set_SDA _Set_SDA fV
001C ; i -> R16
.even
001C _Set_SDA::
001C .dbline -1
001C .dbline 64
001C ;
001C ; //定义MAX6959数据线为PA^6
001C ; void Set_SDA(uchar i)
001C ; {
001C .dbline 65
001C ; if(i)
001C 0023 tst R16
001E 11F0 breq L10
0020 .dbline 66
0020 ; PORTA |=0x40;
0020 DE9A sbi 0x1b,6
0022 03C0 rjmp L11
0024 L10:
0024 .dbline 68
0024 8BB3 in R24,0x1b
0026 8F7B andi R24,191
0028 8BBB out 0x1b,R24
002A L11:
002A .dbline -2
002A .dbline 69
002A ; else
002A ; PORTA &=0xbf;
002A ; }
002A L9:
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r i 16 c
002C .dbend
002C .dbfunc e Start _Start fV
.even
002C _Start::
002C .dbline -1
002C .dbline 73
002C ;
002C ; //I2C总线的开始条件:SCL高电平时SDA的下降沿
002C ; void Start()
002C ; {
002C .dbline 74
002C ; Set_SDA(1); //SDA=1;
002C 01E0 ldi R16,1
002E F6DF rcall _Set_SDA
0030 .dbline 75
0030 ; Set_SCL(1); //SCL=1;
0030 01E0 ldi R16,1
0032 ECDF rcall _Set_SCL
0034 .dbline 76
0034 ; delay(100); //等待时钟信号变成高电平以确保总线开始
0034 04E6 ldi R16,100
0036 E4DF rcall _delay
0038 .dbline 77
0038 ; Set_SDA(0); //SDA=0;
0038 0027 clr R16
003A F0DF rcall _Set_SDA
003C .dbline 78
003C ; delay(100);
003C 04E6 ldi R16,100
003E E0DF rcall _delay
0040 .dbline 79
0040 ; Set_SCL(0); // SCL=0;
0040 0027 clr R16
0042 .dbline -2
0042 .dbline 80
0042 ; }
0042 L12:
0042 .dbline 0 ; func end
0042 E4CF rjmp _Set_SCL
0044 .dbend
0044 .dbfunc e Stop _Stop fV
.even
0044 _Stop::
0044 .dbline -1
0044 .dbline 84
0044 ;
0044 ; //I2C总线结束条件:SCL为高电平时SDA的上升沿
0044 ; void Stop()
0044 ; {
0044 .dbline 85
0044 ; Set_SDA(0); //SDA=0;
0044 0027 clr R16
0046 EADF rcall _Set_SDA
0048 .dbline 86
0048 ; delay(100);
0048 04E6 ldi R16,100
004A DADF rcall _delay
004C .dbline 87
004C ; Set_SCL(1); //SCL=1;
004C 01E0 ldi R16,1
004E DEDF rcall _Set_SCL
0050 .dbline 88
0050 ; delay(100); //等待时钟信号变成低电平以确保总线结束
0050 04E6 ldi R16,100
0052 D6DF rcall _delay
0054 .dbline 89
0054 ; Set_SDA(1); //SDA=1;
0054 01E0 ldi R16,1
0056 E2DF rcall _Set_SDA
0058 .dbline 90
0058 ; delay(100);
0058 04E6 ldi R16,100
005A D2DF rcall _delay
005C .dbline 91
005C ; Set_SCL(0); //SCL=0;
005C 0027 clr R16
005E .dbline -2
005E .dbline 92
005E ; }
005E L13:
005E .dbline 0 ; func end
005E D6CF rjmp _Set_SCL
0060 .dbend
0060 .dbfunc e Ack _Ack fV
.even
0060 _Ack::
0060 .dbline -1
0060 .dbline 96
0060 ;
0060 ; //I2C总线应答:读完一个字节后将SDA线拉低,即应答0
0060 ; void Ack()
0060 ; {
0060 .dbline 97
0060 ; Set_SDA(0); //SDA=0;
0060 0027 clr R16
0062 DCDF rcall _Set_SDA
0064 .dbline 98
0064 ; delay(50);
0064 02E3 ldi R16,50
0066 CCDF rcall _delay
0068 .dbline 99
0068 ; Set_SCL(1); //SCL=1;
0068 01E0 ldi R16,1
006A D0DF rcall _Set_SCL
006C .dbline 100
006C ; delay(100);
006C 04E6 ldi R16,100
006E C8DF rcall _delay
0070 .dbline 101
0070 ; Set_SCL(0); //SCL=0;
0070 0027 clr R16
0072 CCDF rcall _Set_SCL
0074 .dbline 102
0074 ; delay(50);
0074 02E3 ldi R16,50
0076 C4DF rcall _delay
0078 .dbline 103
0078 ; Set_SDA(1); //SDA=1;
0078 01E0 ldi R16,1
007A .dbline -2
007A .dbline 104
007A ; }
007A L14:
007A .dbline 0 ; func end
007A D0CF rjmp _Set_SDA
007C .dbend
007C .dbfunc e Nack _Nack fV
.even
007C _Nack::
007C .dbline -1
007C .dbline 108
007C ;
007C ; //I2C总线应答:读完所要求的字节数据后将SDA线拉高,为结束IIC总线操作做准备
007C ; void Nack()
007C ; {
007C .dbline 109
007C ; Set_SDA(1); //SDA=1;
007C 01E0 ldi R16,1
007E CEDF rcall _Set_SDA
0080 .dbline 110
0080 ; delay(50);
0080 02E3 ldi R16,50
0082 BEDF rcall _delay
0084 .dbline 111
0084 ; Set_SCL(1); //SCL=1;
0084 01E0 ldi R16,1
0086 C2DF rcall _Set_SCL
0088 .dbline 112
0088 ; delay(100);
0088 04E6 ldi R16,100
008A BADF rcall _delay
008C .dbline 113
008C ; Set_SCL(0); //SCL=0;
008C 0027 clr R16
008E BEDF rcall _Set_SCL
0090 .dbline 114
0090 ; delay(50);
0090 02E3 ldi R16,50
0092 B6DF rcall _delay
0094 .dbline 115
0094 ; Set_SDA(0); //SDA=0;
0094 0027 clr R16
0096 .dbline -2
0096 .dbline 116
0096 ; }
0096 L15:
0096 .dbline 0 ; func end
0096 C2CF rjmp _Set_SDA
0098 .dbend
0098 .dbfunc e Check_Ack _Check_Ack fV
.even
0098 _Check_Ack::
0098 .dbline -1
0098 .dbline 120
0098 ;
0098 ; //检查I2C器件应答情况
0098 ; void Check_Ack()
0098 ; {
0098 .dbline 121
0098 ; Set_SDA(1); //SDA=1;
0098 01E0 ldi R16,1
009A C0DF rcall _Set_SDA
009C .dbline 122
009C ; Set_SCL(1); //SCL=1;
009C 01E0 ldi R16,1
009E B6DF rcall _Set_SCL
00A0 .dbline 123
00A0 ; Ack_Flag=0; //清除应答标志;
00A0 2224 clr R2
00A2 20924600 sts _Ack_Flag,R2
00A6 .dbline 124
00A6 ; DDRA &=0xbf; //设置SDA为输入
00A6 8AB3 in R24,0x1a
00A8 8F7B andi R24,191
00AA 8ABB out 0x1a,R24
00AC .dbline 125
00AC ; if(!((PINA & 0x40)>>6))
00AC 89B3 in R24,0x19
00AE 8074 andi R24,64
00B0 8695 lsr R24
00B2 8695 lsr R24
00B4 8695 lsr R24
00B6 8695 lsr R24
00B8 8695 lsr R24
00BA 8695 lsr R24
00BC 8823 tst R24
00BE 39F4 brne L17
00C0 .dbline 126
00C0 ; {
00C0 .dbline 127
00C0 ; delay(50);
00C0 02E3 ldi R16,50
00C2 9EDF rcall _delay
00C4 .dbline 128
00C4 ; Set_SCL(0); //SCL=0;
00C4 0027 clr R16
00C6 A2DF rcall _Set_SCL
00C8 .dbline 129
00C8 ; delay(100);
00C8 04E6 ldi R16,100
00CA 9ADF rcall _delay
00CC .dbline 130
00CC ; }
00CC 09C0 rjmp L18
00CE L17:
00CE .dbline 132
00CE ; else
00CE ; {
00CE .dbline 133
00CE ; Ack_Flag=1; //收到应答;
00CE 81E0 ldi R24,1
00D0 80934600 sts _Ack_Flag,R24
00D4 .dbline 134
00D4 ; delay(50);
00D4 02E3 ldi R16,50
00D6 94DF rcall _delay
00D8 .dbline 135
00D8 ; Set_SCL(0); //SCL=0;
00D8 0027 clr R16
00DA 98DF rcall _Set_SCL
00DC .dbline 136
00DC ; delay(100);
00DC 04E6 ldi R16,100
00DE 90DF rcall _delay
00E0 .dbline 137
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -