tm1650按键处理c语言,求助51C语言X9C系列APP遥控驱动显示TM1650怎么将下面的程序合成...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

//#################################################################################################

//文件:51单片机的红外遥控解码程序

//属性:使用外部中断0连接遥控头,接收红外遥控键值送P2口显示,12MHz外部晶振

//资源:P3.2=接收头输入,P2=8LED

//#################################################################################################

#include"reg51.h"

#include"intrins.h"

#define uchar unsigned char

#define uint unsigned int

#define CLK_H CLK = 1

#define CLK_L CLK = 0

#define DIO_H DIO = 1

#define DIO_L DIO = 0

void io_init(void);

void int_init(void);

void main()

{

io_init();

int_init();

while(1);

}

void io_init(void)

{

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

}

void int_init(void)

{

EX0=1;

EA=1;

}

void interrupt0()interrupt 0

{

uchar i=0,j=0,k=0,us=0;

uchar addr[4]={0};

EX0=0;

or(i=0;i<255;i++) //9ms内有高电平认为是干扰

{

if(P3&0x04) //255的值实际时间为800us

{

EX0=1;

return;

}

}

while(!(P3&0x04));//等待9ms低电平过去

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

while(P3&0x04);//等待4.5ms高电平过去

while(!(P3&0x04));//等待0.56ms低电平后面的高电平

while(P3&0x04)//计算这个高电平的时间

{

for(us=0;us<=32;us++);//100us的延时语句

if((k++)>=30)//高电平时间过长退出程序

{

EX0=1;

return;

}

}

addr[i]=addr[i]>>1;//接收一位数据

if(k>=8)

addr[i]=addr[i]|0x80;//高电平大于0.56ms,则为1

k=0;

}

}

P2=~(addr[2]); //P2的LED显示二进制键值

EX0=1;

}

sbit inc=P0^0; //脉冲输出端

sbit ud=P0^1; //方向端

sbit cs=P0^2; //片选端

sbit led=P2^0; //指示灯

/*以下是函数声明*/

void x9c104s_inc(uchar number);

void x9c104s_dec(uchar number);

void x9c104s_set(uchar number);

/*设定初始值*/

void x9c104s_set(uchar number)

{

uchar i;

inc=1;

_nop_();

_nop_();

cs=0;

_nop_();

_nop_();

ud=0; //方向为减

_nop_();

_nop_();

for(i=0;i<100;i++) /*因为该芯片为100抽头 所以先清零*/

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

ud=1; //方向朝上

_nop_();

_nop_();

for(i=0;i

{

inc=1;

_nop_(); //下降沿有效

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //以下为保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

/*函数为重新增加阻值*/

void x9c104s_inc(uchar number)

{

uchar i;

inc=1;

_nop_();

_nop_();

cs=0;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

for(i=0;i

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //以下为保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

/*函数为阻值减小*/

void x9c104s_dec(uchar number)

{

uchar i;

inc=1; //选中该芯片

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=0; //方向为减小

_nop_();

_nop_();

for(i=0;i

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

void main()

{

led=0;

x9c104s_set(10);

x9c104s_inc(60); //三个函数都使用一下 防止警告

x9c104s_dec(10);

}

sbit CLK = P3^2;

sbit DIO = P3^3;

#define CLK_H CLK = 1

#define CLK_L CLK = 0

#define DIO_H DIO = 1

#define DIO_L DIO = 0

0bb8420f9b4915d85d8d8c4877fa6f05.png

9b20b87afce2df03aebbbbfc10f8958c.png

void TM1650_Set(uchar add,uchar dat);

uchar Scan_Key(void);

uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码

void main()

{

uchar key;

TM1650_Set(0x48,0x51);//为5级亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显示

//如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示

TM1650_Set(0x68,CODE[0]);

TM1650_Set(0x6A,CODE[5]);

TM1650_Set(0x6C,CODE[1]);

TM1650_Set(0x6E,CODE[4]);

while(1) ;

{

key = Scan_Key();

//第一个按键按下

if(key == 0x44) //此键值和数据手册上对应

{

TM1650_Set(0x6E,CODE[1]);//显示1

}

//第二个按键按下

if(key == 0x4c)

{

TM1650_Set(0x6E,CODE[2]);

}

//第三个按键按下

//TM1650_Set(0x6E,CODE[3]);

}

}

void Delay_us(uint i) //us延时

{

for(;i>0;i--)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

void I2CStart(void)//开始信号

{

CLK_H;

DIO_H;

Delay_us(5);

DIO_L;

}

void I2Cask(void) //ACK信号

{

uchar timeout = 1;

CLK_H;

Delay_us(5);

CLK_L;

while((DIO)&&(timeout<=100))

{

timeout++;

}

Delay_us(5);

CLK_L;

}

void I2CStop(void) //停止信号

{

CLK_H;

DIO_L;

Delay_us(5);

DIO_H;

}

void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后

{

uchar i;

CLK_L;

Delay_us(1);

for(i=0;i<8;i++)

{

oneByte = oneByte<<1;

DIO = CY;

CLK_L;

Delay_us(5);

CLK_H;

Delay_us(5);

CLK_L;

}

}

uchar Scan_Key(void) // 按键扫描

{

uchar i;

uchar rekey;

I2CStart();

I2CWrByte(0x49);//读按键命令

I2Cask();

//DIO_H;

for(i=0;i<8;i++)

{

CLK_H;

rekey = rekey<<1;

if(DIO)

{

rekey++;

}

Delay_us(5);

CLK_L;

}

I2Cask();

I2CStop();

return(rekey);

}

void TM1650_Set(uchar add,uchar dat) //数码管显示

{

//写显存必须从高地址开始写

I2CStart();

I2CWrByte(add); //第一个显存地址

I2Cask();

I2CWrByte(dat);

I2Cask();

I2CStop();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值