我这里有个ET6226的硬件I2C驱动代码,和TM1650、AIP650这些应该都是兼容的。
-
- #include "intrins.h"
- #include "main.h"
- #include "ET6226.h"
-
-
- #define ET6226_DISPLAY_BASE1 0x68 // 数码管0的地址
- #define ET6226_DISPLAY_BASE2 0x6A // 数码管1的地址
- #define ET6226_DISPLAY_BASE3 0x6C // 数码管2的地址
- #define ET6226_DISPLAY_BASE4 0x6E // 数码管3的地址
- #define ET6226_DCTRL_BASE 0x48 // 控制寄存器地址
- #define ET6226_KEYBOARD_BASE 0x4F // 键盘编码地址
-
- #define ET6226_DISPLAY_ON 0x09
- #define ET6226_DISPLAY_OFF 0x00
- #define ET6226_CHIP_SLEEP 0x04
-
- //code ET6226_BRIGHT_LEVEL [8] = {0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01}; //输出亮度从低到高
- code ET6226_BRIGHT_LEVEL [8] = {0x19,0x29,0x39,0x49,0x59,0x69,0x79,0x09}; //输出亮度从低到高
-
- unsigned char key_value;
- unsigned char key_flag;
-
- bit busy;
- unsigned char key_scan(void);
-
- void Wait()
- {
- while (!(I2CMSST & 0x40));
- I2CMSST &= ~0x40;
- }
-
- void Start()
- {
- I2CMSCR = 0x01; //发送START命令
- Wait();
- }
-
- void SendData(char dat)
- {
- I2CTXD = dat; //写数据到数据缓冲区
- I2CMSCR = 0x02; //发送SEND命令
- Wait();
- }
-
- void RecvACK()
- {
- I2CMSCR = 0x03; //发送读ACK命令
- Wait();
- }
-
- char RecvData()
- {
- I2CMSCR = 0x04; //发送RECV命令
- Wait();
- return I2CRXD;
- }
-
- void SendACK()
- {
- I2CMSST = 0x00; //设置ACK信号
- I2CMSCR = 0x05; //发送ACK命令
- Wait();
- }
-
- void SendNAK()
- {
- I2CMSST = 0x01; //设置NAK信号
- I2CMSCR = 0x05; //发送ACK命令
- Wait();
- }
-
- void Stop()
- {
- I2CMSCR = 0x06; //发送STOP命令
- Wait();
- }
-
- void I2C_Init(void)
- {
- P_SW2 |= 0x80;
- I2CCFG = 0xe0; //使能I2C主机模式
- I2CMSST = 0x00;
- SDA = 1;
- SCL = 1;
- // P_SW2 |= 0x00; //SCL/P1.5, SDA/P1.4
- P_SW2 |= 0x10; //SCL_2/P2.5, SDA_2/P2.4
- // P_SW2 |= 0x30; //SCL_4/P3.2, SDA_4/P3.3
- }
-
- void ET6226_sendbyte(unsigned char add,unsigned char dat)
- {
- char sfr_temp = P_SW2;
- P_SW2 |= 0x80;
- Start(); //发送起始命令
- SendData(add); //发送控制地址
- RecvACK();
- SendData(dat); //发送开显示指令
- RecvACK();
- Stop();
- P_SW2 = sfr_temp;
- delay_ms(20);
- }
-
-
- void INT3_Isr() interrupt 11
- {
- unsigned char key_code;
- char sfr_temp = P_SW2;
- LED_COMM = 0;
- P_SW2 |= 0x80;
- Start(); //发送起始命令
- SendData(ET6226_KEYBOARD_BASE); //发送设备地址+写命令
- RecvACK();
- key_code = RecvData();
- SendNAK();
- //RecvACK();
- Stop();
- P_SW2 = sfr_temp;
- if (key_code&0x40)
- {
- key_value = key_code;
- key_flag = 2;
- }
- LED_COMM = 1;
- }
-
- unsigned char key_scan(void)
- {
- unsigned char key_code;
- char sfr_temp = P_SW2;
- P_SW2 |= 0x80;
- if(KEY_INT == 0)
- {
- Start(); //发送起始命令
- SendData(ET6226_KEYBOARD_BASE); //发送设备地址+写命令
- RecvACK();
- key_code = RecvData();
- SendNAK();
- Stop();
- P_SW2 = sfr_temp;
- if (key_code&0x40){
- //key_code <<= 1;
- //key_code &= 0x7F;
- }
- }
- return key_code;
- }
-
- extern void ET6226_Init(void)
- {
- I2C_Init();
- delay_ms(5);
- ET6226_sendbyte(ET6226_DCTRL_BASE,ET6226_BRIGHT_LEVEL[5]); //显示亮度最亮
- ET6226_sendbyte(ET6226_DISPLAY_BASE1,0xFF); //小7键背光
- ET6226_sendbyte(ET6226_DISPLAY_BASE2,0xFF); //启停键背光
-
- Start(); //发送起始命令
- SendData(ET6226_KEYBOARD_BASE); //发送设备地址+写命令
- RecvACK();
- RecvData();
- SendNAK();
- Stop();
-
- P_SW2 |= 0x80;
- INTCLKO |= 0x20; //使能INT3中断
- }
复制代码
|