无论怎么调试,数码管只显示000,让人非常苦恼。下面是代码,请各位大佬指点
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>这是main函数
/* 头文件声明区 */
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include "Init.h"//初始化底层驱动专用头文件
#include "Key.h"//按键底层驱动专用头文件
#include "Seg.h"//数码管底层驱动专用头文件
#include "Led.h"//Led底层驱动专用头文件
#include "iic.h"//数模转换底层驱动专用头文件
#include "iic.h"
/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};//数码管显示数据存放数据
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};//数码管小数点存放数据
unsigned char Seg_Pos;//数码管扫描专用专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};//Led显示数据存放数据
unsigned dat,dat2;
bit Seg_Disp_Mode;//数码管显示模式变量 0-电压显示界面 1-电压输出界面
float Voltage;//实时电压变量
/* 键盘处理函数 */
void Key_Proc()
{
if(Key_Slow_Down)return;
Key_Slow_Down=1;//键盘减速程序
Key_Val=Key_Read();//实时读取键码值
Key_Down=Key_Val&(Key_Old^Key_Val);//捕捉按键下降沿
Key_Up=~Key_Val&(Key_Old^Key_Val);//捕捉按键上升沿
Key_Old=Key_Val;//辅助扫描变量
}
/* 信息处理函数 */
void Seg_Proc()
{
if(Seg_Slow_Down)return;
Seg_Slow_Down=1;//数码管减速程序
dat=AD_Read(0x43);
Seg_Buf[0]=dat/100%10;
Seg_Buf[1]=dat/10%10;
Seg_Buf[2]=dat%10;
}
/* 其他显示函数 */
void Led_Proc()
{
}
/* 定时器0中断初始化函数 */
void Timer0Init(void) //1微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFF; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //定时器0中断打开
EA=1; //总中断打开
}
/* 定时器0中断函数 */
void Timer0Server() interrupt 1
{
if(++Key_Slow_Down==10){Key_Slow_Down=0;}//键盘减速专用
if(++Seg_Slow_Down==500){Seg_Slow_Down=0;}//数码管减速专用
if(++Seg_Pos==8){Seg_Pos=0;}//数码管显示专用
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}
/* Main */
void main()
{
System_Init();
Timer0Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>这是IIC底层驱动
#include "iic.h"
#define DELAY_TIME 5
#include "reg52.h"
#include "intrins.h"
sbit SDA = P2^1;
sbit SCL = P2^0;
//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//I2C总线启动信号
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//I2C总线停止信号
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
//函数名:ADC转换函数
//入口参数:要进行转换的通道控制位
//返回值:ADC转换的数值
//函数功能:对指定的通道进行ADC转换,函数返回转换的数值
unsigned char AD_Read(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
void DA_Write(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x41);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
已经确认除此之外没有错误了,跪谢各位大佬
标签:Seg,char,光敏电阻,IIC,void,unsigned,蓝桥,Key,数模转换 From: https://blog.csdn.net/2301_79948340/article/details/136785705