📄 带eeprom的显示调试.c
字号:
#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 + -