📄 ch452ldriver.lis
字号:
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 + -