正在看规格书写1650的程序,还没有拿到板子上面测试。看了样例程序,对于有的师兄说按键扫描没有反应,可能是有的单片机的端口输入和输出状态要单独设定,而样例里面的单片机可能是不用设定的。 我这边看规格书的时候也有个疑问,按键读取的时候,只有一个字节,又不区分地址,怎么能读取28个按键呢? 问了代理,说是晚上回复。 |
对比新旧版本规格书,发现旧版本TM1650的读按键命令是0x49,而新版本的命令则是0x4F。新版本不能读按键的可以修改一下试试(旧版本批号首位位是1,新版本批号首位是2). |
haide1998 发表于 2022-8-30 15:29 如果我没有理解错,这个玩意用的是串行信号,对应地址的存储单元位,对应着一个LED.对应关系IC说明书可查。唯一要弄明白的就是,串行信号的传输规则。 |
哪位高手把四位数码管分离成28个LED,用于分别指示28个按键的执行情况可好 |
学习一下!不错的例程 |
挺好的资料,学习了,谢谢楼主 |
本帖最后由 什么都不懂啊 于 2021-11-11 19:07 编辑 shupeiyu 发表于 2021-8-6 10:32 sbit CY = PSW^7; |
DIO = CY; cy是什么![]() |
这个程序不错,参考下 |
雪城 发表于 2020-10-11 11:24 TRI_DAT = 1; //数据端口位输入模式 TRI_DAT = 0; //数据端口位输出模式 这个数据端口位,在吗定义的? |
liuzhengduo16 发表于 2018-10-22 15:02 ASK错了 |
fox1357 发表于 2020-8-1 16:42 ASK 是错的 试试我改的 /****************************************************************************** * 函 数 名: Ask1650(void) * 函数功能: ACK信号 * 入口函数: 无 * 返 回: 无 *******************************************************************************/ void Ask1650(void)//ACK信号 { int timeout = 1; TRI_DAT = 1; //数据端口位输入模式 Delay_us(5); while((DIO)&&(timeout<=300)) //延时等待反馈信号 { timeout++; } CLK = 1; Delay_us(5); CLK = 0; TRI_DAT = 0; //数据端口位输出模式 } |
程序 ACK 是错的 试了好久键盘读不出键值 最后发现询问SDA下拉提前了一个脉冲 uchar BL = 2; //亮度等级 uchar CODE[11] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //0~9显示代码 // 0 1 2 3 4 5 6 7 8 9 a void TM1650(uchar B1,uchar B2, uchar B3 ,uchar B4) { uchar temp[5],temp1[5]; uchar i; temp[1] = B1; temp[2] = B2; temp[3] = B3; temp[4] = B4; temp1[1]=temp[1] ; temp1[2]=temp[2] ; temp1[3]=temp[3] ; temp1[4]=temp[4] ; for( i=1 ; i < 5 ; i++ ) { if (temp[i] == 97) { temp1[i] = 10; } } Set1650(0x48,(BL*16+0x01)); //打开显示 调节灰度 Set1650(0x68, CODE[temp1[1]]);//数码管显示 Set1650(0x6a, CODE[temp1[2]]);//数码管显示 Set1650(0x6c, CODE[temp1[3]]);//数码管显示 Set1650(0x6e, CODE[temp1[4]]);//数码管显示 } /****************************************************************************** * 函 数 名: InitTM1650(void) * 函数功能: 初始化TM1650 * 入口函数: 无 * 返 回: 无 *******************************************************************************/ void InitTM1650(void) { TRI_CLK = 0; //设置端口位输出模式 TRI_DAT = 0; //设置端口位输出模式 WPUA |= 0x20; //设置 RA5 RA4弱上拉 Set1650(0x48,(BL*16+0x01));//设定亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显 //如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示 } /****************************************************************************** * 函 数 名: Set1650(uchar add,uchar dat) * 函数功能: 按键扫描 写显存必须从高地址开始写 * 入口函数: add 地址 dat 数据 * 返 回: 无 *******************************************************************************/ void Set1650(uchar add,uchar dat)//数码管显示 { Start1650(); //开始 WrByte1650(add); //第一个显存地址 Ask1650(); WrByte1650(dat); //第一个显示数据 Ask1650(); Stop1650(); //停止 } /****************************************************************************** * 函 数 名: Scan_Key(void) * 函数功能: 按键扫描 * 入口函数: 无 * 返 回: rekey 按键扫描结果 *******************************************************************************/ uchar Scan_Key(void) // 按键扫描 { uchar i; uchar rekey; Start1650(); //开始 WrByte1650(0x49); //读按键命令 Ask1650(); //ASK //DIO = 1 ; TRI_DAT = 1; //数据端口位输入模式 Delay_us(1); for(i=0;i<8;i++) { CLK = 1; rekey = rekey<<1; if(DIO) { rekey++; } Delay_us(5); CLK = 0; Delay_us(1); } TRI_DAT = 0; //数据端口位输出模式 Ask1650(); //ASK Stop1650(); //停止 return(rekey); } /****************************************************************************** * 函 数 名: WrByte1650(uchar oneByte) * 函数功能: 写一个字节 * 入口函数: oneByte 要写入的字节 * 返 回: 无 *******************************************************************************/ void WrByte1650(uchar oneByte)//写一个字节 高位在前,低位在后 { uchar i; CLK = 0; Delay_us(5); for(i=0;i<8;i++) { oneByte = oneByte<<1; DIO = nC ; //进位标志 溢出1 空位0 CLK = 0; Delay_us(5); CLK = 1; Delay_us(5); CLK = 0; } } /****************************************************************************** * 函 数 名: Stop1650(void) * 函数功能: 停止信号 * 入口函数: 无 * 返 回: 无 *******************************************************************************/ void Stop1650(void)//停止信号 { CLK = 1; DIO = 0; Delay_us(5); DIO = 1; } /****************************************************************************** * 函 数 名: Ask1650(void) * 函数功能: ACK信号 * 入口函数: 无 * 返 回: 无 *******************************************************************************/ void Ask1650(void)//ACK信号 { int timeout = 1; TRI_DAT = 1; //数据端口位输入模式 Delay_us(5); while((DIO)&&(timeout<=300)) //延时等待反馈信号 { timeout++; } CLK = 1; Delay_us(5); CLK = 0; TRI_DAT = 0; //数据端口位输出模式 } /****************************************************************************** * 函 数 名: Start1650(void) * 函数功能: 开始信号 * 入口函数: 无 * 返 回: 无 *******************************************************************************/ void Start1650(void)//开始信号 { CLK = 1; DIO = 1; Delay_us(5); DIO = 0; } /****************************************************************************** * 函 数 名: Delay_us(uint i) * 函数功能: us延时 * 入口函数: i 延时长度 * 返 回: 无 *******************************************************************************/ void Delay_us(uint i)//us延时 { for(;i>0;i--) { NOP(); NOP(); NOP(); NOP(); NOP(); } } |
fox1357 发表于 2020-8-1 16:42 我大概明白了,这个芯片无法判断两个按键,0-255只需要返回一个值,就代表某一个具体按键。 |
正在找这个内容,多谢楼主; |
请问这款蕊片需要用户主动扫描吗?还是写入数据后,蕊片自动刷新? |
liuzhengduo16 发表于 2018-10-22 15:02 你的问题解决了吗,我也要碰上SC的单片机,不能读按键 |
谢谢了 |
谢楼主分享了。学习学习 |
!好东西 |
很好,但是没有黑币了、、、 |
谢谢了 |
安静的麻瓜 发表于 2019-1-4 14:50 51的升级版 也属于51 |
主函数部分没有吗 主要是按键扫描判断 有点搞不懂 |
谢了! |
请问,这个是pic的还是51的,我是个新手 求指教呀 |
下来看看是否适合 |
谢谢了 |
我想问一下,我用赛元的MCU驱动的这个芯片,为什么按键扫描的时候按键没有任何反应呢 |
这个程序不错,找了好久总算找到合适的方案了 |