折騰一天終于將TM1620芯片驅動6位8段顯示搞出來了,共享一下,源碼傳上。
TM1620.JPG (82.65 KB, 下載次數: 110)
下載附件
2018-4-8 19:07 上傳
單片機源程序如下:
- /*
- 文件名: TM1620
- 單片機型號: stc90c52
- 開發環境: Keil uVision2
- 晶震頻率: 12M
- 功能:驅動共陰LED數碼屏做計時顯示,可由按鍵控制時鐘暫停,開始,停止以及顯示0-9數字
- 驅動6位8段數碼顯示完美,OK
- */
- #include<reg52.h>
- #include<intrins.h>
- #define nop _nop_();
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit stb =P0^0; //定義片選通訊口
- sbit clk =P0^1; //定義時鐘通訊口
- sbit dio =P0^2; //定義數據輸入/輸出通訊口
-
- uchar cir_LED[6]={ 0x80,0x40,0x02,0x01,0x04,0x10};//數碼屏圓圈做動態顯示,我的PCB接線方式不同所以需修改
- uchar show[12] = { 0x76,0x00,0xb5,0x0,0x15,0x0,0x15,0x0,0xd7,0x0,0x0,0x0};//初始化顯示“HELLO”字符代碼
- uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //時間寄存器,依次從秒個位至小時十位
- uchar TIME_count; //定時中斷控制
- uchar count6=0;
- /*********************************
- 功能: TM1620寫數據
- **********************************/
- void write(uchar wr_data)
- {
- uchar i;
- stb =0; //給有效的片選信號(片選信號是低電平有效)
- nop;
- nop;
- for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
- {
- clk =0;
- nop;
- nop;
- wr_data >>= 1;//移位數據,低位在前!
- nop;
- dio = CY;
- nop;
- nop;
- clk =1;
- nop;
- }
- }
-
- /*********************************
- TM1620控制指令
- 功能: 驅動LED屏做相應的顯示
- **********************************/
- void xianshi(uchar show_led[12])
- {
- uchar h;
- stb = 1;
- clk = 1;
- dio = 1;
- write(0x02);//顯示模式設置,設置為6個GRID,8個SEG
- stb = 1;
- write(0x40);//寫數據到顯示寄存器,采用地址自動加一
- stb = 1;
- write(0xc0);//顯示寄存器的00H單元開始
- for(h=0;h<12;h++)
- {
- write(show_led[h]);//給顯示寄存器送數據,
- }
- stb=1;
- write(0x8b);//顯示控制參數,點亮數碼屏幕,亮度可以通過改變低三位調節
- }
- /**********************************
- 定時中斷函數入口
- 功能: 每50MS中斷一次
- **********************************/
- void time0(void) interrupt 1 using 2
- {
- TH0=0x3c;
- TL0=0xb0;
- TIME_count++;
- if(TIME_count==20)
- {
- TIME_count = 0;
- TIME_seconds++; // 秒寄存器加1
- count6 +=1;
- show[2] = (show[2]^0x10);//數碼屏幕冒號驅動位
- }
- }
- /*********************************
- 計時函數
- 功能: 處理時鐘顯示
- **********************************/
- void TIME_show()
- {
- uchar CODE[] ={0xD7,0x42,0xE5,0xE3,0x72,0xB3,0xB7,0xC2,0xF7,0xF3,0xF6,0x37,0x95,0x67,0xB5,0xB4};//my board seg code
- // {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- if(count6 == 6)
- {
- count6 = 0;
- }
- show[0] = cir_LED[count6];//0x0;//關閉第一位顯示
- show[2] = cir_LED[count6]; //數碼屏圓圈驅動位
-
- show[10] = CODE[TIME_seconds];// 數碼屏上最后一個“8”
- show[8] = CODE[seconds_2]; //數碼屏倒數第二個“8”字,
- show[6] = CODE[sub_1];
- show[4] = CODE[sub_2];
- if(TIME_seconds == 10) //對時間數據進行處理,以免溢出。
- {
- TIME_seconds = 0;
- seconds_2+=1;
- }
- if(seconds_2 == 6)
- {
- seconds_2 = 0;
- sub_1 +=1;
- }
- if(sub_1 == 10)
- {
- sub_1 = 0;
- sub_2 +=1;
- }
- if(sub_2 == 6)
- {
- sub_2 = 0; //時鐘每60分自動清0
- sub_2 = 0;
- sub_1 = 0;
- seconds_2 = 0;
- TIME_seconds = 0;
- }
- }
- /********************************
- 延時函數
- 功能: 1ms延時
- **********************************/
- void delay_ms(uchar cyc)
- {
- //當將=1的時候,延時1ms
- uchar ii,jj;
- for(jj=1;jj<=cyc;jj++)
- {
- for(ii=0;ii<200;ii++)
- {
- nop;
- }
- }
- }
- /*********************************
- 主函數
- **********************************/
- void main()
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;//初始化單片機I/O口
- TMOD=0x01; //定時器設置
- TH0=0x3c;
- TL0=0xb0;
- IE=0x82;
- TF0=1;
- xianshi(show);//初始化顯示“HELLO”字符
- delay_ms(230);
- delay_ms(230);
- delay_ms(230);
- delay_ms(230);
- delay_ms(230); //共延時1s
- TR0 = 1;
- //show[2] = 0x01;
- while(1)//循環
- {
- stb = 1;
- dio = 1;
- clk = 1;
- TIME_show(); //控制做計時顯示
- xianshi(show);//根據計時拆分的值,給顯示寄存器送相應的顯示數據
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
test1.rar
(1.91 KB, 下載次數: 269)
2018-4-8 19:07 上傳
點擊文件名下載附件
STC90C52RC 下載積分: 黑幣 -5
|