各位大神:新年好! 最近做了一个温度报警器,数码管为3位的共阴数码管。在全显时显示正常的,在动态显示时就会出现笔画暗淡不清楚的现象。看了一下论坛,感觉应该是程序中的消隐没有处理好,因个人能力有限,程序基本上都是摘录论坛各路大神的现有程序修改的。希望各位大神能帮忙看一下程序看看是否程序有问题,谢谢!
- /***********四位共阴数码管驱动程序************/
- //stc15w单片机
- //1在主程序前加上初始化init();程序
- //2硬件连接变动时需修改下面的参数
- sbit H1 = P1^0;//设置第1位数码管阴极连接的I/O口
- sbit H2 = P1^1;//设置第2位数码管阴极连接的I/O口
- sbit H3 = P1^2;//设置第3位数码管阴极连接的I/O口
- //sbit H4 = P1^5;//设置第4位数码管阴极连接的I/O口
- sbit a = P3^5;
- sbit b = P3^4;
- sbit c = P3^3;
- sbit d = P3^2;
- sbit e = P2^1;
- sbit f = P2^0;
- sbit g = P3^7;
- sbit dp = P3^6;
- #define P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
- #define P1M1SET 0x00 //设置I/O口工作方式//00000000
- #define P3M0SET 0xff //设置I/O口工作方式//11111111
- #define P3M1SET 0x00 //设置I/O口工作方式//00000000
- #define P2M0SET 0xff //设置IO口工作方式11111111
- #define P2M1SET 0x00 //设置IO口工作方式00000000
- /*****以上定义需要根据实际硬件情况更改******/
- data unsigned char PWM;//显示亮度
- #define light 9 //设置LED显示的亮度(值域:1~9)
- #define DELAY_L 12 //设置每一个点显示的时间长度(1~20)
- /********* 延时函数 ***************/
- void delay (unsigned int a){ // 用于点扫描的延时
- unsigned int i;
- while( a-- != 0){
- for(i = 0; i < DELAY_L; i++);
- }
- }
- /*********************************************************************************************/
- unsigned char code disdata[]={
- 0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,
- 0x71,0x40};//0-9,A-F,-
- //数码管:正向位置;共YIN极;正向连接
- void dis_off (void)
- {
- P3 = ~P3M0SET; //关所有显示
- P2 = ~P2M0SET;
- H1=H2=H3=1;//P1 = ~P1M0SET;
- delay(10-PWM);
- }
- /*********************************************************************************************/
- void displayHH1 (unsigned char q){ //第1位数码管显示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H1 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H1 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H1 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H1 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H1 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H1 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H1 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H1 = 0;dp = 1;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH2 (unsigned char q){ //第2位数码管显示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H2 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H2 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H2 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H2 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H2 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H2 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H2 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H2 = 0;dp = 1;}delay(PWM);dis_off();
- }
- /*********************************************************************************************/
- void displayHH3 (unsigned char q){ //第3位数码管显示程序
- unsigned char i;
- i = q & 0x01;
- if(i == 0x01){
- H3 = 0;a = 1;}delay(PWM);dis_off();
- i = q & 0x02;
- if(i == 0x02){
- H3 = 0;b = 1;}delay(PWM);dis_off();
- i = q & 0x04;
- if(i == 0x04){
- H3 = 0;c = 1;}delay(PWM);dis_off();
- i = q & 0x08;
- if(i == 0x08){
- H3 = 0;d = 1;}delay(PWM);dis_off();
- i = q & 0x10;
- if(i == 0x10){
- H3 = 0;e = 1;}delay(PWM);dis_off();
- i = q & 0x20;
- if(i == 0x20){
- H3 = 0;f = 1;}delay(PWM);dis_off();
- i = q & 0x40;
- if(i == 0x40){
- H3 = 0;g = 1;}delay(PWM);dis_off();
- i = q & 0x80;
- if(i == 0x80){
- H3 = 0;dp = 1;}delay(PWM);dis_off();
- }
- void diplay_data (unsigned char l,unsigned char q){
- switch (l){//显示的数码管位置
- case 1://
- displayHH1(q); //将显示数据送入
- break;//
- case 2://
- displayHH2(q); //将显示数据送入
- break;//
- case 3://
- displayHH3(q); //将显示数据送入
- break;//
- // case 4://
- // displayHH4(q); //将显示数据送入
- // break;//
-
- }
- }
- /*******************************************/
- void init (void){
- P3M1=P3M1SET;
- P3M0=P3M0SET;
- P1M0=P1M0SET;
- P1M1=P1M1SET;
- dis_off();
- PWM = light;}
- /******************显示程序*************************
- i=t/100;
- diplay_data (1,disdata[i]);
- i=t%100/10;
- diplay_data (2,disdata[i]+0x80);
- i=t%100%10;
- diplay_data (3,disdata[i]); */
复制代码
篇幅限制,具体全部显示代码见附件。
4LED_YIN.rar
(1.25 KB, 下载次数: 7)
|