- /* TM1620显示控制芯片
- * File: TM1620.c
- * Author:
- * Date:
- *
- * 显示屏内容:
- * 2.5位数字1,2,3位+0小数点+8个ICON
- *
- * 彩膜测试演示
- */
- #include <reg51.h>
- #include <intrins.h>
- /***************************
- *
- *
- *
- ****************************/
- #define u8 unsigned char
- #define u16 unsigned int
- sbit STB=P1^4;
- sbit CLK=P1^3;
- sbit DIO=P1^2;
- sfr P1M0 = 0x92; //
- sfr P1M1 = 0x91; //
- sfr P3M0 = 0xB2; //
- sfr P3M1 = 0xB1; //
- sbit LED=P2^7;
- sbit KEY=P3^2; //TP_FLAG 重合声明
- sbit KEYU=P3^0; // 亮度++
- sbit KEYD=P3^1; // 亮度--
- /*0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, */
- u8 code NUM[] = { 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0xff, };
- /*
- u8 code dat[] = { 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6, };
- u8 code NUM[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0xff, };
- u8 code ICON[] = { 0x80,0x80,0x80,0xff,0x3f, };
- u8 Key_value;
- */
- u8 DDRAM[12] ;
- u8 CRT; // 当前亮度参数值
- void get_key(void); // 按键更改亮度
- void delayus(u8 t)
- {
- while(t--);
- }
- //=============1MS======================//
- void delayms(u16 temp)
- {
- unsigned int i,j;
- for(j=temp;j>0;j--)
- {
- for(i=0;i<1000;i++) ;
- }
- LED=~LED;
- get_key();
- }
- void send_data(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- DIO = dat & 1;
- delayus(20);
- CLK=1;
- dat=dat>>1;
- delayus(20);
- }
-
- }
- /*
- void write_cmd(u8 cmd)
- {
- STB = 0;
- send_data(cmd);
- STB = 1;
- }
- void write_dat(u8 addr,u8 dat)
- {
- STB = 0;
- send_data(addr); // C0H~CBH
- send_data(dat); //
- STB = 1;
- }
- */
- void updata_TM1620(void)
- {
- u8 i;
- STB = 0;
- send_data(0x02);// 写入命令0x02:显示模式6位8段
- STB = 1;
- STB = 0;
- send_data(0x40);// 写入命令0x40:数据命令 固定地址0x44,地址自动增加0x41/42/43
- STB = 1;
- STB = 0;
- send_data(0xc0);// 写入命令0xc0:显示地址
- for(i=0;i<12;i++)
- {
- send_data(DDRAM[i]);
- }
- STB=1;
- delayus(20);
- STB = 0;
- send_data(CRT);// 写入命令0x8c:显示控制
- STB = 1;
- }
- void init_TM1620(void)
- {
- u8 i;
- delayus(100);
- for(i=0;i<12;i++)
- {
- DDRAM[i] = 0;
- }
- updata_TM1620();
- }
- void dis_num(u8 addr,u8 num) // addr = 1,2,3,4,5,6
- {
-
- DDRAM[addr *2 -2] = NUM[num] ;
- updata_TM1620();
- }
- void dis_icon(u8 addr,u8 icon) // addr = 3,4,5,6
- { // icon = 1,2
- addr = addr *2 -2 ;
- if (icon==1)
- DDRAM[addr] = 0x1c ; //左右单独显示
- else if (icon==2)
- DDRAM[addr] = 0xe0 ; //左右单独显示
- else if (icon==3)
- DDRAM[addr] = 0xfc ; // 全显
- else if(icon==4)
- DDRAM[addr] = 0x18 ; // %
- updata_TM1620();
- delayms(500);
- }
- void dis_clr(u8 dat)
- {
- u8 i;
- for(i=0;i<12;i++)
- {
- DDRAM[i] = dat;
- }
- updata_TM1620();
- }
- void get_key(void)
- {
- u8 i,t;
- t=CRT; // 保存原始值
- if(KEYU==0)
- {
- for(i=0;i<50;i++); // 延时去抖
- if(KEYU==0)
- {
- while(!KEYU);
- if(CRT<0x90)
- CRT++;
- }
- for(i=0;i<50;i++); // 延时去抖
- }
- if(KEYD==0)
- {
- for(i=0;i<50;i++); // 延时去抖
- if(KEYD==0)
- {
- while(!KEYD);
- if(CRT>0x80)
- CRT--;
- }
- for(i=0;i<50;i++); // 延时去抖
- }
- if(t!=CRT) // CRT值有改动则保存
- {
- iap_erase(0);
- write_eeprom(0,CRT);
- }
- }
- void int0_isr() interrupt 0
- {
- u8 i;
- EX0 = 0;
- for(i=0;i<150;i++); // 延时去抖
- if(!KEY) //有效按下
- {
- KEY = 1 ;
- for(i=0;i<150;i++);
- while(!KEY); //等待放手
-
- while(KEY); //二次按键
-
- while(!KEY); //等待放手
- }
- EX0 = 1 ;
- }
- // **********************
- // **** MAIN()***********
- // **********************
- void main(void)
- {
- u8 i;
- u8 I[] = {2,5,8};
- delayms(200);
- P1M1 = 0x00; //P1口推挽输出
- P1M0 = 0xff;
- P3M1 = 0x00; //P3口双向
- P3M0 = 0x00;
-
- //CRT = read_eeprom(0); // 读亮度值
- ////if(CRT>0x8f || CRT< 0x80) // 亮度值限制在80H~8FH之间
- //{
- // CRT = 0x8c;
- //}
- EA = 1; //开总中断
- EX0 = 1;//开外中断0
-
- init_TM1620(); //
-
- dis_clr(0);
- i = 0;
- while(1)
- {
- init_TM1620(); //
-
- dis_clr(0);
- delayms(100);
-
- dis_clr(0xff);
- delayms(1000);
-
- dis_clr(0);
- delayms(100);
-
- dis_num(1,I[i]); // 位1 显示5
- dis_num(2,I[i]); // 位2 显示5
-
- dis_icon(3,2); // 位3 显示min
- dis_icon(3,4); // 位3 显示%
-
- dis_icon(4,1); // 位4 显示右
- dis_icon(4,2); // 位5 显示左
- dis_icon(4,3); // 位5 全显
-
- dis_icon(5,1); // 位5 显示右
- dis_icon(5,2); // 位5 显示左
- dis_icon(5,3); // 位5 全显
-
- dis_icon(6,1); // 位6 显示右
- dis_icon(6,2); // 位6 显示左
- dis_icon(6,3); // 位6 他显
-
- delayms(500);
- i++;
- if(i==3)
- i=0;
-
- }
- }
复制代码
|