日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。