- ****************************************************************************************************/ #include < REG52.h>
- #include<stdio.h> #include<intrins.h>//************************************************************************************************** #define tm1616 1
- #define tm1618 2
- #define tm1618a 3
- #define tm1620 4
- #define tm1620b 5
- #define tm1623 6
- #define tm1624 7
- #define tm1626a 8
- #define tm1626b 9
- #define tm1626c 10
- #define tm1626d 11
- #define tm1628 12
- #define tm1629 13
- #define tm1629a 14
- #define tm1629b 15
- #define tm1629c 16
- #define tm1629d 17
- #define tm1638 18
- #define tm1668 19
- #define tw1628 20
- #define icmodel tm1616 //這里選擇的TM1616,更改“tm1616”可以得到其他型號IC的驅動程序
- #if icmodel== tm1616
- #define seg 7
- #define grid 4
- #define dismodel 1
- #elif icmodel== tm1618
- #define seg 5
- #define grid 7
- #define key 3
- #define dismodel 4
- #elif icmodel== tm1618a
- #define seg 7
- #define grid 5
- #define key 4
- #define dismodel 2
- #elif icmodel== tm1620
- #define seg 8
- #define grid 6
- #define dismodel 3
- #elif icmodel== tm1620b
- #define seg6
- #define grid7
- #define key3
- #define dismodel 4
- #elif icmodel== tm1623
- #define seg 11
- #define grid 7
- #define key 4
- #define dismodel 4
- #elif icmodel== tm1624
- #define seg 11
- #define grid 7
- #define dismodel 4
- #elif icmodel== tm1626a
- #define seg 10
- #define grid 7
- #define key 5
- #define sw 2
- #define led 6
- #define dismodel 4
- #elif icmodel== tm1626b
- #define seg 11
- #define grid 7
- #define key 5
- #define sw 4
- #define led 6
- #define dismodel 4
- #elif icmodel== tm1626c
- #define seg 11
- #define grid 7
- #define key 5
- #define led 1
- #define dismodel 4
- #elif icmodel== tm1626d
- #define seg 10
- #define grid 7
- #define key 5
- #define led 1
- #define dismodel 4
- #elif icmodel== tm1628
- #define seg 10
- #define grid 7
- #define key 4
- #define dismodel 4
- #elif icmodel== tm1629
- #define seg 16
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629a
- #defineseg 16
- #definegrid 8
- #definedismodel 1
- #elif icmodel== tm1629b
- #defineseg 14
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629c
- #defineseg 15
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1629d
- #defineseg 12
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1638
- #defineseg 10
- #definegrid 8
- #definekey 4
- #definedismodel 1
- #elif icmodel== tm1668
- #define seg 10
- #definegrid 7
- #definekey 5
- #definedismodel 1
- #elif icmodel== tw1628
- #defineseg 10
- #definegrid 7
- #definekey 5
- #define dismodel 1
- #else
- #error "你必須確認IC的型號是否存在?"
- #endif
- #define dissetmode 0x03 / /顯示模式設置
- #define writedatamode_z 0x40 //采用地址自動加一方式寫顯存
- #define writeledmode_z 0x41 //采用地址自動加一方式寫LED顯存命令
- #define readkeymode 0x42 //讀按鍵命令
- #define readswmode 0x43 //讀SW口命令
- #define writedatamode_g 0x44 //采用固定地址方式寫顯存
- #define writeledmode_g 0x45 //采用固定地址方式寫LED顯存命令
- #define startaddress 0xc0 //起始地址
- #define disconmode 0x8c //顯示控制
- #define datacount 2*grid //采用地址自動加一方式傳輸數據的個數
- //定義全局變量
- unsigned char k1, k2, k3, k4, k5; //按鍵值寄存器
- unsigned da_sw; //SW寄存器
- unsigned int count;
- //端口的定義
- sbit STB= P2^0;
- sbitCLK= P2^1;
- sbitDIO= P2^2; / /串行通訊口
- sbit SPEAK = P2^7; //外接蜂鳴器,可以不必理會
- //*********************************************子程序開始************************************
- //----------------------------------------------延時程序開始---------------------------------
- void delay(int k)
- { unsigned char i,j;
- for(;k>0;k--)
- for(j=255;j>0;j--)
- for(i=255;i>0;i--);
- }
- / /----------------------------------------------延時程序結束---------------------------------- //----------------------------------------------寫入輸入1個字節(8bit)到LED_IC程序開始---------
- //輸入8BIT數據
- //在時鐘的上升沿通過MCU向LED驅動IC——TM16xx寫數據
- void indate(unsigned char p)
- { unsigned int i;
- STB=0; //保證“STB”為低電平,程序不依賴于之前端口的狀態
- //保證程序在實際運行中不會出現“端口迷失”
- for(i=0;i<8;i++)
- { CLK=0; //先將“CLK”清零
- if((p& 0x01)!=0)
- { DIO=1; //需要傳送的數據的低位為“1”,則把“DIO”清零
- }else
- {
- DIO=0; //需要傳送的數據的低位為“0”,則把“DIO”置高
- }
- CLK=1; //送時鐘的上升沿
- p=p>>1; //準備送下一個BIT } //送完一個字節后退出循環
- }
- / /----------------------------------------------寫入輸入1個字節(8bit)到LED_IC程序結束--------- //----------------------------------------------從LED_IC讀入1個字節(8bit)程序開始-------------
- //輸出8BIT數據
- //在時鐘的上升沿通過MCU從LED驅動IC——TM16xx讀數據
- # ifdef key
- unsigned char outdate()
- { unsigned char i,k=0; //i——控制循環次數,k——臨時保存讀到的數據
- DIO=1; //釋放DIO為輸入
- STB=0; //保證“STB”為低電平,程序不依賴于之前端口的狀態 //保證程序在實際運行中不會出現“端口迷失”
- for(i=0;i<8;i++)
- { CLK=0; //先將“CLK”清零
- k=k>>1;
- if(( P2 & 0x04)==0)
- {
- k=k& 0x7f; //如果“DIO”為低電平,則把k的最高位清“0”,其他各位保持不變
- }
- else
- {
- k=(k| 0x80& 0xff); //如果“DIO”為高電平,則把k的最高位置“1”,其他各位保持不變
- }
- CLK=1; //送時鐘的上升沿
- } //送完一個字節后退出循環
- return(k); //返回讀到的1字節數據
- }
- #endif
- / /----------------------------------------------從LED_IC讀入1個字節(8bit)程序結束----------- //----------------------------------------------采用地址自動加一方式傳輸地址和數據開始------
- //采用地址自動加1方式
- //上電后LED-DRIVER顯存中的數據是隨機的,上電后馬上傳顯示控制命令字(打開顯示),會出現亂碼。
- //為避免上述現象,用戶可以先傳顯示控制命令將顯示關掉(見應用手冊中詳細介紹),然后正常操作
- //也可以先主動刷新LED-DRIVER顯存中的數據。然后開顯示
- //這里采用是第二種方法
- void display(unsigned char disa)
- {
- unsigned int i; //i——控制本次需要傳多少個字節顯示數據
- DIO=1;CLK=1;
- STB=1; //通訊開始前通訊端口全部初始化為“1”
- indate( writedatamode_z); //傳數據設置命令,設置采用地址自動加1方式寫顯示數據,
- STB=1; //數據設置命令傳完后需要將“STB”置“1”
- indate(startaddress); //傳起始地址
- //地址命令傳完后,“STB”保持為“0”繼續傳需要顯示的數據
- for(i=0;i<datacount;i++)
- {
- indate(disa); //在連續傳顯示的數據過程中,“STB”一直保持為”0“
- }
- STB=1; //傳完所有的顯示數據后(最多14BYTE)后,將“STB置“1”
- indate(disconmode); //傳顯示控制命令
- STB=1; //顯示控制命令傳完后將“STB”置“1”
- }
- / /----------------------------------------------采用地址自動加一方式傳輸地址和數據結束------- //----------------------------------------------采用固定地址方式傳輸地址和數據開始-----------
- //采用固定地址方式
- void display2(unsigned char adress,disa)
- {
- DIO=1;
- CLK=1;
- STB=1; //通訊開始前通訊端口全部初始化為“1”
- indate( writedatamode_g); //數據設置命令
- STB=1;
- indate(adress); //傳顯示數據對應的地址
- indate(disa); //保持“STB”=“0”,傳1BYTE顯示數據
- STB=1; //傳完顯示數據后將“STB”置“1”
- }
- / /----------------------------------------------采用固定地址方式傳輸地址和數據結束------------- //----------------------------------------------按鍵掃描程序開始------------------------------
- //按鍵掃描 //只要定義了key都將執行按鍵掃描程序,且必須從低字節開始讀
- # ifdef key
- unsigned char keyscan()
- {
- STB=1;
- indate(readkeymode); //傳數據設置命令,設置為讀按鍵
- //“STB”保持為“0”,讀鍵值
- //將讀到的鍵值保存在MCU的寄存器中
- //根據IC型號讀指定字節,不允許多讀,否則會造成讀按鍵不穩定
- if(key >=1)
- k1=outdate();
- if(key >=2)
- k2=outdate();
- if(key >=3)
- k3=outdate();
- if(key >=4)
- k4=outdate();
- if(key >=5)
- k5=outdate();
- STB=1;
- return 0; //讀鍵結束將“STB”置“1”
- }
- #endif
- //----------------------------------------------按鍵掃描程序結束----------------------------------
- //----------------------------------------------PWM數據傳輸開始-----------------------------------
- # ifdef led
- unsigned char in_led()
- {
- STB=1;
- indate( writeledmode_z); //數據設置命令,設置為寫LED顯存
- STB=1;
- indate( 0xc0); //起始地址,這里的地址和
- indate( 0x0f); //LED1寬度設置
- indate( 0x0f); //LED2寬度設置
- indate( 0x0f); //LED3寬度設置
- indate( 0x00); //關閉LED123同步調節
- indate( 0x0f); //LED4寬度設置
- indate( 0x0f); //LED5寬度設置
- indate( 0x0f); //LED6寬度設置
- indate( 0x00); //關閉LED456同步調節
- STB=1;
- return 0;
- }
- #endif //----------------------------------------------PWM數據傳輸結束-------------------------------------
- # ifdef led
- unsigned char in_led_g(unsigned char adress_led, da_led)
- {
- STB=1;
- indate( writeledmode_g);
- STB=1;indate( adress_led);
- indate( da_led);
- STB=1;
- return 0;
- } #endif
- //----------------------------------------------讀入SW口狀態開始------------------------------------
- # ifdef sw
- unsigned char out_sw()
- {
- STB=1;
- indate(readswmode); //數據設置命令,設置為讀SW輸入口
- d a_sw=outdate();
- STB=1;
- return 0;
- }
- #endif / /----------------------------------------------讀入SW口狀態結束----------------------------------- //*********************************************子程序結束****************************************** //*********************************************主程序開始******************************************
- void main(void)
- {
- SPEAK=0;
- DIO=1;
- CLK=1;
- STB=1;
- indate(dissetmode); / /傳顯示模式設置命令,設置為7個“GRID”方式
- //這里不在詳細給出多個顯示模式的設置程序請參考產品應用手冊,顯示模式在上電設置好后不允許更改
- STB=1;
- display( 0xff); //全亮
- delay(10);
- display2( 0xC0, 0x00); //采用固定地址方式向C0地址單元寫00
- delay(10);
- #ifdef key
- keyscan(); //調用按鍵掃描程序
- #endif //本程序僅僅提供按鍵掃描,2次按鍵掃描的時間不得<10MS,在這里不提供按鍵處理程序
- #ifdef led
- in_led(); //6路PWM輸出口輸出"1"
- delay(10);
- in_led_g( 0xc0, 0x00); //讓LED1輸出"0"
- #endif
- #ifdef sw out_sw(); //調用讀SW輸入口程序
- #endif //這里不提供SW口處理程序
- _nop_();
- }
- //*********************************************主程序結束*******************************************
復制代碼
|