?? at24c02.asm
字號:
;*****************************************************************************************
;程序說明
;*****************************************************************************************
;名稱: MCS8051-III學習板演示程序(AT24C02測試)
;功能: 保存鍵盤值到AT24C02中并在數碼管顯示
;版本:2007-07-01
;*****************************************************************************************
;硬件說明
;*****************************************************************************************
;單片機: 兼容MCS-51單片機/STC89C51
;晶振頻率: 12MHz
;*****************************************************************************************
;說明:程序預定義
;*****************************************************************************************
LED7A_CTRL EQU P1.7 ;數碼管第一位控制引腳(0為有效,1為無效)
LED7B_CTRL EQU P1.6 ;數碼管第二位控制引腳(0為有效,1為無效)
LED7C_CTRL EQU P1.5 ;數碼管第三位控制引腳(0為有效,1為無效)
LED7D_CTRL EQU P1.4 ;數碼管第四位控制引腳(0為有效,1為無效)
LED7_STATUS EQU P0 ;數碼管狀態引腳(0為有效,1為無效)
LED7A_DATA EQU 70H ;數碼管第一位顯示值(千位)
LED7B_DATA EQU 71H ;數碼管第二位顯示值(百位)
LED7C_DATA EQU 72H ;數碼管第三位顯示值(十位)
LED7D_DATA EQU 73H ;數碼管第四位顯示值(個位)
LED7_NUM EQU 74H ;數碼管動態掃描值(值為從0到3)
KEY_STATUS EQU P2 ;鍵盤狀態引腳
IIC_SDA EQU P1.1 ;IIC總線SDA引腳定義
IIC_SCL EQU P1.0 ;IIC總線SCL引腳定義
;*****************************************************************************************
;說明:程序開始
;*****************************************************************************************
ORG 0000H ;程序首地址 PC=0000H
JMP START ;程序跳轉到START PC=0030H
ORG 000BH ;T0中斷程序入口
JMP LED7SCAN ;數碼管動態掃描處理程序
ORG 0030H ;程序開始
START:
CLR IIC_SCL ;IIC時鐘引腳至0
CLR P1.7
;T0中斷設定
MOV TMOD, #00000001B ;使用T0:GATE=0,C/T=0(定時),M1 M0=01(工作方式1)
MOV TH0, #0ECH ;定時時間5毫秒
MOV TL0, #078H
SETB ET0 ;允許T0中斷
SETB TR0 ;使T0工作
MOV A, #0 ;AT24C02的地址值為0
CALL AT24C02_READBYTE ;AT24C02讀操作,讀出數據存放在A中
SETB EA ;總中斷開啟
MOV LED7A_DATA, A ;數碼管第一位初始值
MOV LED7B_DATA, A ;數碼管第二位初始值
MOV LED7C_DATA, A ;數碼管第三位初始值
MOV LED7D_DATA, A ;數碼管第四位初始值
MOV LED7_NUM, #0 ;數碼管動態掃描值至0,掃描第一位
MOV DPTR, #KEYTAB ;鍵盤編碼表地址送DPTR
;檢測鍵盤
MOV R5, #0EFH ;置掃描碼初值
MOV R4, #04H ;置循環掃描次數為4次
L1:
MOV R3, #16 ;置判斷鍵盤碼循環次數為15次
MOV KEY_STATUS, R5 ;將掃描碼置鍵盤引腳
MOV A, R5 ;改變掃描碼
RL A
MOV R5, A
MOV A, KEY_STATUS
ANL A, #0FH ;判斷是否有按鍵按下
CJNE A, #0FH, L2 ;若有按鍵按下則轉到L2
JMP L4 ;若無則轉到L4
L2:
MOV A, R3 ;根據鍵盤碼判斷那個鍵按下
DEC A
MOVC A, @A+DPTR
CJNE A, KEY_STATUS, L3
MOV A, R3
DEC A
MOV LED7A_DATA, A ;將顯示值放到數碼管顯示值中
MOV LED7B_DATA, A
MOV LED7C_DATA, A
MOV LED7D_DATA, A
;將鍵盤值保存在AT24CO2中
MOV R5, A
MOV A, #0
CALL AT24C02_WRITEBYTE
JMP L4
L3:
DJNZ R3, L2
L4:
DJNZ R4, L1
MOV R5, #0EFH ;置掃描碼初值
MOV R4, #04H ;置循環掃描次數為4次
JMP L1
;*****************************************************************************************
;函數:LEDSCAN
;說明: 數碼管動態掃描處理程序
;參數:
;返回; 無
;*****************************************************************************************
LED7SCAN:
PUSH ACC ;ACC入棧
PUSH PSW ;PSW入棧
PUSH DPL ;DPL入棧
PUSH DPH ;DPH入棧
MOV DPTR,#LED7TAB ;數碼管顯示碼表地址送DPTR
MOV A, LED7_NUM ;數碼管動態掃描值送A
CJNE A, #0, LED7SCAN_1 ;若數碼管動態掃描值為0,則處理數碼管的第一位,否則跳轉到LED7SCAN_1
SETB LED7D_CTRL ;設置數碼管第四位無效
MOV A, LED7A_DATA ;將千位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7A_CTRL ;設置數碼管第一位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_1:
CJNE A, #1, LED7SCAN_2 ;若數碼管動態掃描值為1,則處理數碼管的第二位,否則跳轉到LED7SCAN_2
SETB LED7A_CTRL ;設置數碼管第一位無效
MOV A, LED7B_DATA ;將百位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7B_CTRL ;設置數碼管第二位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_2:
CJNE A, #2, LED7SCAN_3 ;若數碼管動態掃描值為2,則處理數碼管的第三位,否則跳轉到LED7SCAN_3
SETB LED7B_CTRL ;設置數碼管第二位無效
MOV A, LED7C_DATA ;將十位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7C_CTRL ;設置數碼管第三位有效
JMP LED7SCAN_4 ;跳轉到LED7SCAN_4
LED7SCAN_3:
SETB LED7C_CTRL ;設置數碼管第三位無效
MOV A, LED7D_DATA ;將個位值送A
MOVC A, @A+DPTR ;將顯示碼送A
CLR LED7D_CTRL ;設置數碼管第四位有效
MOV LED7_NUM, #0 ;數碼管動態掃描值置0
JMP LED7SCAN_5 ;跳轉到LED7SCAN_5
LED7SCAN_4:
INC LED7_NUM ;數碼管動態掃描值加1
LED7SCAN_5:
MOV LED7_STATUS, A ;顯示碼送數碼管狀態引腳
MOV TH0, #0ECH ;重新設置T0定時值
MOV TL0, #078H
POP DPH ;DPH出棧
POP DPL ;DPL出棧
POP PSW ;PSW出棧
POP ACC ;ACC出棧
RETI ;中斷返回
;*****************************************************************************************
;IIC總線處理函數
;*****************************************************************************************
IIC_START: ;IIC起始函數
SETB IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
CLR IIC_SDA
NOP
NOP
NOP
NOP
CLR IIC_SCL
RET
IIC_STOP: ;IIC結束函數
CLR IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
SETB IIC_SDA
NOP
NOP
NOP
NOP
CLR IIC_SCL
RET
IIC_ACK: ;IIC應答函數
CLR IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
SETB IIC_SDA
CLR IIC_SCL
RET
IIC_NACK: ;IIC反應答函數
SETB IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
CLR IIC_SDA
CLR IIC_SCL
RET
IIC_WBYTE: ;IIC寫字節函數
MOV R7, #8
IIC_WBYTE_1:
RLC A
JC IIC_WBYTE_2
CLR IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
CLR IIC_SCL
DJNZ R7, IIC_WBYTE_1
RET
IIC_WBYTE_2:
SETB IIC_SDA
SETB IIC_SCL
NOP
NOP
NOP
NOP
CLR IIC_SCL
CLR IIC_SDA
DJNZ R7, IIC_WBYTE_1
RET
IIC_RBYTE: ;IIC讀字節函數
MOV R7, #8
IIC_RBYTE_1:
SETB IIC_SDA
SETB IIC_SCL
MOV C, IIC_SDA
MOV A, R6
RLC A
MOV R6, A
CLR IIC_SCL
DJNZ R7, IIC_RBYTE_1
RET
;*****************************************************************************************
;名稱:AT24C02_WRITEBYTE:
;說明:AT24C02寫字節操作
;參數: A存放寫入地址,R5存放寫入數據
;返回: 無
;*****************************************************************************************
AT24C02_WRITEBYTE:
PUSH ACC
CALL IIC_START
MOV A, #10100000B
CALL IIC_WBYTE
CALL IIC_ACK
POP ACC
CALL IIC_WBYTE
CALL IIC_ACK
MOV A, R5
CALL IIC_WBYTE
CALL IIC_ACK
CALL IIC_STOP
RET
;*****************************************************************************************
;名稱:AT24C02_READBYTE
;說明:AT24C02讀字節操作
;參數: A存放讀出地址
;返回: A存放讀出數據
;*****************************************************************************************
AT24C02_READBYTE:
PUSH ACC
CALL IIC_START
MOV A, #10100000B
CALL IIC_WBYTE
CALL IIC_ACK
POP ACC
CALL IIC_WBYTE
CALL IIC_ACK
CALL IIC_START
MOV A, #10100001B
CALL IIC_WBYTE
CALL IIC_ACK
CALL IIC_RBYTE
CALL IIC_NACK
CALL IIC_STOP
RET
;*****************************************************************************************
;說明:七段數碼管十六進制顯示碼表
;*****************************************************************************************
LED7TAB:
DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 080H, 090H ;從'0'到'9'
DB 088H, 083H, 0C6H, 0A1H, 086H, 08EH, 0FFH ;從'A'到'F'
;*****************************************************************************************
;說明:鍵盤十六進制編碼表
;*****************************************************************************************
KEYTAB:
DB 0DEH, 0E7H, 0D7H, 0B7H, 0EBH, 0DBH, 0BBH, 0EDH, 0DDH, 0BDH ;從'0'到'9'
DB 077H, 07BH, 07DH, 07EH, 0BEH, 0EEH ;從'A'到'F'
;*****************************************************************************************
;說明:程序結束
;*****************************************************************************************
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -