折腾一天终于将TM1620芯片驱动6位8段显示搞出来了,共享一下,源码传上。
单片机源程序如下:
- /*
- 文件名: 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)
|