数据接收显示程序
;接收端程序
;**************
;引脚与内存定义
;**************
ORG 0000H
RS BIT P2.0
RW BIT P2.1
E BIT P2.2;LCD12864引脚定义
RESETn BIT P3.0
SI BIT P3.1
SCLK BIT P3.2
SFD BIT P3.3
SO BIT P3.4
CSn BIT P3.5
VREG_EN BIT P3.6
FIFO BIT P2.3;CC2420引脚定义
RECIEVED BIT P3.7;成功接收一帧灯指示
SHIWEI EQU 39H
GEWEI EQU 3AH
SHIFEN EQU 3BH
BAIFEN EQU 3CH
QIANFEN EQU 3DH
WANFEN EQU 3EH;存放温度数据各位
COM EQU 40H
CODER EQU 41H
ADDR EQU 42H;存放LCD12864指令、代码和地址
HIGH_BYTE EQU 50H
LOW_BYTE EQU 51H;存放CC2420寄存器内容或地址高低字节
AJMP MAIN
ORG 0030H
;******
;主程序
;******
MAIN:
MOV SP,#70H
LCALL INI_CC2420;初始化CC2420
LCALL INI_12864;初始化12864液晶屏
START:
SETB RECIEVED;灯灭
MOV A,#03H
CLR CSn
LCALL SPI_WRITE
SETB CSn;发SRXON命令,准备接收
WAIT:
JNB      SFD,$;等待开始接收
JB       SFD,$;等待接收完毕
JNB      FIFO,WAIT;判断地址识别是否正确
MOV A,#06H
CLR CSn
LCALL SPI_WRITE
SETB CSn;发SRFOFF命令,进入空闲态
MOV A,#7FH
CLR CSn
LCALL SPI_WRITE
LCALL SPI_READ
MOV R0,A
MOV R1,#30H
CONTINUE:
LCALL SPI_READ
MOV @R1,A
INC R1
DJNZ R0,CONTINUE
SETB CSn;读RX FIFO
DEC R1
CLR C
MOV A,@R1
RLC A
JNC START;CRC判断
CLR RECIEVED;灯亮
LCALL DISPLAY
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS
LCALL DELAY_40MS;显示延时320ms
LJMP START
;*******************
;显示器LCD12864初始化
;*******************
INI_12864:
MOV P2,#0F8H;RS,RW,E均置低
LCALL DELAY_40MS
MOV COM,#30H
LCALL WRI_COM;功能设定,基本指令集
LCALL DELAY_1MS
MOV COM,#30H
LCALL WRI_COM;功能设定,基本指令集
LCALL DELAY_1MS
MOV COM,#0CH
LCALL WRI_COM; 显示开,游标关,反白关
LCALL DELAY_1MS
MOV COM,#01H
LCALL WRI_COM;清除显示屏
LCALL DELAY_40MS
MOV COM,#06H
LCALL WRI_COM;进入设定点,游标右移,画面不移动
LCALL DELAY_40MS
MOV ADDR,#80H
MOV DPTR,#WELCOME1
LCALL INI_WORDS;输出第一行
MOV ADDR,#90H
MOV DPTR,#WELCOME2
LCALL INI_WORDS;输出第二行
MOV ADDR,#88H
MOV DPTR,#WELCOME3
LCALL INI_WORDS;输出第三行
MOV ADDR,#98H
MOV DPTR,#WELCOME4
LCALL INI_WORDS;输出第四行
RET
;************
;CC2420初始化
;************
INI_CC2420:
SETB VREG_EN
LCALL DELAY_1MS
LCALL DELAY_1MS
LCALL DELAY_1MS
LCALL DELAY_1MS; 开电压稳压器
CLR RESETn
LCALL DELAY_1MS
LCALL DELAY_1MS
SETB RESETn;复位
MOV A,#01H
CLR CSn
LCALL SPI_WRITE
SETB CSn
LCALL DELAY_1MS
LCALL DELAY_1MS
LCALL DELAY_1MS
LCALL DELAY_1MS;开晶振
MOV HIGH_BYTE,#01H
MOV LOW_BYTE,#0C4H
MOV A,#19H
CLR CSn
LCALL SPI_WRITE
MOV A,HIGH_BYTE
LCALL SPI_WRITE
MOV A,LOW_BYTE
LCALL SPI_WRITE
SETB CSn;修改SECCTRL0寄存器
;MOV HIGH_BYTE,#02H
;MOV LOW_BYTE,#0E2H
;MOV A,#11H
;CLR CSn
;LCALL SPI_WRITE
;MOV A,HIGH_BYTE
;LCALL SPI_WRITE
;MOV A,LOW_BYTE
;LCALL SPI_WRITE
;SETB CSn;修改MDMCTRL0寄存器,禁用地址,现因启用地址,而被注释掉
MOV HIGH_BYTE,#2AH
MOV LOW_BYTE,#56H
MOV A,#17H
CLR CSn
LCALL SPI_WRITE
MOV A,HIGH_BYTE
LCALL SPI_WRITE
MOV A,LOW_BYTE
LCALL SPI_WRITE
SETB CSn;修改RXCTRL1寄存器
MOV HIGH_BYTE,#12H
MOV LOW_BYTE,#34H
MOV A,#0EAH
CLR CSn
LCALL SPI_WRITE
MOV A,#80H
LCALL SPI_WRITE
MOV A,LOW_BYTE
LCALL SPI_WRITE
MOV A,HIGH_BYTE
LCALL SPI_WRITE
SETB CSn;写16位短地址
MOV HIGH_BYTE,#24H
MOV LOW_BYTE,#20H
MOV A,#0E8H
CLR CSn
LCALL SPI_WRITE
MOV A,#80H
LCALL SPI_WRITE
MOV A,LOW_BYTE
LCALL SPI_WRITE
MOV A,HIGH_BYTE
LCALL SPI_WRITE
SETB CSn;写PAN ID
RET
;********
;温度显示
;********
DISPLAY:
MOV ADDR,#98H
MOV COM,ADDR
LCALL WRI_COM
MOV CODER,SHIWEI
LCALL WRI_CODE;温度十位
MOV CODER,GEWEI
LCALL WRI_CODE;温度个位
MOV CODER,#2EH
LCALL WRI_CODE;小数点
MOV CODER,SHIFEN
LCALL WRI_CODE;温度十分位
MOV CODER,BAIFEN
LCALL WRI_CODE;温度百分位
MOV CODER,QIANFEN
LCALL WRI_CODE;温度千分位
MOV CODER,WANFEN
LCALL WRI_CODE;温度万分位
MOV CODER,#20H
LCALL WRI_CODE
MOV DPTR,#TEM
MOV R3,#06H
MOV R4,#00H
WRI_TEM:MOV A,R4
MOVC A,@A+DPTR
MOV CODER,A
LCALL WRI_CODE
INC R4
DJNZ R3,WRI_TEM;显示“摄氏度”
RET
;****************
;实现显示初始语句
;****************
INI_WORDS:
MOV COM,ADDR
LCALL WRI_COM
MOV R3,#16H
MOV R4,#00H
WRI_CHN:MOV A,R4
MOVC A,@A+DPTR
MOV CODER,A
LCALL WRI_CODE
INC R4
DJNZ R3,WRI_CHN
RET
;*************************
;实现P1口向LCD12864写入指令
;*************************
WRI_COM:
CLR RS
SETB RW
WC1:
MOV P1,#0FFH
SETB E
MOV A,P1
CLR E
JB ACC.7,WC1
CLR RW
MOV P1,COM
SETB E
CLR E
RET
;**************************
;实现P1口向LCD12864写入代码
;**************************
WRI_CODE:
CLR RS
SETB RW
WCODE:
MOV P1,#0FFH
SETB E
MOV A,P1
CLR E
JB ACC.7,WCODE
SETB RS
CLR RW
MOV P1,CODER
SETB E
NOP
CLR E
RET
;**************************
;通过SI线向CC2420写一个字节
;**************************
SPI_WRITE:
MOV R2,#08H
CLR C
L1:RLC A
CLR SCLK
MOV SI,C;单片机于时钟下降沿(模拟SPI硬件接口时序)更新SI线上数据
SETB SCLK;CC2420于时钟上升沿采集SI线上数据
DJNZ R2,L1
CLR SCLK
CLR A
RET
;**************************
;通过SO线从CC2420读一个字节
;**************************
SPI_READ:MOV R2,#08H
CLR C
L6:SETB SCLK
MOV C,SO;单片机于时钟上升沿(模拟SPI硬件接口时序)采集SO线上数据
RLC A
CLR SCLK;CC2420于时钟下降沿更新SO线上数据
DJNZ R2,L6
RET
;**************
;读CC2420状态字
;**************
READ_STA:MOV R2,#08H
CLR C
CLR CSn
L5:CLR SCLK
MOV C,SO;状态字首位于CSn有效时输出,且是保留位,此后,CC2420于时钟下降沿更新SO线上数据,单片机立即采集
RLC A
MOV SI,C
SETB SCLK;CC2420于时钟上升沿采集SI线上数据
DJNZ R2,L5
CLR SCLK
SETB CSn
RET
;*********
;延时1毫秒
;*********
DELAY_1MS:
MOV R6,#0FAH
L0:
NOP
NOP
DJNZ R6,L0
RET
;**********
;延时40毫秒
;**********
DELAY_40MS:
MOV R7,#64H
L4:
MOV R6,#0C6H
NOP
L2:
DJNZ R6,L2
DJNZ R7,L4
RET
;******************************
;中文内码字库,可以直接写中文字
;******************************
WELCOME1:
DB " Zigbee*CC2420  "
WELCOME2:
DB "      无线通信  "
WELCOME3:
DB "  实测当前温度  "
WELCOME4:
DB "                "
TEM:
DB "摄氏度"
END