本帖最后由 mengsiu 于 2022-9-20 11:25 編輯
發(fā)一段我以前寫的TM1650的驅(qū)動程序:- /*--------------------------------------------------------------------------
- TM1650.H
- 四位數(shù)碼管驅(qū)動 TM1650 讀寫程序
- --------------------------------------------------------------------------*/
- #ifndef __TM1650_H__
- #define __TM1650_H__
- sbit CLK = P3^7;
- sbit DIO = P3^6;
- void Set1650(uchar add,uchar dat);
- uchar Scan_Key(void);
- uchar BL = 1; //亮度等級
- uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
- // 0 1 2 3 4 5 6 7 8 9
- void Init1650(){
- Set1650(0x48,(BL*16+0x01));//設(shè)定亮度,開顯示八段顯示方式,后一個字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開關(guān)顯
- //如:0x71為七級亮度,八段顯示方式,開顯示;0x79為為七級亮度,七段顯示方式,開顯示
- }
- void Delay_us(uint i){ //us延時
- for(;i>0;i--){
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- void Start1650(void){//開始信號
- CLK = 1;
- DIO = 1;
- Delay_us(5);
- DIO = 0;
- }
- void Ask1650(void){ //ACK信號
- uchar timeout = 1;
- CLK = 1;
- Delay_us(5);
- CLK = 0;
- while((DIO)&&(timeout<=100)){
- timeout++;
- }
- Delay_us(5);
- CLK = 0;
- }
- void Stop1650(void){ //停止信號
- CLK = 1;
- DIO = 0;
- Delay_us(5);
- DIO = 1;
- }
- void WrByte1650(uchar oneByte){//寫一個字節(jié)高位在前,低位在后
- uchar i;
- CLK = 0;
- Delay_us(1);
- for(i=0;i<8;i++){
- oneByte = oneByte<<1;
- DIO = CY;
- CLK = 0;
- Delay_us(5);
- CLK = 1;
- Delay_us(5);
- CLK = 0;
- }
- }
- uchar Scan_Key(void){ // 按鍵掃描
- uchar i;
- uchar rekey;
- Start1650();
- WrByte1650(0x49);//讀按鍵命令
- Ask1650();
- //DIO = 1;
- for(i=0;i<8;i++){
- CLK = 1;
- rekey = rekey<<1;
- if(DIO){
- rekey++;
- }
- Delay_us(5);
- CLK = 0;
- }
- Ask1650();
- Stop1650();
- return(rekey);
- }
- void Set1650(uchar add,uchar dat){ //數(shù)碼管顯示
- //寫顯存必須從高地址開始寫
- Start1650();
- WrByte1650(add); //第一個顯存地址
- Ask1650();
- WrByte1650(dat);
- Ask1650();
- Stop1650();
- }
- #endif
復(fù)制代碼
|