📄 带eeprom的显示调试.c
字号:
{
*(pSMG+2) = table_NUM[temp];
LingFlag = 1;
}
else
if (LingFlag == 0)
*(pSMG+2) = 0xff;
else
*(pSMG+2) = 0xC0;
*(pSMG+3) = table_NUM[tempNum];
}
/*-----------------------第一组数码管码指针指向处理函数---------------------
--------------------------------------------------------------------------*/
void ProcSMG(void)
{
// uchar *pTemp1;
if (MenuStFlag==1)
{
switch (MN[MenuId].ucMenuType)
{
case 1:
pMenuSMG1 = SMGBIT[bittest(MenuTChar, 0)];
break;
case 2:
ProcInt(MenuTInt, MenuSMGNum);
pMenuSMG1 = MenuSMGNum;
break;
default:
break;
}
}
else
{
pMenuSMG1 = MN[MenuId].pucSMG1;
}
}
/*------------------------------数码管显示驱动函数------------------------------------
将指针SerIn指向的数码管码传送到数码管上显示出其所代表的字符,interval表示显示周期
-------------------------------------------------------------------------------------*/
void DispDrive(uchar *SerIN, uchar interval)
{
DA = 0xFF;
DISCLK = 0; //第一次移位
DISDAT = 1;
// Delay_us(2);
_nop_();
_nop_();
DISCLK = 1;
// Delay_us(2);
_nop_();
_nop_();
DISCLK = 0; //第二次移位
DISDAT = 0;
// Delay_us(2);
DA = *SerIN;
DISCLK = 1;
Delay_us(interval);
DISCLK = 0; //第三次移位
DISDAT = 0;
// Delay_us(2);
DA = *(SerIN + 1);
DISCLK = 1;
Delay_us(interval);
DISCLK = 0; //第四次移位
DISDAT = 0;
// Delay_us(2);
DA = *(SerIN + 2);
DISCLK = 1;
Delay_us(interval);
DISCLK = 0; //第五次移位
DISDAT = 0;
// Delay_us(2);
DA = *(SerIN + 3);
DISCLK = 1;
Delay_us(interval);
DISCLK = 0; //第六次移位
DISDAT = 0;
// Delay_us(2);
DA = 0xFF;
DISCLK = 1;
}
/*---------------------------微秒级延迟函数--------------------
--------------------------------------------------------------*/
void Delay_us (uchar k)
{
uchar i;
for (i=0; i<k; i++);
}
void DispSMG(uchar *pSMG)
{
DispDrive (pSMG, 200);
}
/*--------------------------按键扫描函数------------------------
将扫描后按键值返回
---------------------------------------------------------------*/
uchar ScanKey(void)
{
uchar idata n;
uchar bdata TempKey1;
uchar bdata TempKey2;
uchar idata K;
DA = 0xFF; //驱动74HC164芯片
DISDAT = 1; //先将DISDAT置1,使之向流水灯一样
DISCLK = 0;
Delay_us(2);
DISCLK = 1; //移入一位
Delay_us(2);
DISDAT = 0; //再将DISDAT复位
// KEYIN = 1;
for (n=0; n<5; n++)
{
DISCLK = 0;
Delay_us(2);
DISCLK = 1;
Delay_us(2);
//if (_testbit_(KEYIN)) //此条语句与下一条语句效果不同,此条语句不能将KEYIN管脚的电平正确读出,正困惑中??????????
if (KEYIN) //读KEYIN管脚电平,并据此判断
{
TempBit = 1;
if (ucKeyCnts[n] < LCNT)
{
ucKeyCnts[n]++;
}
}
else
{
TempBit = 0;
ucKeyCnts[n] = 0;
}
TempBitByte <<= 1;
DISDAT = 0;
}
TempBitByte >>= 1;
for (n=0; n<5; n++)
{
if (ucKeyCnts[n] > SCNT) //短按防抖
{
KeySFlag = bitset(KeySFlag, 4-n);
}
if ((ucKeyCnts[n] >= LCNT) && (bittest(KeyLFlag, 4-n)==0)) //长按
{
KeyLFlag = bitset(KeyLFlag, 4-n);
}
}
KeySFlag = KeySFlag & (~KeyLFlag); //*****长按有效的话,短按就无效
TempKey1 = KeySFlag;
TempKey1 = (~TempBitByte) & TempKey1; //只有在KeySFlag为1,并且按键已弹起后,短按才真正有效
TempKey2 = KeyLFlag;
TempKey2 = TempBitByte & TempKey2; //只有在KeyLFlag为1,且按键保持按下后,长按才真正有效
KeySFlag = KeySFlag & TempBitByte; //在按键弹起后,KeySFlag失效为0
KeyLFlag = KeyLFlag & TempBitByte; //在按键弹起后,KeySFlag失效为0
K = TempKey1; //最后处理按键值
if (bittest(TempKey2, 4)==1)
K = bitset(K, 6);
else
K = bitclr(K, 6);
if (bittest(TempKey2, 1)==1)
K = bitset(K, 5);
else
K = bitclr(K, 5);
return K;
}
void InitROM()
{
uchar *array[16];
Write_Flash(array, 0, 16);
}
/*----------------------主函数----------------------------------
--------------------------------------------------------------*/
void main(void)
{
InitT0();
// InitROM();
while (1)
{
key= ScanKey();
_nop_();
MenuOperat(key);
ProcSMG();
DispSMG(pMenuSMG1);
}
}
//*************在我们仪表上测试所添加的程序*******************
void InitT0(void)
{
TMOD = 0x02;
ET0 = 1;
TH0 = 0x00;
TL0 = 0x00;
EA = 1;
TR0 = 1;
}
//*************在我们仪表上测试所添加的程序*******************
void ResetWDT(void) interrupt 1
{
WDT = ~WDT;
}
/*----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SDA = 0;
_nop_();
}
/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 0;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SDA = 1;
_nop_();
}
/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 0;
AT24C02_SCL = 1;
_nop_();
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
}
/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SCL = 0;
_nop_();
}
/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
unsigned char i;
AT24C02_WP = 0;
for (i=0;i<8;i++)
{
AT24C02_SCL = 0;
input <<= 1;
AT24C02_SDA = CY; //*************左移位后,移出的哪一位进入了CY中
AT24C02_SCL = 1;
}
AT24C02_SCL = 0; //****以下为"接受确认信号"程序
_nop_();
AT24C02_SDA = 1; //*****拉高管脚,准备读该管脚电平
AT24C02_SCL = 1;
_nop_();
CY = AT24C02_SDA; //读"确认信息",如果返回1则表明写入失败
AT24C02_WP = 1;
return(CY) ;
}
/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
{
unsigned char temp,rbyte=0;
for (temp = 8;temp != 0;temp--)
{
AT24C02_SCL = 0;
_nop_();
rbyte = (rbyte << 1) | AT24C02_SDA; //*****这样也可以按位并吗?AT24C02_SDA是不是代表着某个字节的最低位,其余位都为0
AT24C02_SCL = 1;
_nop_();
}
return rbyte;
}
/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
unsigned char Addr;
Addr = nAddr;
Start_Cond(); //写开始信号
Write8Bit(WriteDeviceAddress); //写驱动地址
Write8Bit(Addr); //写从EEPROM中读的开始地址
Start_Cond(); //写开始信号
Write8Bit(ReadDeviceAddress); //写读数据指令
while(--nLen)
{
*nContent=Read8Bit(); //读出内容
nContent++; //指针加1
Ack(); //发确认信号,让24WC02继续发送数据
}
*nContent=Read8Bit(); //读一字节
NoAck(); //发无确认信号,让24WC02停止发送数据
Stop_Cond(); //发终止信号
return(0); //返回
}
/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) // 8 Byte/1Page init 0xFF
{
unsigned char nLen;
unsigned char Addr;
nLen=8;
Addr=8 *nPage;
Start_Cond();
Write8Bit(WriteDeviceAddress);
Write8Bit(Addr);
for(;nLen!=0;nLen--)
{
if(Write8Bit(0xff)) break; //if Write8Bit() Return 1 Write Flase
}
Stop_Cond();
return(CY);
}
/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
unsigned char i,temp;
unsigned char Addr;
Addr = nAddr;
Start_Cond(); //写开始信号
Write8Bit(WriteDeviceAddress); //写驱动地址
Write8Bit(Addr); //写从EEPROM中写的开始地址
for(i = 0;i < nLen;i++)
{
if(Addr%8==0) //每页8字节 //换页 //*****为什么读EEPROM时不用换页呢?
{
Stop_Cond();
_nop_();
Start_Cond();
Write8Bit(WriteDeviceAddress);
Write8Bit(Addr);
}
temp = *nContent;
if(Write8Bit(temp))
break; //如果失败则跳出循环
nContent++;
Addr++;
}
Stop_Cond(); //发停止信号
return(CY); //*****CY来自Write8Bit(temp)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -