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

📄 ch452ldriver.lis

📁 ch452的数码管和键盘驱动程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0188                   .dbend
 0188                   .dbfunc e Read_Keycode _Read_Keycode fc
 0188           ;           temp -> <dead>
 0188           ;       keyvalue -> R22
 0188           ;            cmd -> R10
 0188           ;              i -> R20
                        .even
 0188           _Read_Keycode::
 0188 00D0              rcall push_gset3
 018A                   .dbline -1
 018A                   .dbline 221
 018A           ; }
 018A           ; 
 018A           ; /***************************************************************************
 018A           ; *函数名:
 018A           ; *功能:读取CH452L按键代码
 018A           ; *入口参数:无
 018A           ; *出口参数:返回读取到的键值,参考手册上的键值表
 018A           ; *说明:由于读取按键代码时B0~B7无效,只有B8~B11有效,可以使用简化的读取按键命
 018A           ; 令,即输出命令0111。必须关中断,再开中断,否则读出的键值出错
 018A           ; ****************************************************************************/
 018A           ; unsigned char Read_Keycode(void)
 018A           ; {
 018A                   .dbline 222
 018A           ;     unsigned char keyvalue=0,temp,i;
 018A 6627              clr R22
 018C                   .dbline 223
 018C           ;       unsigned char cmd=0x07;//使用简化的读取按键命令,使用cmd的低四位
 018C 87E0              ldi R24,7
 018E A82E              mov R10,R24
 0190                   .dbline 224
 0190           ;       GICR &= 0xbf;  //关中断INT0
 0190 8BB7              in R24,0x3b
 0192 8F7B              andi R24,191
 0194 8BBF              out 0x3b,R24
 0196                   .dbline 225
 0196           ;       Delay_Nus(5);
 0196 05E0              ldi R16,5
 0198 10E0              ldi R17,0
 019A 00D0              rcall _Delay_Nus
 019C                   .dbline 226
 019C           ;       LOAD_OUT0;    //LOAD输出0
 019C A898              cbi 0x15,0
 019E                   .dbline 227
 019E           ;       for(i=0;i<4;i++)
 019E 4427              clr R20
 01A0 09C0              rjmp L26
 01A2           L23:
 01A2                   .dbline 228
 01A2           ;       {
 01A2                   .dbline 229
 01A2           ;           DCLK_OUT0;
 01A2 A998              cbi 0x15,1
 01A4                   .dbline 230
 01A4           ;               if(cmd & 1)
 01A4 A0FE              sbrs R10,0
 01A6 02C0              rjmp L27
 01A8                   .dbline 231
 01A8           ;               {
 01A8                   .dbline 232
 01A8           ;                   DIN_OUT1;
 01A8 AA9A              sbi 0x15,2
 01AA                   .dbline 233
 01AA           ;               }
 01AA 01C0              rjmp L28
 01AC           L27:
 01AC                   .dbline 235
 01AC           ;               else
 01AC           ;               {
 01AC                   .dbline 236
 01AC           ;                   DIN_OUT0;
 01AC AA98              cbi 0x15,2
 01AE                   .dbline 237
 01AE           ;               }
 01AE           L28:
 01AE                   .dbline 238
 01AE A99A              sbi 0x15,1
 01B0                   .dbline 239
 01B0 A694              lsr R10
 01B2                   .dbline 240
 01B2           L24:
 01B2                   .dbline 227
 01B2 4395              inc R20
 01B4           L26:
 01B4                   .dbline 227
 01B4 4430              cpi R20,4
 01B6 A8F3              brlo L23
 01B8                   .dbline 241
 01B8           ;               DCLK_OUT1;
 01B8           ;               cmd=cmd>>1;
 01B8           ;       }
 01B8           ;       LOAD_OUT1;    //LOAD上升沿加载一帧数据
 01B8 A89A              sbi 0x15,0
 01BA                   .dbline 242
 01BA           ;       DIN_OUT1;
 01BA AA9A              sbi 0x15,2
 01BC                   .dbline 243
 01BC           ;       DCLK_OUT1;
 01BC A99A              sbi 0x15,1
 01BE                   .dbline 244
 01BE           ;       keyvalue=0;
 01BE 6627              clr R22
 01C0                   .dbline 245
 01C0           ;       for(i=0;i<7;i++)
 01C0 4427              clr R20
 01C2 0AC0              rjmp L32
 01C4           L29:
 01C4                   .dbline 246
 01C4           ;       {
 01C4                   .dbline 247
 01C4           ;           keyvalue<<=1;
 01C4 660F              lsl R22
 01C6                   .dbline 248
 01C6           ;               if(DOUT_PIN)
 01C6 829B              sbis 0x10,2
 01C8 04C0              rjmp L33
 01CA                   .dbline 249
 01CA           ;               {
 01CA                   .dbline 250
 01CA           ;                   keyvalue=keyvalue+1;
 01CA 6395              inc R22
 01CC                   .dbline 251
 01CC           ;                       Uart_Transmit(0x01);
 01CC 01E0              ldi R16,1
 01CE 10E0              ldi R17,0
 01D0 00D0              rcall _Uart_Transmit
 01D2                   .dbline 252
 01D2           ;               }
 01D2           L33:
 01D2                   .dbline 253
 01D2 A998              cbi 0x15,1
 01D4                   .dbline 254
 01D4 A99A              sbi 0x15,1
 01D6                   .dbline 255
 01D6           L30:
 01D6                   .dbline 245
 01D6 4395              inc R20
 01D8           L32:
 01D8                   .dbline 245
 01D8 4730              cpi R20,7
 01DA A0F3              brlo L29
 01DC                   .dbline 256
 01DC           ;               DCLK_OUT0;
 01DC           ;               DCLK_OUT1;
 01DC           ;       }
 01DC           ;       DCLK_OUT1;
 01DC A99A              sbi 0x15,1
 01DE                   .dbline 257
 01DE           ;       DIN_OUT1;
 01DE AA9A              sbi 0x15,2
 01E0                   .dbline 258
 01E0           ;       GICR |= 0x40;    //开中断
 01E0 8BB7              in R24,0x3b
 01E2 8064              ori R24,64
 01E4 8BBF              out 0x3b,R24
 01E6                   .dbline 259
 01E6           ;       GIFR = 0x40;   //清中断标志INT0
 01E6 80E4              ldi R24,64
 01E8 8ABF              out 0x3a,R24
 01EA                   .dbline 260
 01EA           ;       Delay_Nus(5);
 01EA 05E0              ldi R16,5
 01EC 10E0              ldi R17,0
 01EE 00D0              rcall _Delay_Nus
 01F0                   .dbline 261
 01F0           ;       return keyvalue;
 01F0 062F              mov R16,R22
 01F2                   .dbline -2
 01F2           L22:
 01F2 00D0              rcall pop_gset3
 01F4                   .dbline 0 ; func end
 01F4 0895              ret
 01F6                   .dbsym l temp 1 c
 01F6                   .dbsym r keyvalue 22 c
 01F6                   .dbsym r cmd 10 c
 01F6                   .dbsym r i 20 c
 01F6                   .dbend
 01F6                   .dbfunc e Init_Int0 _Init_Int0 fV
                        .even
 01F6           _Init_Int0::
 01F6                   .dbline -1
 01F6                   .dbline 276
 01F6           ; }
 01F6           ; 
 01F6           ; /***************************************************************************
 01F6           ; *函数名:
 01F6           ; *功能:外部中断INT0的初始化,边缘触发
 01F6           ; *入口参数:无
 01F6           ; *出口参数:无
 01F6           ; *中断方式说明:     MCUCR         INT0中断方式
 01F6           ; *                   0x00          低电平中断
 01F6           ; *                   0x01          上升沿和下降沿都产生中断
 01F6           ; *                   0x02          下降沿产生中断
 01F6           ; *                   0x03          上升沿产生中断
 01F6           ; ****************************************************************************/
 01F6           ; void Init_Int0(void)
 01F6           ; {
 01F6                   .dbline 277
 01F6           ;     CLI(); 
 01F6 F894              cli
 01F8                   .dbline 278
 01F8           ;     MCUCR = 0x00; //0x00为低电平触发INT0中断
 01F8 2224              clr R2
 01FA 25BE              out 0x35,R2
 01FC                   .dbline 279
 01FC           ;     GICR |= 0x40; //INT0使能
 01FC 8BB7              in R24,0x3b
 01FE 8064              ori R24,64
 0200 8BBF              out 0x3b,R24
 0202                   .dbline 280
 0202           ;     TIMSK = 0x00; 
 0202 29BE              out 0x39,R2
 0204                   .dbline 281
 0204           ;     SEI(); 
 0204 7894              sei
 0206                   .dbline -2
 0206           L35:
 0206                   .dbline 0 ; func end
 0206 0895              ret
 0208                   .dbend
                        .area vector(rom, abs)
                        .org 2
 0002 04C1              rjmp _int0_isr
                        .area text(rom, con, rel)
 0208                   .dbfile G:\CH452L\ch452ldriver.c
 0208                   .dbfunc e int0_isr _int0_isr fV
                        .even
 0208           _int0_isr::
 0208 00D0              rcall push_lset
 020A                   .dbline -1
 020A                   .dbline 293
 020A           ; }
 020A           ; 
 020A           ; /***************************************************************************
 020A           ; *函数名:INT0中断服务函数
 020A           ; *功能:
 020A           ; *说明:低电平触发中断
 020A           ; *入口参数:无
 020A           ; *出口参数:无
 020A           ; ****************************************************************************/
 020A           ; #pragma interrupt_handler int0_isr:2
 020A           ; void int0_isr(void)
 020A           ; {
 020A                   .dbline 294
 020A           ;     flag=1;
 020A 81E0              ldi R24,1
 020C 90E0              ldi R25,0
 020E 90930100          sts _flag+1,R25
 0212 80930000          sts _flag,R24
 0216                   .dbline 295
 0216           ;       Uart_Transmit(0xbb);
 0216 0BEB              ldi R16,187
 0218 10E0              ldi R17,0
 021A 00D0              rcall _Uart_Transmit
 021C                   .dbline 296
 021C           ;       GIFR = 0x40;   //清中断标志INT0
 021C 80E4              ldi R24,64
 021E 8ABF              out 0x3a,R24
 0220                   .dbline -2
 0220           L36:
 0220 00D0              rcall pop_lset
 0222                   .dbline 0 ; func end
 0222 1895              reti
 0224                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile G:\CH452L\ch452ldriver.c
 0000           _flag::
 0000                   .blkb 2
 0002                   .dbsym e flag _flag i

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -