📄 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 + -