使用SH79F166A做上位机控制TM1629B显示LED,数码管计数显示。但是该板写入0X00,或者使用关显示0x80都无法使之熄灭。同时,LED是乱显示的。一个个地址地试也无法得到想要的结果,做不到单个LED单独亮灭,代码如下(请自动忽略其中的触摸按键函数):
#define.h
#ifndef _DEFINE_H
#define _DEFINE_H
#include<SH79F166A.h>
#include<intrins.h>
typedef unsigned char uint8;
typedef signed char int8;
typedef unsigned int uint16;
typedef signed int int16;
#define NOP _nop_()
#define Mode_Auto 0x40
#define Mode_Manual 0x44
#define Mode_Disp 0x8F
#define Read_Key 0x42
#define Disp_Off 0x80
#define Start_Addr 0xC0
#define Power_heart 0xC1
#define Set_fan 0xC3
#define UP_SW_time 0xC5
#define WARM_DOWN 0xC7
#define HUICHA_Time 0xC8
#define Temp_AddrH 0xCF
#define Temp_AddrL 0xCD
#define Time_HourH 0xC5
#define Time_HourL 0xC6
#define Time_MinuH 0xCA
#define Time_MinuL 0xCB
#define zero 0x3F
#define S_F_LED_OFF 0x08
#define P_H_LED_OFF 0x40
#define Key_ON 0x10
#define Heart_ON 0x02
#define All 0x02
#define ttt 0x10
sbit DIO=P3^2;
sbit CLK=P4^2;
sbit STB=P1^6;
//sbit TDI=P1^5;
//sbit TCK=P1^4;
void LedInit();
uint8 KeyScan();
//void I2CInit();
void I2CStop();
void I2CStart();
void Timer2Init();
uint8 I2CReadData();
void DisplayTemp();
void DisplayTime();
uint8 LedReadData();
uint8 I2CReadData();
void ReadUartInit();
void Delay(uint8 t);
void WriteUartInit();
void delayus(uint8 t);
void Display(uint8 Data);
void DisplayKey(uint8 Key);
void I2CWriteData(uint8 Data);
void LedWriteData(uint8 Data);
void DisplayFunction(uint8 Function);
#endif
#main.c
#include"define.h"
extern uint8 FlagTime;
void main()
{
// uint8 i;
P3CR=0xff;
P3PCR=0x0;
P3=0x00;
P4CR=0xff;
P4PCR=0x0;
P4=0x00;
P1CR=0xff;
P1PCR=0x0;
P1=0x00;
Timer2Init();
LedInit();
Display(Disp_Off);
while(1)
{
Display(All);
// DisplayTemp();
// DisplayTime();
// Delay(1);
}
}
void Timer2Init()
{
T2CON=0x00;
T2MOD=0x00;
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
TH2=(65536-50000)/256;
TL2=(65536-50000)%256;
IEN0|=0xa0;
EA=1;
ET2=1;
TR2=1;
TF2=0;
}
void timer2() interrupt 5 //5ms自动重载定时器
{
static uint8 t;
t++;
TF2=0;
if(t>=10)
{
FlagTime=1;
t=0;
}
// KeyScan();
}
void Delay(uint8 t)
{
uint8 i,j;
for(;t>0;t--)
{
for(i=0;i<255;i++)
{
for(j=0;j<255;j++);
}
}
}
#led.c
#include"define.h"
uint8 code digit[]={
0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
uint8 FlagTime=0;
uint8 time=0;
void LedInit()
{
CLK=1;
DIO=1;
STB=1;
}
void LedWriteData(uint8 Data)
{
uint8 i;
STB=0;
for(i=0;i<8;i++)
{
CLK=0;
if((Data&0x01)==0x01)
{
DIO=1;
}else
{
DIO=0;
}
CLK=1;
NOP;NOP;NOP;NOP;NOP;
Data=Data>>1;
NOP;NOP;NOP;
}
}
uint8 LedReadData()
{
uint8 i;
uint8 ReadData;
CLK=0;
DIO=1;
for(i=0;i<8;i++)
{
CLK=1; //上升沿读数据
ReadData=ReadData>>1;
if(DIO==0x01)
{
ReadData|=0x80;
}
else{
ReadData&=0x7F;
}
CLK=0;
NOP;NOP;NOP;
}
DIO=1;
return ReadData;
}
void Display(uint8 Data)
{
uint8 i;
LedWriteData(Mode_Manual);
STB=1;
LedWriteData(Start_Addr);
// for(i=0;i<1;i++)
// {
LedWriteData(Data);
// }
STB=1;
LedWriteData(Mode_Disp);
STB=1;
}
void DisplayTime()
{
LedWriteData(Mode_Manual);
if(FlagTime==1)
{
time++;
FlagTime=0;
}
if(time>=0)
{
STB=1;
LedWriteData(Time_HourH);
LedWriteData(digit[time/60/10]);
STB=1;
LedWriteData(Time_HourL);
&n
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>