⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disp.inc

📁 keilc关于LM75A温度计的使用例程
💻 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 + -