當前位置: 首頁 > 编程资源 > 编程问答 >内容正文 编程问答 TM1637 發布時間:2023/12/14 编程问答 32 豆豆 生活随笔 收集整理的這篇文章主要介紹了 TM1637 小編覺得挺不錯的,現在分享給大家,幫大家做個參考. /*?? ?*文件名:?????TM1637(TM6920)?? ?*當前版本:???1.0?? ?*單片機型號:?AT89S52?? ?*開發環境:???Keil?uVision3?? ?*晶震頻率:???12M?? ??*完成日期:???2008-6-19?? ?*功能:?????按鍵控制數碼屏顯示0-8;其中0-3由K1與KS1,KS2,KS3,KS4控制,4-8由K2與KS1,KS2,KS3,KS4,KS5控制?? */??? #include<reg52.h>??? #include<intrins.h>??? #define?nop?_nop_();?//恒定義nop為空指令??? sbit?clk?=?P1^0;??//設置串行時鐘通訊口??? sbit?dio?=?P1^1;??//設置串行數據傳送通訊口??? sbit?ack?=?P1^2;??//設置應答信號在p1.2口??? unsigned?char?m=0x00;??? bdata?unsigned?char?y,t;//定義可以位尋址的兩個全局變量??? sbit?y7=y^7;??? sbit?t5?=?t^5;??? //----------給IC寫數據(包括開始信號,8位數據,ACK應答信號)--??? void?write(unsigned?char?p)??? {??? ??unsigned?int?i;??? ??clk?=?1;??//給芯片發送開始信號??? ??dio?=?1;??? ??nop;??? ??nop;??? ??dio?=?0;??? ??nop;??? ??nop?;??? ??clk?=?0;??//開始信號傳送完??? ??for(i=0;i<8;i++)?//開始傳送8位數據??? ???{??? ?????clk?=0;??? ?????if((p&0x01)!=0)??? ??????{??? ?????????dio=1;??? ???????}??? ?????else??? ???????{??? ?????????dio=0;??? ???????}??? ???????clk?=1;??? ???????p=p>>1;??? ????}?????? ?????????//8位數據傳送完1??? ???clk?=?0;//判斷芯片發過來的ACK應答信號??? ???nop;??? ???nop;??? ???dio?=?1;??? ???nop;??? ???nop?;??? ???clk?=?1;??? ???ack?=?dio;//將應答信號給ACK。??? ???nop;??? ???nop;??? }??? //---------讀按鍵數據子程序-----------??? void?read()??? {??? ????? ??unsigned?char?x=0;??? ??nop;??? ??nop;??? ??clk?=?0;??? ?for(x=0;x<8;x++)?//讀按鍵數據開始??? ?{??? ???clk?=?0;??? ???nop;??? ???if(dio==1)??? ????{??? ?????y7?=?1;??? ?????}??? ??else??? ????{??? ?????y7?=?0;??? ?????}??? ????clk?=?1;??? ????nop;??? ????nop;??? ????//y=(y>>1);??? ????if(x!=7){y=(y>>1);}//讀按鍵時,不需要開始信號,直接讀8位數據。??? ??}??? ??clk?=?0;??? ???nop;??? ???nop;??? ???dio?=?1;??? ???nop;??? ???nop?;??? ???clk?=?1;??? ???ack?=?dio;??? ???nop;??? ???nop;??????//ACK應答信號??? }???? //---------結束信號-------------------??? void?jieshu()??? {??? ??clk?=?0;??? ??nop;??? ??nop;??? ??dio?=?0;??? ??nop;??? ??nop;??? ??clk?=?1;??? ??nop;??? ??nop;??? ??nop;??? ??dio?=?1;??? }??? //----------顯示子函數------------??? void?xianshi(unsigned?char?q)??? {??? ??unsigned?char?a=0;??? ??dio?=?1;??? ??clk?=?1;??? ??write(0x40);//寫命令40H(數據設置),地址自動加一??? ??while(ack);?//判斷ACK應答信號,為1就死循環等待,為0就繼續執行,表明數據已經發送成功。??? ??jieshu();?//調用結束信號,一個字節命令發送完畢,可以發送下一個命令??? ??nop;??? ??nop;??? ??nop;??? ??nop;??? ??write(0xc0);//寫起始地址命令(0C0H),地址從00H單元開始。??? ??while(ack);??? ??for(a=0;a<6;a++)??? ???{??? ?????write(q);//給顯示寄存器寫顯示數據,值可根據實參改變??? ?????while(ack);//送一字節數據需要ACK信號,ACK為1,死循環,ACK為0,就繼續送數據??? ????}??? ????jieshu();?//將所有數據送完后,發結束信號,可以發送下一條命令??? ????nop;??? ????nop;??? ????nop;??? ????write(0x8b);?//送開屏命令,(8BH),亮度可以根據低三位調節。??? ????while(ack);??? ????jieshu();??? }??? //----------判按鍵子程序-----------??? void?panjian(unsigned?char?k)??? {??? ????if((k==0xf7)){m=0x3f;}?//當K1與SEG1按鍵按下時候;給q送3FH,數碼管顯示數字0。??? ????if?((k==0xf6)){m=0x06;}//當K1與SEG2按鍵按下時候;給q送06H,數碼管顯示數字1。??? ????if((k==0xf5)){m=0x5b;}//當K1與SEG3按鍵按下時候;給q送5BH,數碼管顯示數字2。??? ????if((k==0xf4)){m=0x4f;}?//當K1與SEG4按鍵按下時候;給q送4FH,數碼管顯示數字3。??? ????if?((k==0xef)){m=0x66;}//當K2與SEG1按鍵按下時候;給q送66H,數碼管顯示數字4。??? ????if((k==0xee)){m=0x6d;}//當K2與SEG2按鍵按下時候;給q送6DH,數碼管顯示數字5。??? ????if?((k==0xed)){m=0x7d;}//當K2與SEG3按鍵按下時候;給q送06H,數碼管顯示數字6。??? ????if((k==0xec)){m=0x07;}//當K2與SEG4按鍵按下時候;給q送5BH,數碼管顯示數字7。??? ????if((k==0xeb)){m=0x7f;}//當K2與SEG4按鍵按下時候;給q送5BH,數碼管顯示數字8。??? }??? ??? //----------主函數-----------------??? void?main()??? {??? ?P0=0x00;??? ?P1=0xff;??? ?P2=0x00;??? ?P3=0x00;//初始化單片機I/O口??? ?while(1)//循環讀按鍵??? ?{????????????? ?dio?=?1;??? ?clk?=?1;??? ?write(0x42);//送讀按鍵命令(42H),??? ?while(ack);?//送應答信號,如果沒有應答信號(ACK=1)就死循環,有應答信號(ACK=0)就繼續往下執行。??? ?read();????//讀8位按鍵數據,其中高三位為0,低5位為按鍵編碼。編碼表見說明書第5頁。??? ?while(ack);//送應答信號,如果沒有應答信號(ACK=1)就死循環,有應答信號(ACK=0)就繼續往下執行。??? ?jieshu();?//讀完反碼,發結束信號,按鍵讀取完畢。??? ?panjian(y);//判斷按鍵值。??? ?xianshi(m);//根據按鍵值,給顯示寄存器送相應的顯示數據??? ?}??? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 總結 以上是生活随笔為你收集整理的TM1637的全部內容,希望文章能夠幫你解決所遇到的問題。 如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。 歡迎分享! 轉載請說明來源于"生活随笔",并保留原作者的名字。 本文地址:TM1637 上一篇: uniapp+unicloud开发微信小 下一篇: iPhone的解锁、越狱、激活、固件等等