.module _训练项目四:扩展IO口的使用.c
.area text(rom, con, rel)
.even
_init::
; /****************************************************************************
; ** File Name: 扩展I/O口的使用
; ** Createed By: Wangchangsong
; ** Create Date: 07/26/2008
; ** Version: 1.0
; ** Descriptions: led display
; **
; **---------------------------------------------------------------------------
; ** Modified By:
; ** Modified Date:
; ** Version:
; ** Descriptions:
; **
; ****************************************************************************/
;
; #include
; #define CON8255 0x8003
; /* 宏定义,定义8255的地址 */
; #define A8255 0x8000
; /* 宏定义,定义8255A口地址 */
; /****************************************************************************
; ** Function Name: init
; ** Descriptions: initialization
; ** Input Parameters: viod
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void init(void) /* 初始化 */
; {
; MCUCR=MCUCR|0x80; /*允许外部存储器扩展,允许使用8255*/
in R24,0x35
ori R24,128
out 0x35,R24
; XMCRB=0x80; /* 外部存储总线保持允许 */
ldi R24,128
sts 108,R24
; w8255con(0x80); /*A口工作在模式0,A口作输出 */
ldi R16,128
ldi R17,0
xcall _w8255con
L1:
.dbline 0 ; func end
ret
; p -> R20,R21
; ctrl -> R16
.even
_w8255con::
st -y,R20
st -y,R21
; }
;
; /****************************************************************************
; ** Function Name: w8255con
; ** Descriptions:
; ** Input Parameters: ctrl
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void w8255con(unsigned char ctrl)
; {
; unsigned char *p = (unsigned char *)(CON8255); /*指针指向控制总线 */
ldi R20,32771
ldi R21,128
; *p=ctrl;
movw R30,R20
std z+0,R16
L2:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
; p -> R20,R21
; value -> R16
.even
_w8255a::
st -y,R20
st -y,R21
; }
;
; /****************************************************************************
; ** Function Name: w8255a
; ** Descriptions:
; ** Input Parameters: value
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void w8255a(unsigned char value)
; {
; unsigned char *p = (unsigned char *)(A8255); /* 指针指向8255的A口 */
ldi R20,32768
ldi R21,128
; *p=value;
movw R30,R20
std z+0,R16
L3:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
; i -> R16,R17
.even
_delay_1ms::
; }
;
; /****************************************************************************
; ** Function Name: delay_1ms
; ** Descriptions: delay time
; ** Input Parameters: void
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void delay_1ms(void) /* 延时 */
; {
; unsigned int i;
;
; for(i = 1;i < 2260;i++);
ldi R16,1
ldi R17,0
xjmp L8
L5:
L6:
subi R16,255 ; offset = 1
sbci R17,255
L8:
cpi R16,212
ldi R30,8
cpc R17,R30
brlo L5
X0:
L4:
.dbline 0 ; func end
ret
; i -> R20,R21
; uiTime -> R10,R11
.even
_delay_nms::
xcall push_xgset300C
movw R10,R16
; }
;
; /****************************************************************************
; ** Function Name: delay_nms
; ** Descriptions: delay time
; ** Input Parameters: uiTime
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void delay_nms(unsigned int uiTime) /* 延时 */
; {
; unsigned int i = 0;
clr R20
clr R21
xjmp L11
L10:
;
; while(i < uiTime)
; {delay_1ms();
xcall _delay_1ms
; i++;
subi R20,255 ; offset = 1
sbci R21,255
; }
L11:
cp R20,R10
cpc R21,R11
brlo L10
X1:
L9:
.dbline 0 ; func end
xjmp pop_xgset300C
.even
_main::
; }
;
; /****************************************************************************
; ** Function Name: main
; ** Descriptions:
; ** Input Parameters: void
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void main(void)
; {
; init();
xcall _init
xjmp L15
L14:
; while(1)
; {
; w8255a(0xfe); /* 给A口赋值 */
ldi R16,254
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xfd);
ldi R16,253
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xfb);
ldi R16,251
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xf7);
ldi R16,247
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xef);
ldi R16,239
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xdf);
ldi R16,223
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0xbf);
ldi R16,191
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
; w8255a(0x7f);
ldi R16,127
xcall _w8255a
; delay_nms(80);
ldi R16,80
ldi R17,0
xcall _delay_nms
;
; }
L15:
xjmp L14
X2:
L13:
.dbline 0 ; func end
ret
; }
;
; /****************************************************************************
; END FILE
; ****************************************************************************/