?? main.asm
字號(hào):
LDI R0 ,04H ;發(fā)送D7~D4共4位SEND_D7_D4: ANDIM PA_TMP ,0011B ;開(kāi)始發(fā)數(shù)據(jù),同時(shí)發(fā)送D7,因D7~D4為0,故此位為0 STA PA CALL DELAY_1MS ;調(diào)用延時(shí)1MS的子程式 ORIM PA_TMP ,0100B ;將CLK置為高 STA PA CALL DELAY_1MS ;將時(shí)鐘置為高后再延時(shí)1MS SBIM R0 ,01H BNZ SEND_D7_D4 LDI R0 ,04H ;發(fā)送D3~D0共4位SEND_D3_D0: ANDIM PA_TMP ,1011B LDA SEND_COM ;發(fā)送的命令字 BA3 $+3 ANDIM PA_TMP ,0111B ;發(fā)送的是0 JMP $+2 ORIM PA_TMP ,1000B ;發(fā)送的位為1 LDA PA_TMP ,00H STA PA ;發(fā)送數(shù)字每次發(fā)送總是在下降沿發(fā)送 CALL DELAY_1MS ;調(diào)用延時(shí)1MS的子程式 ORIM PA_TMP ,0100B ;將CLK置為高 STA PA CALL DELAY_1MS ;調(diào)用延時(shí)1MS的子程式 LDA SEND_COM,00H ADDM SEND_COM,00H ;將發(fā)送的命令位左移一位 BNC $+2 ORIM SEND_COM,0001B ;循環(huán)移動(dòng),這樣發(fā)送完命令后,命令字不會(huì)改變 SBIM R0 ,01H BNZ SEND_D3_D0 ;如果4位已發(fā)出,則說(shuō)明命令已發(fā)送完畢 ANDIM PA_TMP ,0111B STA PA ;將DATA置為低SEND_CHECK: ;檢查發(fā)送的是不是讀的命令,如果發(fā)送的是讀的命令,就要從讀的端口 ;讀出狀態(tài),然后再顯示出來(lái)(從PF1口讀出) SBI SEND_COM,09H ;檢查剛才是否發(fā)送的是讀狀態(tài)的命令字 BNZ SEND_COM_EXIT CALL DELAY_1MS ;再延時(shí)1MS CALL DELAY_1MS ;共延時(shí)2MS,然后讀狀態(tài) LDI RD_CNT_L,00H LDI RD_CNT_H,00H ;還沒(méi)有開(kāi)始計(jì)時(shí),所以將讀入個(gè)數(shù)清零 CALL DELAY_1MS ;再延時(shí)1MSSEND_READ_ING: ;在讀取數(shù)的過(guò)程中 ANDIM PA_TMP ,1011B ;由高變?yōu)榈偷臅r(shí)候讀狀態(tài) STA PA LDA RD_STATUS1,00H ADDM RD_STATUS1,00H LDA RD_STATUS2,00H ADCM RD_STATUS2,00H LDA RD_STATUS3,00H ADCM RD_STATUS3,00H LDA RD_STATUS4,00H ADCM RD_STATUS4,00H LDA RD_STATUS5,00H ADCM RD_STATUS5,00H LDA RD_STATUS6,00H ADCM RD_STATUS6,00H LDA RD_STATUS7,00H ADCM RD_STATUS7,00H LDA RD_STATUS8,00H ADCM RD_STATUS8,00H LDA RD_STATUS9,00H ADCM RD_STATUS9,00H LDA RD_STATUS10,00H ADCM RD_STATUS10,00H LDA RD_STATUS11,00H ADCM RD_STATUS11,00H LDA RD_STATUS12,00H ADCM RD_STATUS12,00H LDA RD_STATUS13,00H ADCM RD_STATUS13,00H LDA RD_STATUS14,00H ADCM RD_STATUS14,00HSEND_READ_STATUS: NOP NOP LDA PD ;每次是下降沿讀狀態(tài) BA2 $+3 LDI R0 ,00H ;第一次讀的是0的寄存器 JMP $+2 LDI R0 ,01H ;第一次讀的值是1 NOP NOP LDA PD BA2 $+3 LDI R1 ,00H ;第二次讀的值是0 JMP $+2 LDI R1 ,01H ;第二次讀的值是1 LDA R0 ,00H SUB R1 ,00H BNZ SEND_READ_STATUS;如果兩次讀的值不一樣,再讀一次,這樣就可以了 SBI R0 ,01H BAZ $+3 ANDIM RD_STATUS1,1110B;讀到的值是0 JMP $+2 ORIM RD_STATUS1,0001B;讀到的值是1 CALL DELAY_1MS ;讀完數(shù)據(jù)后再延時(shí)1MS ORIM PA_TMP ,0100B ;將SCL置為1 STA PA CALL DELAY_1MS ;變?yōu)楦吆笤傺訒r(shí)1MS ADIM RD_CNT_L,01H LDI R0 ,00H ADCM RD_CNT_H,00H SBI RD_CNT_L,08H ;一共是讀56(10進(jìn)制)=38(16進(jìn)制)個(gè) LDI R0 ,03H SBC RD_CNT_H,00H BNC SEND_READ_ING ;如果還沒(méi)有讀到56個(gè)數(shù)則繼續(xù)讀SEND_COM_EXIT: NOP NOP NOP RTNI;----------------------------------------------------------------- DELAY_1MS: ;延時(shí)1MS的子程式 LDI R1 ,00H LDI R2 ,04HDELAY_1MS_ING: ;如果沒(méi)有把這個(gè)數(shù)減為0,則不停延時(shí) LDI WDT ,08H SBIM R1 ,01H LDI R3 ,00H SBCM R2 ,00H BC DELAY_1MS_INGDELAY_1MS_EXIT: RTNI;=================================================================DELAY_5MS: ;延時(shí)5MS的子程式 LDI R1 ,0ah;01H LDI R2 ,0ch;04H LDI R3 ,02h;03HDELAY_5MS_ING: ;如果沒(méi)有把這個(gè)數(shù)減為0,則不停延時(shí) LDI WDT ,08H SBIM R1 ,01H LDI R0 ,00H SBCM R2 ,00H LDI R0 ,00H SBCM R3 ,00H BC DELAY_5MS_ING RTNI;=================================================================DELAY_20MS: ;延時(shí)5MS的子程式 LDI R1 ,09h;01H LDI R2 ,02h;04H LDI R3 ,0bh;03HDELAY_20MS_ING: ;如果沒(méi)有把這個(gè)數(shù)減為0,則不停延時(shí) LDI WDT ,08H SBIM R1 ,01H LDI R0 ,00H SBCM R2 ,00H LDI R0 ,00H SBCM R3 ,00H BC DELAY_20MS_ING RTNI;=================================================================DELAY_5S: ;延時(shí)5MS的子程式 LDI R4 ,07H LDI R3 ,0AH LDI R2 ,01H LDI R1 ,02H LDI R0 ,00HDELAY_5S_ING: ;如果沒(méi)有把這個(gè)數(shù)減為0,則不停延時(shí) LDI WDT ,08H SBIM R0 ,01H EOR R0 ,00H SBCM R1 ,00H EOR R1 ,00H SBCM R2 ,00H EOR R2 ,00H SBCM R3 ,00H EOR R3 ,00H SBCM R4 ,00H BC DELAY_5S_ING RTNI;=================================================================;=================================================================READ_DATA: ORIM PACNT ,0011B ;每寫(xiě)入1次就讀1次,讀完之后改變顯示數(shù)據(jù) CALL start_i2c call delay_2us ldi ROM_DATA,1010b call write_byte ldi ROM_DATA,0000b ;device address call write_byte call ack_sub LDA I2C_ERRO_CNT,00H BNZ READ_DATA_EXIT lda DATA_ADDRH,00h sta ROM_DATA,00h call write_byte lda DATA_ADDRL,00h sta ROM_DATA,00h ;read address call write_byte call ack_sub LDA I2C_ERRO_CNT,00H BNZ READ_DATA_EXIT ////---------------------read_data2: call scl_low ;將SCL置為低 call delay_2us call start_i2c call delay_2us ////--------------------- ldi ROM_DATA,1010b call write_byte ldi ROM_DATA,0001b ;read commande call write_byte call ack_sub LDA I2C_ERRO_CNT,00H BNZ READ_DATA_EXIT ////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LDI PACNT ,1101B ;sda input ////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ldi READ_DATAL,00h ldi READ_DATAH,00h LDI READ_CNT ,08H ;讀入的數(shù)據(jù)read_loop: call scl_low call delay_2us call scl_high lda READ_DATAH,00h addm READ_DATAH,00h lda READ_DATAL,00h addm READ_DATAL,00h bnc d1_bit0_0 orim READ_DATAH,01hd1_bit0_0: nop nop LDA PA ,00h ;原程序PA.2為SDA,現(xiàn)在程序PA.1為SDA BA1 is_bit_1 ;原程序PA.3為SCL,;現(xiàn)在程序PA.0為SCL jmp cnt_subis_bit_1: orim READ_DATAL,01hcnt_sub: sbim READ_CNT,01h bnz read_loop ////%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ldi PACNT,1111B ANDIM PA_TMP ,1110B ORIM PA_TMP ,0010B STA PA call delay_2us ORIM PA_TMP ,0001B STA PA call delay_2us call stop_i2c call delay_2usREAD_DATA_EXIT: rtni////=====================================================WRITE_DATA:write_data_on: call start_i2c call delay_2us ldi ROM_DATA,1010b call write_byte ldi ROM_DATA,0000b ;device address call write_byte call ack_sub LDA I2C_ERRO_CNT,00H BNZ WRITE_DATA_EXIT lda DATA_ADDRH,00h sta ROM_DATA,00h call write_byte lda DATA_ADDRL,00h sta ROM_DATA,00h ;write address call write_byte call ack_sub LDA I2C_ERRO_CNT,00H BNZ WRITE_DATA_EXIT; ldi DATA_H,02H lda DATA_H,00H sta ROM_DATA,00h call write_byte LDA DATA_L,00H sta ROM_DATA,00h ;write data call write_byte call ack_sub; LDA I2C_ERRO_CNT,00H; BNZ WRITE_DATA_EXIT call stop_i2cWRITE_DATA_EXIT: nop rtni////=====================================================write_byte: LDI R0 ,04H ;因?yàn)閭魉偷臄?shù)字為4位write_in: call scl_low ;將SCL信號(hào)置為低 LDA ROM_DATA,00H ;將要傳送的數(shù)的最高位送給SDA BA3 $+3 ANDIM PA_TMP ,1101B ;;原程序PA.2為SDA,現(xiàn)在程序PA.1為SDA JMP $+2 ORIM PA_TMP ,0010B ;傳送的最高位為1 STA PA CALL delay_2us call scl_high ;將SCL信號(hào)置為高 call delay_2us SBIM R0 ,01H ;將傳送數(shù)字的個(gè)數(shù)減1,如果沒(méi)有傳送完再傳送 BAZ write_exit ;傳數(shù)結(jié)束 LDA ROM_DATA,00H ADDM ROM_DATA,00H ;將DATA1左移一位 JMP write_inwrite_exit: RTNI////=====================================================ack_sub: call scl_low ;將SCL信號(hào)置為低 call delay_2us ORIM PA_TMP ,0010B STA PA LDI PACNT ,1101B ;將SDA置為輸入腳 call delay_2us call scl_high ;將SCL信號(hào)置為高 LDI R0 ,00H nop nop nopack_wait: nop nop ADIM R0 ,01H BC ack_wrong LDA PA ,00H BA1 ack_waitack_right: ;ack的信號(hào)是正常的 LDI I2C_ERRO_CNT ,00H;24C02讀錯(cuò)的次數(shù)清零 JMP ack_exit ;ack檢查完畢ack_wrong: ;ACK信號(hào)在長(zhǎng)時(shí)間內(nèi)沒(méi)有收到,則不記憶 ADIM I2C_ERRO_CNT ,01H;24C02設(shè)定讀錯(cuò)一次的次數(shù)ack_exit: LDI PACNT ,1111B call delay_2us rtni////=====================================================scl_low: ANDIM PA_TMP ,1110B ;scl low STA PA RTNI////=====================================================scl_high: orim PA_TMP ,0001B STA PA RTNI////=====================================================start_i2c: LDI PA_TMP ,1111B STA PA call delay_2us ANDIM PA_TMP ,1101B ;sda low,start I2C STA PA RTNI////=====================================================stop_i2c: call scl_low call delay_2us andim PA_TMP ,1100B ;sda low STA PA nop nop call scl_high call delay_2us ORIM PA_TMP ,0010B ;sda high when scl high,stop STA PA call delay_2us rtni////=====================================================delay_2us: nop nop nop nop rtni/////====================================================////===================================================== ;-----------------------------------------------------------------;=================================================================;=================================================================;================================================================= include "sh69p20c.h" include "vartable.inc";================================================================= END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -