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

📄 disp.c

📁 这是自己写的基于单片机89s52的UART口的双机通讯
💻 C
字号:
/*******************************************************************************
	动态数码管扫描显示程序
*******************************************************************************/


#include "Disp.h"
#include <REG51.h>
#include <ABSACC.h>


unsigned char DispBuf[4];	//显示缓冲区(由定时中断程序自动扫描)
unsigned char DispX;		//坐标,取值0~3
unsigned char KeyValue = '\0';


/*******************************************************************************
函数:DispClear()
功能:清除显示
*******************************************************************************/
void DispClear()
{
	unsigned char i;
	DispX = 0;
	for ( i=0; i<4; i++ )
	{
		DispBuf[i] = 0x00;
	}
	XBYTE[DPY_DIG] = 0x00;
	XBYTE[DPY_SEG] = 0x00;
}


//定义软件定时器(利用T0中断实现)
unsigned int STV;	//16位软件定时器
bit STR = 0;	//启动标志
bit STF = 0;	//溢出标志


/*******************************************************************************
函数:T0_ISR()
功能:定时器T0中断服务程序,定时扫描显示数码管
*******************************************************************************/
void T0_ISR() interrupt 1
{
	code unsigned char com[] = {0x01,0x02,0x04,0x08};
	static unsigned char n = 0;
	static unsigned char t = 50;
//重新定时
	TR0 = 0;		//暂停T0(重新定时前应当暂停)
	TH0 = 0xFC;		//重新定时1ms
	TL0 = 0x66;
	TR0 = 1;		//重启T0
//扫描数码管
	XBYTE[DPY_SEG] = 0xFF;		//暂停显示(重要操作)
	XBYTE[DPY_DIG] = com[n];	//更新位选信号
	XBYTE[DPY_SEG] = ~DispBuf[n];	//更新段选数据
	n++;
	n &= 0x03;
//处理软件定时器
	if ( STR ) if ( --STV == 0 ) STF = 1;
//扫描按键
	if ( --t == 0 )
	{
		if ( !K1 ) KeyValue = '1';
		if ( !K2 ) KeyValue = '2';
		if ( !K3 ) KeyValue = '3';
		if ( !K4 ) KeyValue = '4';
		if ( KeyValue == '\0' )
			t = 50;
		else
			t = 250;
	}
}


//键盘扫描,返回按键值
unsigned char KeyScan()
{
	unsigned char k;
	k = KeyValue;
	KeyValue = '\0';
	return k;
}


/*******************************************************************************
函数:Delay()
功能:延时0.001s~65.536s
参数:延时(t*0.001)s
*******************************************************************************/
void Delay(unsigned int t)
{
	STV = t;
	STR = 1;
	while ( !STF );
	STR = 0;
	STF = 0;
}


/*******************************************************************************
函数:DispChar()
功能:显示1个字符
参数:c为要显示的字符(仅限十进制数字)
*******************************************************************************/
void DispChar(unsigned char c)
{
	code unsigned char Tab[10] =
	{//定义数码管字型数据
		0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
	};
	if ( (c >= '0') && (c <= '9') )
	{
		DispBuf[3-DispX] = Tab[c-'0'];
		DispX++;
		DispX &= 0x03;
	}
}


/*******************************************************************************
函数:DispInit()
功能:初始化
*******************************************************************************/
void DispInit()
{
	DispClear();	//清除显示
	TMOD &= 0xF0;	//T0设置在方式1,即16位定时器
	TMOD |= 0x01;
	TH0 = 0xFC;		//定时1ms
	TL0 = 0x66;
	ET0 = 1;		//使能T0定时中断
	TR0 = 1;		//启动定时器T0
	EA = 1;			//使能总中断
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -