📄 led_gpio.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oled_gpio.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips LED_GPIO\LED_GPIO.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
SSP_Init PROC
;;;29
;;;30 PCONP |= 1<<10;//SSP POWER ENABLE
000000 e59f00d4 LDR r0,|L1.220|
000004 e59000c4 LDR r0,[r0,#0xc4]
000008 e3800b01 ORR r0,r0,#0x400
00000c e59f10c8 LDR r1,|L1.220|
000010 e58100c4 STR r0,[r1,#0xc4]
;;;31 SSPCR0 = (0x01 << 8) | // SCR 设置SPI时钟分频
000014 e59f00c4 LDR r0,|L1.224|
000018 e2411965 SUB r1,r1,#0x194000
00001c e1c100b0 STRH r0,[r1,#0]
;;;32 (0x00 << 7) | // CPHA 时钟输出相位,仅SPI模式有效
;;;33 (0x00 << 6) | // CPOL 时钟输出极性,仅SPI模式有效
;;;34 (0x00 << 4) | // FRF 帧格式 00=SPI,01=SSI,10=Microwire,11=保留
;;;35 (0x07 << 0); // DSS 数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
;;;36
;;;37 SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能,1=禁止,0=允许
000020 e3a00002 MOV r0,#2
000024 e5c10004 STRB r0,[r1,#4]
;;;38 (0x00 << 2) | // MS 主从选择,0=主机,1=从机
;;;39 (0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
;;;40 (0x00 << 0); // LBM 回写模式
;;;41 SSPCPSR = 0x52; //预分频
000028 e3a00052 MOV r0,#0x52
00002c e5c10010 STRB r0,[r1,#0x10]
;;;42 // SSPIMSC = 0x02;
;;;43 // SSPICR = 0x03; // 中断清除寄存器
;;;44
;;;45 /*VICVectCntl2 = (0x20 | 11); // SSP中断为最高优先级
;;;46 VICVectAddr2 = (int)SSP_IRQ; // 设置中断向量地址
;;;47 VICIntEnable = (1 << 11); // 允许SSP中断 */
;;;48 }
000030 e12fff1e BX lr
ENDP
SSP_SendData PROC
;;;64 uint8 SSP_SendData(uint8 data)
;;;65 {
000034 e1a01000 MOV r1,r0
;;;66 IO1CLR = HC595_CS; // 选择从机
000038 e3a00601 MOV r0,#0x100000
00003c e59f20a0 LDR r2,|L1.228|
000040 e582001c STR r0,[r2,#0x1c]
;;;67 SSPDR = data;
000044 e1820140 ORR r0,r2,r0,ASR #2
000048 e1c010b8 STRH r1,[r0,#8]
;;;68 while( (SSPSR & 0x01) == 0 ); // 等待TFE置位,即发送FIFO空
00004c e1a00000 MOV r0,r0
|L1.80|
000050 e59f0090 LDR r0,|L1.232|
000054 e5d0000c LDRB r0,[r0,#0xc]
000058 e3100001 TST r0,#1
00005c 0afffffb BEQ |L1.80|
;;;69 IO1SET = HC595_CS;
000060 e3a00601 MOV r0,#0x100000
000064 e59f2078 LDR r2,|L1.228|
000068 e5820014 STR r0,[r2,#0x14]
;;;70 return(SSPDR);
00006c e1820140 ORR r0,r2,r0,ASR #2
000070 e1d000b8 LDRH r0,[r0,#8]
000074 e20000ff AND r0,r0,#0xff
;;;71 }
000078 e12fff1e BX lr
ENDP
SSP_READ_GPIO PROC
;;;85
;;;86 IO0CLR =HC165_SH_LD; //低电平是读取寄存器值
00007c e3a01601 MOV r1,#0x100000
000080 e59f205c LDR r2,|L1.228|
000084 e582100c STR r1,[r2,#0xc]
;;;87 while (0== (SSPSR & 0x4)); //如果接受FIFO为空时就在此循环等待
000088 e1a00000 MOV r0,r0
|L1.140|
00008c e59f1054 LDR r1,|L1.232|
000090 e5d1100c LDRB r1,[r1,#0xc]
000094 e3110004 TST r1,#4
000098 0afffffb BEQ |L1.140|
;;;88 temp =SSPDR;
00009c e59f1044 LDR r1,|L1.232|
0000a0 e1d110b8 LDRH r1,[r1,#8]
0000a4 e20100ff AND r0,r1,#0xff
;;;89 IO0SET =HC165_SH_LD; //高电平时允许移位
0000a8 e3a01601 MOV r1,#0x100000
0000ac e59f2030 LDR r2,|L1.228|
0000b0 e5821004 STR r1,[r2,#4]
;;;90 return temp;
;;;91 }
0000b4 e12fff1e BX lr
ENDP
SSP_SEND_LED PROC
;;;97 uint8 SSP_SEND_LED(int num)
;;;98 {
0000b8 e92d4010 PUSH {r4,lr}
0000bc e1a03000 MOV r3,r0
;;;99 volatile uint8 rcv;
;;;100 rcv=SSP_SendData(DISP_TAB[num]);
0000c0 e59f1024 LDR r1,|L1.236|
0000c4 e7d10003 LDRB r0,[r1,r3]
0000c8 ebfffffe BL SSP_SendData
0000cc e1a04000 MOV r4,r0
;;;101 return rcv;
0000d0 e1a00004 MOV r0,r4
0000d4 e8bd4010 POP {r4,lr}
;;;102 }
0000d8 e12fff1e BX lr
|L1.220|
0000dc e01fc000 DCD 0xe01fc000
|L1.224|
0000e0 00000107 DCD 0x00000107
|L1.228|
0000e4 e0028000 DCD 0xe0028000
|L1.232|
0000e8 e0068000 DCD 0xe0068000
|L1.236|
0000ec 00000000 DCD DISP_TAB
ENDP
AREA ||.constdata.1||, DATA, READONLY, ALIGN=0
DISP_TAB
DCB 0xc0,0xf9,0xa4,0xb0
DCB 0x99,0x92,0x82,0xf8
DCB 0x80,0x90,0x88,0x83
DCB 0xc6,0xa1,0x86,0x8e
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -