.module _训练项目四:扩展IO口的使用.c
.area text(rom, con, rel)
.even
0000 _init::
0000 ; /****************************************************************************
0000 ; ** File Name: 扩展I/O口的使用
0000 ; ** Createed By: Wangchangsong
0000 ; ** Create Date: 07/26/2008
0000 ; ** Version: 1.0
0000 ; ** Descriptions: led display
0000 ; **
0000 ; **---------------------------------------------------------------------------
0000 ; ** Modified By:
0000 ; ** Modified Date:
0000 ; ** Version:
0000 ; ** Descriptions:
0000 ; **
0000 ; ****************************************************************************/
0000 ;
0000 ; #include
0000 ; #define CON8255 0x8003
0000 ; /* 宏定义,定义8255的地址 */
0000 ; #define A8255 0x8000
0000 ; /* 宏定义,定义8255A口地址 */
0000 ; /****************************************************************************
0000 ; ** Function Name: init
0000 ; ** Descriptions: initialization
0000 ; ** Input Parameters: viod
0000 ; ** Output parameters: void
0000 ; ** Returned Value: void
0000 ; **---------------------------------------------------------------------------
0000 ; ****************************************************************************/
0000 ;
0000 ; void init(void) /* 初始化 */
0000 ; {
0000 ; MCUCR=MCUCR|0x80; /*允许外部存储器扩展,允许使用8255*/
0000 85B7 in R24,0x35
0002 8068 ori R24,128
0004 85BF out 0x35,R24
0006 ; XMCRB=0x80; /* 外部存储总线保持允许 */
0006 80E8 ldi R24,128
0008 80936C00 sts 108,R24
000C ; w8255con(0x80); /*A口工作在模式0,A口作输出 */
000C 00E8 ldi R16,128
000E 10E0 ldi R17,0
0010 01D0 xcall _w8255con
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 ; p -> R20,R21
0014 ; ctrl -> R16
.even
0014 _w8255con::
0014 4A93 st -y,R20
0016 5A93 st -y,R21
0018 ; }
0018 ;
0018 ; /****************************************************************************
0018 ; ** Function Name: w8255con
0018 ; ** Descriptions:
0018 ; ** Input Parameters: ctrl
0018 ; ** Output parameters: void
0018 ; ** Returned Value: void
0018 ; **---------------------------------------------------------------------------
0018 ; ****************************************************************************/
0018 ;
0018 ; void w8255con(unsigned char ctrl)
0018 ; {
0018 ; unsigned char *p = (unsigned char *)(CON8255); /*指针指向控制总线 */
0018 43E0 ldi R20,32771
001A 50E8 ldi R21,128
001C ; *p=ctrl;
001C FA01 movw R30,R20
001E 0083 std z+0,R16
0020 L2:
0020 .dbline 0 ; func end
0020 5991 ld R21,y+
0022 4991 ld R20,y+
0024 0895 ret
0026 ; p -> R20,R21
0026 ; value -> R16
.even
0026 _w8255a::
0026 4A93 st -y,R20
0028 5A93 st -y,R21
002A ; }
002A ;
002A ; /****************************************************************************
002A ; ** Function Name: w8255a
002A ; ** Descriptions:
002A ; ** Input Parameters: value
002A ; ** Output parameters: void
002A ; ** Returned Value: void
002A ; **---------------------------------------------------------------------------
002A ; ****************************************************************************/
002A ;
002A ; void w8255a(unsigned char value)
002A ; {
002A ; unsigned char *p = (unsigned char *)(A8255); /* 指针指向8255的A口 */
002A 40E0 ldi R20,32768
002C 50E8 ldi R21,128
002E ; *p=value;
002E FA01 movw R30,R20
0030 0083 std z+0,R16
0032 L3:
0032 .dbline 0 ; func end
0032 5991 ld R21,y+
0034 4991 ld R20,y+
0036 0895 ret
0038 ; i -> R16,R17
.even
0038 _delay_1ms::
0038 ; }
0038 ;
0038 ; /****************************************************************************
0038 ; ** Function Name: delay_1ms
0038 ; ** Descriptions: delay time
0038 ; ** Input Parameters: void
0038 ; ** Output parameters: void
0038 ; ** Returned Value: void
0038 ; **---------------------------------------------------------------------------
0038 ; ****************************************************************************/
0038 ;
0038 ; void delay_1ms(void) /* 延时 */
0038 ; {
0038 ; unsigned int i;
0038 ;
0038 ; for(i = 1;i < 2260;i++);
0038 01E0 ldi R16,1
003A 10E0 ldi R17,0
003C 02C0 xjmp L8
003E L5:
003E L6:
003E 0F5F subi R16,255 ; offset = 1
0040 1F4F sbci R17,255
0042 L8:
0042 043D cpi R16,212
0044 E8E0 ldi R30,8
0046 1E07 cpc R17,R30
0048 D0F3 brlo L5
004A X0:
004A L4:
004A .dbline 0 ; func end
004A 0895 ret
004C ; i -> R20,R21
004C ; uiTime -> R10,R11
.even
004C _delay_nms::
004C 0E940000 xcall push_xgset300C
0050 5801 movw R10,R16
0052 ; }
0052 ;
0052 ; /****************************************************************************
0052 ; ** Function Name: delay_nms
0052 ; ** Descriptions: delay time
0052 ; ** Input Parameters: uiTime
0052 ; ** Output parameters: void
0052 ; ** Returned Value: void
0052 ; **---------------------------------------------------------------------------
0052 ; ****************************************************************************/
0052 ;
0052 ; void delay_nms(unsigned int uiTime) /* 延时 */
0052 ; {
0052 ; unsigned int i = 0;
0052 4427 clr R20
0054 5527 clr R21
0056 03C0 xjmp L11
0058 L10:
0058 ;
0058 ; while(i < uiTime)
0058 ; {delay_1ms();
0058 EFDF xcall _delay_1ms
005A ; i++;
005A 4F5F subi R20,255 ; offset = 1
005C 5F4F sbci R21,255
005E ; }
005E L11:
005E 4A15 cp R20,R10
0060 5B05 cpc R21,R11
0062 D0F3 brlo L10
0064 X1:
0064 L9:
0064 .dbline 0 ; func end
0064 0C940000 xjmp pop_xgset300C
.even
0068 _main::
0068 ; }
0068 ;
0068 ; /****************************************************************************
0068 ; ** Function Name: main
0068 ; ** Descriptions:
0068 ; ** Input Parameters: void
0068 ; ** Output parameters: void
0068 ; ** Returned Value: void
0068 ; **---------------------------------------------------------------------------
0068 ; ****************************************************************************/
0068 ;
0068 ; void main(void)
0068 ; {
0068 ; init();
0068 CBDF xcall _init
006A 28C0 xjmp L15
006C L14:
006C ; while(1)
006C ; {
006C ; w8255a(0xfe); /* 给A口赋值 */
006C 0EEF ldi R16,254
006E DBDF xcall _w8255a
0070 ; delay_nms(80);
0070 00E5 ldi R16,80
0072 10E0 ldi R17,0
0074 EBDF xcall _delay_nms
0076 ; w8255a(0xfd);
0076 0DEF ldi R16,253
0078 D6DF xcall _w8255a
007A ; delay_nms(80);
007A 00E5 ldi R16,80
007C 10E0 ldi R17,0
007E E6DF xcall _delay_nms
0080 ; w8255a(0xfb);
0080 0BEF ldi R16,251
0082 D1DF xcall _w8255a
0084 ; delay_nms(80);
0084 00E5 ldi R16,80
0086 10E0 ldi R17,0
0088 E1DF xcall _delay_nms
008A ; w8255a(0xf7);
008A 07EF ldi R16,247
008C CCDF xcall _w8255a
008E ; delay_nms(80);
008E 00E5 ldi R16,80
0090 10E0 ldi R17,0
0092 DCDF xcall _delay_nms
0094 ; w8255a(0xef);
0094 0FEE ldi R16,239
0096 C7DF xcall _w8255a
0098 ; delay_nms(80);
0098 00E5 ldi R16,80
009A 10E0 ldi R17,0
009C D7DF xcall _delay_nms
009E ; w8255a(0xdf);
009E 0FED ldi R16,223
00A0 C2DF xcall _w8255a
00A2 ; delay_nms(80);
00A2 00E5 ldi R16,80
00A4 10E0 ldi R17,0
00A6 D2DF xcall _delay_nms
00A8 ; w8255a(0xbf);
00A8 0FEB ldi R16,191
00AA BDDF xcall _w8255a
00AC ; delay_nms(80);
00AC 00E5 ldi R16,80
00AE 10E0 ldi R17,0
00B0 CDDF xcall _delay_nms
00B2 ; w8255a(0x7f);
00B2 0FE7 ldi R16,127
00B4 B8DF xcall _w8255a
00B6 ; delay_nms(80);
00B6 00E5 ldi R16,80
00B8 10E0 ldi R17,0
00BA C8DF xcall _delay_nms
00BC ;
00BC ; }
00BC L15:
00BC D7CF xjmp L14
00BE X2:
00BE L13:
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 ; }
00C0 ;
00C0 ; /****************************************************************************
00C0 ; END FILE
00C0 ; ****************************************************************************/