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

📄 带eeprom的显示调试.c

📁 Keil C51
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "REG52.H"
#include "INTRINS.H"
#include "BITCTL.H"
#include "ABSACC.H"
//#include "WR_EEPROM_AT24C02_IIC.c"
#define uchar unsigned char
#define schar signed char
#define uint unsigned int
#define sint signed int

/*------------------在我们仪表上测试所添加的程序------------------------------*/
sbit WDT = P3^6;

#define  WriteDeviceAddress 0xa0 //写驱动地址指令
#define  ReadDeviceAddress 0xa1  //读驱动地址指令

//sbit AT24C02_SCL = 0xa4;		 //*****相当于sbit AT24C02_SCL = P2^4
//sbit AT24C02_SDA = 0xa5;		 //*****相当于sbit AT24C02_SDA = P2^5
sbit AT24C02_SCL = P1^5;
sbit AT24C02_SDA = P1^4;
sbit AT24C02_WP  = P2^7;

/*--------------------显示和按键的硬件定义--------------------------------------*/
#define DA P0			   //定义数码管段码输出端口
sbit DISCLK = P1^6;		   //数码管位选时钟脉冲管脚,上升沿有效
sbit DISDAT = P1^7;		   //数码管位选数据管脚
sbit KEYIN = P2^6;		   //按键扫描输入端,高电平有效
uchar code SCNT = 2;	   //按键短按防抖值
uchar code LCNT = 250;	   //按键长按界限值

/*--------------------显示和按键的全局变量-------------------------------------*/
uchar bdata TempBitByte;	//临时通用可位寻址的字节(按键扫描程序中用到)
	sbit TempBit = TempBitByte^0;		//定义临时通用位名称 (按键扫描程序中用到)
uchar ucKeyCnts[5];			//按键按下计数时间变量*****(此处设有5个按键)
uchar KeyThis;
uchar KeySFlag;			    //按键短按有效标志字节,高电平有效
uchar KeyLFlag;			    //按键短按有效标志字节,高电平有效
uchar idata MenuId=1;	    //菜单ID
uchar idata MenuStFlag=0;   //进入菜单设置项标志字节,1表示进入,0表示未进入
float idata MenuTFloat;		//菜单float临时设置值
sint idata MenuTInt;	 	//菜单sint临时设置值
schar bdata MenuTChar;		//菜单schar临时设置值
schar idata MenuTParaDot;	//菜单设置值的小数点位数
uchar idata RomAddr;		//*****(可改为局部变量)在EEPROM上菜单参数存储地址
uchar idata MenuSelWei;		//设置参数时数码管位选,0为最末位
uchar idata MenuSMGNum[4];	//存储数字转化后的数码管译码
uchar *pMenuSMG1;			//最终送到数码管显示的数码管译码地址
uchar *pMenuSMG2;		    //最终送到数码管显示的数码管译码地址(在单点表中没用到)
uchar idata key;			//按键扫描处理后的按键值*****(此处低5位对应的是5个短按键标志,^6:LongSET;^5:LongQuit;^4:SET;^3:SHIFT;^2:UP;^1:DOWN;^0:QUIT.)

/*-------------------数字对应的数码管码表格------------------------*/
uchar code table_NUM[10]= 	//0到9的数码管译码		  (共阳极)
{
        0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/
};
/*------------------菜单显示名对应数码管码----------------------*/
uchar code SMG[7][4] =	   //各菜单对应的数码管译码	   (共阳极)
{
	   		    {0x8C,/*P*/
        0x88,/*A*/
        0x92,/*S*/
        0x92},/*S*/
		        {0x8C,/*P*/
        0x88,/*A*/
        0xAF,/*r*/
        0xF9},/*1*/
		        {0x8C,/*P*/
        0x88,/*A*/
        0xAF,/*r*/
        0xA4},/*2*/
		        {0x8C,/*P*/
        0x88,/*A*/
        0xAF,/*r*/
        0xB0},/*3*/
		        {0x92,/*S*/
        0x86,/*E*/
        0x87,/*t*/
        0xF9},/*1*/
		        {0x92,/*S*/
        0x86,/*E*/
        0x87,/*t*/
        0xA4},/*2*/
		        {0x80,/*8*/
        0x80,/*8*/
        0x80,/*8*/
        0x80}/*8*/

};
/*--------------------位变量对应的on和off显示的数码管码---------------*/
uchar code SMGBIT[2][4] =	//存储'位'的数码管译码	   (共阳极)
{
        {0xFF,/**/
        0xA3,/*0*/
        0x8E,/*F*/
        0x8E,/*F*/},		//'off'
        {0xFF,/**/
        0xFF,/**/
        0xA3,/*0*/
        0xAB,/*N*/}			//'on'
};

/*--------------暂时不用--------------------
//参数test
uint code pass=1234;
uint idata set1=10;
uint idata set2=100;
uint idata  par2=0x55;
uchar idata par3=0xff;
uint idata KONG;
--------------------------------------------*/

/*-------------菜单结构体定义---------------*/
struct STMENU 		 //21个字节
{
	uchar ucMenuId;		//菜单id
	uchar ucMenuType;	//菜单类型(0为不带设置项的菜单,1为带位设置项的菜单,2为带字的设置项菜单,3为带双字的设置项菜单)
	uchar ucParaAddr;	//设置参数数在EEPROM上的地址
	uchar ucBitNum;		//若菜单类型为1,则ucBitNum表示的第几位;
	uchar ucParaDot;	//若菜单类型为4,则ucParaDot表示小数点位置,0表示整数
	sint siMax;			//设置参数的上限
	schar ucMaxDot;		//上限对应的小数点位置
	sint siMin;			//设置参数的下限
	schar ucMinDot;		//下限对应的小数点位置
	uchar ucKeyLSt;		//长按'Set'键对应
	uchar ucKeyLQt;		//长按'Quit'键对应			
	uchar ucKeySt;		//'Set'键对应
	uchar ucKeyUp;		//'Up'键对应
	uchar ucKeyDn;		//'Down'键对应
	uchar ucKeyQt;		//'Quit'键对应
	uchar ucKeySf;		//'Shift'键对应
	uchar *pucSMG1;	  	//数码管1显示内容指针
};

#define MENU struct STMENU


/*-------------菜单项结构体常量定义---------------*/
MENU code MN[]=
{ //id,tp,   ad,bn,pd,    ma,mad,    mi,mid,ls,lq,st,up,dn.qt,sf,    pu
	{0, 0, 0xfe, 0, 0,  9999,  0,     0,  0, 1, 0, 0, 0, 0, 0, 0,SMG[6]},
	{1, 2, 0x00, 0, 0,  9999,  0,     0,  0, 1, 0, 1, 4, 2, 0, 1,SMG[0]},
	{2, 0, 0xfe, 0, 0,     0,  0,     0,  0, 2, 0, 5, 1, 3, 0, 2,SMG[1]},
	{3, 2, 0x02, 0, 0,    99,  0,   -99,  0, 3, 0, 3, 2, 4, 0, 3,SMG[2]},
	{4, 1, 0x04, 2, 0,     1,  0,     0,  0, 4, 0, 4, 3, 1, 0, 4,SMG[3]},
	{5, 2, 0x06, 0, 0,   250,  0,     0,  0, 5, 0, 5, 6, 6, 2, 5,SMG[4]},
	{6, 2, 0x08, 0, 0,  9999,  0,  -999,  0, 6, 0, 6, 5, 5, 2, 6,SMG[5]}
};

/*-------------函数声明------------------*/
void Delay_us (uchar k);
void MenuOperat(uchar K1);
uchar ScanKey(void);
void InitT0(void);	 //*************在我们仪表上测试所添加的程序

bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen );
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen );

/*------------按键操作菜单函数---------------
根据按键K1值来判断并对菜单进行操作
----------------------------------------------*/
void MenuOperat(uchar K1)
{
//	uint addr;
//	addr = 	MN[MenuId].puiPara;
	switch (K1)
	{
		case 2:	 //'Quit'按钮
			if (MenuStFlag==1)			   //若是在参数设置时退出,则保存参数
			{
				switch (MN[MenuId].ucMenuType)
				{
					case 1:
						//添加'位参数'保存代码
						//pucPara = MN[MenuId].puiPara;
						//pucPara = addr;
						if (bittest(MenuTChar, 0)==1)
						{
							Read_Flash(&MenuTChar, MN[MenuId].ucParaAddr, 1);
							MenuTChar = bitset(MenuTChar, MN[MenuId].ucBitNum);	
						}
						else
						{
							Read_Flash(&MenuTChar, MN[MenuId].ucParaAddr, 1);
							MenuTChar = bitclr(MenuTChar, MN[MenuId].ucBitNum);	
						}
						Write_Flash(&MenuTChar, MN[MenuId].ucParaAddr, 1);
						break;
					case 2:
						//添加'字参数'保存代码
						//*(MN[MenuId].puiPara) = MenuTInt;
						Write_Flash(&MenuTInt, MN[MenuId].ucParaAddr, 2);
						break;
					default:
						break;	
				}
				MenuStFlag = 0;			 //退出菜单设置项的标志及位选处理
				MenuSelWei = 0;	
			}
			else
				MenuId = MN[MenuId].ucKeyQt;	  //返回上一级菜单
			break;
		
		case 4:		//'Down'按钮
			if (MenuStFlag==1)				//参数设置
			{
				switch (MN[MenuId].ucMenuType)
				{
					case 1:
						//添加'位参数'选择代码
						MenuTChar = bitcpl(MenuTChar, 0); 
						break;
					case 2:
						//添加'字参数'设置代码
						switch (MenuSelWei)
						{
							case 0: 
								MenuTInt--;
								break;
							case 1:
								MenuTInt = MenuTInt - 10;
								break;
							case 2:
								MenuTInt = MenuTInt - 100;
								break;
							case 3:
								MenuTInt = MenuTInt - 1000;
								break;
							default:
								break;
						}
						if (MenuTInt<MN[MenuId].siMin)		  //超过上限值的处理
						{
							MenuTInt = 	MN[MenuId].siMin;
						}
						break;
					default:
						break;	
				}
			}
			else
			{ 
				MenuId = MN[MenuId].ucKeyDn;
			}
			break;	
		case 8:		//'Up'按钮
			if (MenuStFlag==1)	//参数设置
			{
				switch (MN[MenuId].ucMenuType)
				{
					case 1:
						//添加'位参数'选择代码
						MenuTChar = bitcpl(MenuTChar, 0); 
						break;
					case 2:
						//添加'字参数'设置代码
						switch (MenuSelWei)
						{
							case 0: 
								MenuTInt++;
								break;
							case 1:
								MenuTInt = MenuTInt + 10;
								break;
							case 2:
								MenuTInt = MenuTInt + 100;
								break;
							case 3:
								MenuTInt = MenuTInt + 1000;
								break;
							default:
								break;
						}
						if (MenuTInt>MN[MenuId].siMax)			 //超过下限制的处理
						{
							MenuTInt = 	MN[MenuId].siMax;
						}
						break;
					default:
						break;
				}
			}
			else
				MenuId = MN[MenuId].ucKeyUp;
			break;
		case 1:			  //参数设置时的移位
			if (MenuStFlag==1)
			{
				if(MN[MenuId].ucMenuType==2)
				{
					MenuSelWei ++;
					if (MenuSelWei>3)
						MenuSelWei = 0;
				}
			}
			break;
		case 16:		  //'Set'按钮
			switch (MN[MenuId].ucMenuType)
			{
				case 1:
					//添加'位参数'读参数代码
					//pucPara = MN[MenuId].puiPara;
					Read_Flash(&MenuTChar, MN[MenuId].ucParaAddr, 1);
					if (bittest(MenuTChar, MN[MenuId].ucBitNum)==1)
					{
						MenuTChar = 0x01;
						//MenuTChar = bitset(MenuTChar, 0);	
					}
					else
					{
						MenuTChar = 0x00;
						//MenuTChar = bitclr(MenuTChar, 0);
					}
					MenuStFlag = 1; 
					break;
				case 2:
					//添加'字参数'读参数代码
					//MenuTInt = 	*(MN[MenuId].puiPara);
					Read_Flash(&MenuTInt, MN[MenuId].ucParaAddr, 2);
					MenuStFlag = 1;
					break;
				default:
					MenuId = MN[MenuId].ucKeySt;
					break;
			}
			break;
		case 32:	  //长按'Quit'
			MenuStFlag = 0;
			MenuSelWei = 0;			
			MenuId = MN[MenuId].ucKeyLQt;
			break;
		case 64:	  //长按'Set'
			MenuId = MN[MenuId].ucKeyLSt;
			break;
		default:
			_nop_();
			break;
	}		
}

/*------------------------------Int转换成数码管码函数-------------------------------------
将整数Num转换成4个数码管码后,保存在以pSMG为首地址的uchar数组内
----------------------------------------------------------------------------------------*/
void ProcInt(sint Num, char *pSMG)
{
	uchar sign;	//正负
	uint tempNum;	//Num的绝对值
	uchar temp;		//转换过程中的临时变量
	uchar LingFlag=0;		//前面转换后得到的数字是否是有效数字,1表示是,0表示否;
	if (Num<0)				//负数的处理
	{
		sign = 1;
		tempNum = 0 - Num;
	}
	else
	{
		sign = 0; 
		tempNum = Num;
	}
	temp = tempNum / 1000; 
	tempNum = tempNum - (temp * 1000);
	if (sign == 1)
	{
		*pSMG = 0xBF;	//显示'-'号
	}
	else
	{
		if (temp!=0)
		{
			*pSMG = table_NUM[temp];
			LingFlag = 1;
		}
		else 
			if (LingFlag == 0)
				*pSMG = 0xff;
			else
				*pSMG = 0xC0;
	}
	temp = tempNum / 100;
	tempNum = tempNum - (temp * 100);
	if (temp!=0)
	{
		*(pSMG+1) = table_NUM[temp];
		LingFlag = 1;
	}
	else 
		if (LingFlag == 0)
			*(pSMG+1) = 0xff;
		else
			*(pSMG+1) = 0xC0;
	temp = tempNum / 10;
	tempNum = tempNum - (temp * 10);
	if (temp!=0)

⌨️ 快捷键说明

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