/***************************************************************************** *版權信息:深圳天微電子有限公司 *文 件 名:TM1637-V1.0 *當前版本:V1.0 *MCU 型號:STC12C5608AD *開發環境:Keil uVision4 *晶震頻率:11.0592MHZ *完成日期:2013-07-19 *程序功能:數碼管驅動和按鍵:驅動8段6位LED共陽數碼管顯示,當對應按鍵按下時顯示1~7,原理圖請參考TM1637規格書; *免責聲明:1.此程序為TM1637驅動共陽LED數碼管和按鍵演示程序,僅作參考之用。 2.如有直接使用本例程程序造成經濟損失的,本公司不承擔任何責任 ********************************************************************************/ #include <reg52.h> //頭文件 #include "intrins.h" //包含_nop_()指令頭文件 #define nop _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定義 /********************定義控制端口**********************/ sbit CLK=P2^2; //定義CLK sbit DIO=P2^3; //定義DIO /********************定義數據*************************/ unsigned char code CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽顯示數據0-F /* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/ unsigned char code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//數碼管不顯示 /********************延時函數,延時nms******************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) for(i=0;i<550;i++); } /********************Start函數*************************/ void I2CStart() { DIO=1; CLK=1; nop; DIO=1; nop; DIO=0; nop; CLK=0; } /********************Stop函數*************************/ void I2CStop() { CLK=0; nop; nop; DIO=0; nop; nop; CLK=1; nop; nop; nop; DIO=1; nop; CLK=0; DIO=0; } /***************發送8bit數據,從低位開始**************/ void I2CWritebyte(unsigned char oneByte) { unsigned char i; for(i=0;i<8;i++) { CLK=0; if(oneByte&0x01) DIO=1; else DIO=0; nop; CLK=1; oneByte=oneByte>>1; } //8位數據傳送完 CLK = 0; //判斷芯片發過來的ACK應答信號 nop; while(DIO==1); nop; CLK = 1; nop; } /***************讀按鍵程序**************/ unsigned char read_key() { unsigned char rekey,i; I2CStart(); I2CWritebyte(0x42); //寫讀鍵指令0x42 DIO=1; for(i=0;i<8;i++) { CLK=0; nop; nop; rekey=rekey>>1; //先讀低位 nop; nop; CLK=1; if(DIO) rekey=rekey|0x80; else rekey=rekey|0x00; nop; } CLK = 0; //判斷芯片發過來的ACK應答信號 nop; nop; while(DIO==1); nop; nop; CLK = 1; nop; nop; I2CStop(); return rekey; } /************顯示函數,地址自加一************/ void disp0(unsigned char *p) { unsigned char i; I2CStart(); I2CWritebyte(0x40); //數據命令設置:地址自動加1,寫數據到顯示寄存器 I2CStop(); I2CStart(); I2CWritebyte(0xc0); //地址命令設置:初始地址為00H for(i=0;i<6;i++) //發送4字節數據到顯存 { I2CWritebyte(*p); p++; } I2CStop(); I2CStart(); I2CWritebyte(0x8C); //顯示控制命令:開顯示,脈沖寬度為11/16. I2CStop(); } /************顯示函數,固定地址寫數據************/ void disp(unsigned char add, unsigned char value) { I2CStart(); I2CWritebyte(0x44); //數據命令設置:固定地址,寫數據到顯示寄存器 I2CStop(); I2CStart(); I2CWritebyte(add); //地址命令設置:寫入add對應地址 I2CWritebyte(CODE[value]); //給add地址寫數據 I2CStop(); I2CStart(); I2CWritebyte(0x8C); //顯示控制命令:開顯示,脈沖寬度為11/16. I2CStop(); } /************按鍵處理函數,按鍵數據低位在前高位在后************/ void key_process() { unsigned char temp; temp=read_key(); //讀取按鍵返回值 if(temp!=0xff) { disp0(TAB); //清屏 switch(temp) { case 0xf7 : disp(0xc0,1);break; //K1與SG1對應按鍵按下,顯示1 case 0xf6 : disp(0xc1,2);break; //K1與SG2對應按鍵按下,顯示2 case 0xf5 : disp(0xc2,3);break; //K1與SG3對應按鍵按下,顯示3 case 0xf4 : disp(0xc3,4);break; //K1與SG4對應按鍵按下,顯示4 case 0xef : disp(0xc4,5);break; //K2與SG1對應按鍵按下,顯示5 case 0xee : disp(0xc5,6);break; //K2與SG2對應按鍵按下,顯示6 case 0xed : disp(0xc0,7);break; //K2與SG3對應按鍵按下,顯示7 default : break; } } } void main() {
disp0(CODE); //上電數碼管顯示0~5 delay_nms(1); while(1) //按鍵后顯示按鍵內容 { key_process(); delay_nms(100); } }
