出来冒个泡,那位大虾,有7寸pdf液晶屏资料手册(中文的)呀。。
发来研究下了。。以前的问题终于解决了。。keil3实现汇编。。如果没有网上的帮助,本人也不会走到这一步。。发来源代码供参考,弄得太乱,,高手勿喷。。
文章有部分取自网络。。
STM32汇编时,先打开Op
tion for target选项,linker选项卡 最上面的 user momeny layout ......那个勾去掉。。。这项尤其重要。。。。
先发了51c 后面的是stm32汇
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00005000 { ; RW data
.ANY (+RW +ZI)
}
}
#include<reg51.h>
typedef unsigned char uchar;
uchar data jianzhi;
uchar data shuzhi;
void yanshi(uchar i)
{
uchar jj,k;
for(jj=i;jj>0;jj--)
for(k=125;k>0;k--);
}
uchar saomiao()
{
uchar j;
j=P1;
j=j&0x0f;
return(j);
}
main()
{
jianzhi=0x0f;
shuzhi=0x00;
P1=0x0f;
jianzhi=saomiao();
if(jianzhi!=0x0f)
{
yanshi(10);
jianzhi=saomiao();
if(jianzhi!=0x0f)
{
switch(jianzhi)
{
case 0x0e:
shuzhi=0x01;
break;
case 0x0d:
shuzhi=0x02;
break;
case 0x0b:
shuzhi=0x03;
break;
case 0x07:
shuzhi=0x00;
break;
default:
shuzhi=0x00;
break;
}
}
}
}
BIT5 EQU 0X00000020
BIT8 EQU 0X00000100
BIT9 EQU 0X00000200
BIT10 EQU 0X00000400
LED1 EQU BIT8 ;LED1--PD.8
LED2 EQU BIT9 ;LED2--PD.9
LED3 EQU BIT10 ;LED3--PD.10
GPIOD EQU 0X40011400 ;GPIOD 地址
GPIOD_CRL EQU 0X40011400 ;低配置寄存器
GPIOD_CRH EQU 0X40011404 ;高配置寄存器
GPIOD_ODR EQU 0X4001140C ;输出,偏移地址0Ch
GPIOD_BSRR EQU 0X40011410 ;低置位,高清除偏移地址10h
GPIOD_BRR EQU 0X40011414 ;清除,偏移地址14h
IOPDEN EQU BIT5 ;GPIOD使能位
RCC_APB2ENR EQU 0X40021018
Stack_Size EQU 0x00000200
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
PRESERVE8
THUMB
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors DCD __initial_sp
DCD START
AREA |.text|, CODE, READONLY
ENTRY
START PROC
EXPORT START [WEAK]
BL.W RCC_CONFIG_72MHZ
LDR R1,=RCC_APB2ENR
LDR R0,[R1] ;读
LDR R2,=IOPDEN
ORR R0,R2 ;改
STR R0,[R1] ;写,使能GPIOD时钟
;LED1--PD.8 推挽输出,50MHz
;LED2--PD.9 推挽输出,50MHz
;LED3--PD.10 推挽输出,50MHz
MOV R0,#0x333
LDR R1,=GPIOD_CRH ;PD.8910均在高寄存器
STR R0,[R1]
NOP
NOP
LDR R1,=GPIOD_ODR
LDR R2,=0x00000F00
MOV R3,#1
LOOP
STR R2,[R1]
MOV R0,#11 ;1125/9=125ms
BL.W DELAY_NMS
EOR R2,#LED3 ;翻转LED3
ADD R3,#1 ;计数加1
CMP R3,#1
BEQ STATE1
CMP R3,#3
BEQ STATE2
CMP R3,#5
BEQ STATE3
CMP R3,#7
BEQ STATE4
CMP R3,#8
BEQ STATE5
B GOON
STATE1 ;状态1
EOR R2,#LED1
EOR R2,#LED2
B GOON
STATE2 ;状态2
EOR R2,#LED2
B GOON
STATE3 ;状态3
EOR R2,#LED1
EOR R2,#LED2
B GOON
STATE4 ;状态4
EOR R2,#LED2
B GOON
STATE5 ;状态5
MOV R3,#0
GOON
B LOOP ;继续循环
RCC_CONFIG_72MHZ
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X00010000 ;HSEON
ORR R0,R2
STR R0,[R1]
WAIT_HSE_RDY
LDR R2,=0X00020000 ;HSERDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_HSE_RDY
LDR R1,=0X40022000 ;FLASH_ACR
MOV R0,#0X12
STR R0,[R1]
LDR R1,=0X40021004 ;RCC_CFGR时钟配置寄存器
LDR R0,[R1]
;PLL倍频系数,PCLK2,PCLK1分频设置
;HSE 9倍频PCLK2=HCLK,PCLK1=HCLK/4
;HCLK=72MHz 0x001D0400
;HCLK=64MHz 0x00190400
;HCLK=48MHz 0x00110400
;HCLK=32MHz 0x00090400
;HCLK=24MHz 0x00050400
;HCLK=16MHz 0x00010400
LDR R2,=0x001D0400
ORR R0,R2
STR R0,[R1]
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X01000000 ;PLLON
ORR R0,R2
STR R0,[R1]
WAIT_PLL_RDY
LDR R2,=0X02000000 ;PLLRDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_PLL_RDY
LDR R1,=0X40021004 ;RCC_CFGR
LDR R0,[R1]
MOV R2,#0X02
ORR R0,R2
STR R0,[R1]
WAIT_HCLK_USEPLL
LDR R0,[R1]
ANDS R0,#0X08
CMP R0,#0X08
BNE WAIT_HCLK_USEPLL
BX LR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;RCC 时钟配置 HCLK=48MHz=HSE*6
;;;PCLK2=HCLK PCLK1=HCLK/2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RCC_CONFIG_48MHZ
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X00010000 ;HSEON
ORR R0,R2
STR R0,[R1]
WAIT_HSE_RDY1
LDR R2,=0X00020000 ;HSERDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_HSE_RDY1
LDR R1,=0X40022000 ;FLASH_ACR
MOV R0,#0X12
STR R0,[R1]
LDR R1,=0X40021004 ;RCC_CFGR
LDR R0,[R1]
;HSE 6倍频 PCLK2=HCLK,PCLK1=HCLK/2
LDR R2,=0X00110400
ORR R0,R2
STR R0,[R1]
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X01000000 ;PLLON
ORR R0,R2
STR R0,[R1]
WAIT_PLL_RDY1
LDR R2,=0X02000000 ;PLLRDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_PLL_RDY1
LDR R1,=0X40021004 ;RCC_CFGR
LDR R0,[R1]
MOV R2,#0X02
ORR R0,R2
STR R0,[R1]
WAIT_HCLK_USEPLL1
LDR R0,[R1]
ANDS R0,#0X08
CMP R0,#0X08
BNE WAIT_HCLK_USEPLL1
BX LR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;RCC 时钟配置 HCLK=24MHz=HSE*3
;;;PCLK2=HCLK PCLK1=HCLK/2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RCC_CONFIG_24MHZ
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X00010000 ;HSEON
ORR R0,R2
STR R0,[R1]
WAIT_HSE_RDY2
LDR R2,=0X00020000 ;HSERDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_HSE_RDY2
LDR R1,=0X40022000 ;FLASH_ACR
MOV R0,#0X12
STR R0,[R1]
LDR R1,=0X40021004 ;RCC_CFGR
LDR R0,[R1]
;HSE 3倍频PCLK2=HCLK,PCLK1=HCLK/2
LDR R2,=0X00050400
ORR R0,R2
STR R0,[R1]
LDR R1,=0X40021000 ;RCC_CR
LDR R0,[R1]
LDR R2,=0X01000000 ;PLLON
ORR R0,R2
STR R0,[R1]
WAIT_PLL_RDY2
LDR R2,=0X02000000 ;PLLRDY
LDR R0,[R1]
ANDS R0,R2
CMP R0,#0
BEQ WAIT_PLL_RDY2
LDR R1,=0X40021004 ;RCC_CFGR
LDR R0,[R1]
MOV R2,#0X02
ORR R0,R2
STR R0,[R1]
WAIT_HCLK_USEPLL2
LDR R0,[R1]
ANDS R0,#0X08
CMP R0,#0X08
BNE WAIT_HCLK_USEPLL2
BX LR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延时R0(ms),误差((R0-1)*4+12)/8 us
;延时较长时,误差小于0.1%
DELAY_NMS
PUSH {R1} ;2个周期
DELAY_NMSLOOP
SUB R0,#1
MOV R1,#10
DELAY_ONEUS
SUB R1,#1
NOP
NOP
NOP
CMP R1,#0
BNE DELAY_ONEUS
CMP R0,#0
BNE DELAY_NMSLOOP
POP {R1}
BX LR
ENDP
END
一周热门 更多>