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

📄 pproject.lis

📁 公交报站系统
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -