?? disp.inc
字號:
;*************************************************************************
; Disp.INC
; 數碼管掃描顯示驅動程序
;*************************************************************************
;*************************************************************************
;定義全局變量
;*************************************************************************
;定義顯示緩沖區(由定時中斷程序自動掃描)
DispBuf DATA GLOBAL_IRAM ;GLOBAL_IRAM的定義見main.asm
GLOBAL_IRAM SET GLOBAL_IRAM+8
;定義函數T1INTSVC()局部靜態變量
T1INTSVC_n DATA GLOBAL_IRAM
GLOBAL_IRAM SET GLOBAL_IRAM+1
;*************************************************************************
;函數:T1INTSVC()
;功能:定時器T1的中斷服務函數
;*************************************************************************
;void T1INTSVC() interrupt 3
T1INTSVC:
;{
PUSH ACC
PUSH PSW
PUSH 0x00
PUSH DPH
PUSH DPL
; code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
; static unsigned char n = 0;
; TR1 = 0;
; TH1 = 0xFC;
; TL1 = 0x66;
; TR1 = 1;
CLR TR1
MOV TH1, #0xFC
MOV TL1, #0x66
SETB TR1
; P1 = 0xFF; //暫停顯示
MOV P1, #0xFF
; XBYTE[0xE800] = ~DispBuf[n]; //更新掃描數據
MOV A, #DispBuf
ADD A, T1INTSVC_n
MOV R0, A
MOV A, @R0
CPL A
MOV DPTR, #0xE800
MOVX @DPTR, A
; P1 = ~com[n]; //重新顯示
MOV A, T1INTSVC_n
MOV DPTR, #T1INTSVC_com
MOVC A, @A+DPTR
CPL A
MOV P1, A
; n++;
; n &= 0x07;
INC T1INTSVC_n
ANL T1INTSVC_n, #0x07
;}
POP DPL
POP DPH
POP 0x00
POP PSW
POP ACC
RETI
T1INTSVC_com:
DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
;*************************************************************************
;函數:DispClear()
;功能:清除數碼管的所有顯示
;*************************************************************************
;void DispClear()
DispClear:
;{
; unsigned char i;
; for ( i=0; i<8; i++ )
MOV R0, #DispBuf
MOV R1, #8
CLR A
DispClear_for:
; {
; DispBuf[i] = 0x00;
MOV @R0, A
INC R0
; }
DJNZ R1, DispClear_for
;}
RET
;*************************************************************************
;函數:DispChar()
;功能:在數碼管上顯示字符
;參數:
; x:數碼管的坐標位置(0~7)
; c:要顯示的字符(僅限十進制數字和減號)
;*************************************************************************
;void DispChar(unsigned char x, unsigned char c)
;x = R7
;c = R6
DispChar:
;{
; //0123456789的數碼管字型數據
; code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
; x &= 0x07;
; x = 7 - x;
MOV A, #7
ANL 0x07, A
CLR C
SUBB A, R7
MOV R7, A
; if ( c == '-' )
CJNE R6, #'-', DispChar_elseif
; {
; DispBuf[x] = 0x40;
; }
SJMP DispChar_endif
; else if ( ( c >= '0' ) && ( c <= '9' ) )
DispChar_elseif:
BLO R6, #'0', DispChar_endif ;宏BLO的定義見Branch.INC
BHI R6, #'9', DispChar_endif ;宏BHI的定義見Branch.INC
; {
; DispBuf[x] = Tab[c-'0'];
MOV A, #DispBuf
ADD A, R7
MOV R0, A
MOV A, R6
CLR C
SUBB A, #'0'
MOV DPTR, #DispChar_Tab
MOVC A, @A+DPTR
MOV @R0, A
; }
DispChar_endif:
;}
RET
DispChar_Tab:
; 0123456789的數碼管字型數據
DB 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
;*************************************************************************
;函數:DispStr()
;功能:在數碼管上顯示字符串
;參數:
; x:數碼管的坐標位置(0~7)
; *s:要顯示的字符串(字符僅限十進制數字和減號)
;*************************************************************************
;void DispStr(unsigned char x, unsigned char *s)
;x = R7
;*s = (0x08,0x09,0x0A)
DispStr:
;{
PUSH 0x02
PUSH 0x03
PUSH 0x06
; unsigned char c;
; 分配:c = R3
MOV A, R7
MOV R2, A
; for (;;)
DispStr_for:
; {
; c = *s;
MOV R1, 0x08
MOV DPH, 0x09
MOV DPL, 0x0A
LCALL BytePtrLD
MOV R3, A
; if ( c == '\0' ) break;
JZ DispStr_endfor
; s++;
INC_W 0x09, 0x0A
; DispChar(x,c);
MOV A, R3
MOV R6, A
MOV A, R2
MOV R7, A
LCALL DispChar
; x++;
INC R2
; }
SJMP DispStr_for
DispStr_endfor:
POP 0x06
POP 0x03
POP 0x02
;}
RET
;*************************************************************************
;函數:DispDotOn()
;功能:顯示指定位的小數點
;參數:x為數碼管坐標
;*************************************************************************
;void DispDotOn(unsigned char x)
;x = R7
DispDotOn:
;{
; DispBuf[7-x] |= 0x80;
MOV A, #7
CLR C
SUBB A, R7
ADD A, #DispBuf
MOV R0, A
MOV A, @R0
ORL A, #0x80
MOV @R0, A
;}
RET
;*************************************************************************
;函數:DispInit()
;功能:數碼管掃描顯示初始化
;*************************************************************************
;void DispInit()
DispInit:
;{
; DispClear();
LCALL DispClear
; EA = 0;
; TMOD &= 0x0F;
; TMOD |= 0x10;
; TH1 = 0xFC;
; TL1 = 0x66;
; TR1 = 1;
; ET1 = 1;
; EA = 1;
CLR EA
ANL TMOD, #0x0F
ORL TMOD, #0x10
MOV TH1, #0xFC
MOV TL1, #0x66
SETB TR1
SETB ET1
SETB EA
;}
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -