返回该小组首页 回复主题
程序匠人

程序匠人

小组等级:     E币:1300  (E币换礼)

#1楼主:交差作业 之二——多文件系统数码管显示4(display.c)

文章发表于:2008-05-27 11:19

//--------------------------------------------------------
// 项目:
// 模块:显示处理
// 说明:
// 设计:程序匠人(版权所有,引用者请保留原作者姓名)
//--------------------------------------------------------
/*
版本说明:
display.c  2008-5-23 21:16


*/
//--------------------------------------------------------


//--------------------------------------------------------
//插入文件包
//--------------------------------------------------------
#include "common.h"
//--------------------------------------------------------

//--------------------------------------------------------
//说明:由于开液晶的人是个笨蛋,所以本项目的LCD中有3种不同的段码表分别是:
//A类代码:累计窗区域
//B类代码:小计窗区域
//C类代码:档位显示区域
//--------------------------------------------------------

//****************************
//字符笔画代码表:(A类代码)
//     A
//   -----
//  F| G |B
//    -----
//  E| D |C
//    -----
//   ·H
//****************************
//段定义
#define  sA_a   ( 1 << 0 )      
#define  sA_b   ( 1 << 1 )      
#define  sA_c   ( 1 << 2 )      
#define  sA_d   ( 1 << 3 )      
#define  sA_e   ( 1 << 4 )      
#define  sA_f   ( 1 << 5 )      
#define  sA_g   ( 1 << 6 )      
#define  sA_h   ( 1 << 7 )

//字符定义
#define  SEGA_0  ~( sA_a + sA_b + sA_c + sA_d + sA_e + sA_f  ) //'0'  
#define  SEGA_1  ~( sA_b + sA_c      ) //'1'  
#define  SEGA_2  ~( sA_a + sA_b + sA_d + sA_e + sA_g    ) //'2'  
#define  SEGA_3  ~( sA_a + sA_b + sA_c + sA_d + sA_g   ) //'3'  
#define  SEGA_4  ~( sA_b + sA_c + sA_f + sA_g    ) //'4'  
#define  SEGA_5  ~( sA_a + sA_c + sA_d + sA_f + sA_g   ) //'5'  
#define  SEGA_6  ~( sA_a + sA_c + sA_d + sA_e + sA_f + sA_g  ) //'6'  
#define  SEGA_7  ~( sA_a + sA_b + sA_c     ) //'7'  
#define  SEGA_8  ~( sA_a + sA_b + sA_c + sA_d + sA_e + sA_f + sA_g ) //'8'  
#define  SEGA_9  ~( sA_a + sA_b + sA_c + sA_d + sA_f + sA_g  ) //'9'
#define  SEGA_A  ~( sA_a + sA_b + sA_c + sA_e + sA_f + sA_g  ) //'A'大写 
#define  SEGA_B  ~( sA_a + sA_b + sA_c + sA_d + sA_e + sA_f + sA_g ) //'B'大写  
#define  SEGA_B_  ~( sA_a + sA_d + sA_e + sA_f + sA_g   ) //'b'小写  
#define  SEGA_C  ~( sA_a + sA_d + sA_e + sA_f     ) //'C'大写 
#define  SEGA_C_  ~( sA_d + sA_e + sA_g     ) //'c'小写 
#define  SEGA_D_  ~( sA_b + sA_c + sA_d + sA_e + sA_g   ) //'d'小写 
#define  SEGA_E  ~( sA_a + sA_d + sA_e + sA_f + sA_g   ) //'E'大写 
#define  SEGA_F  ~( sA_a + sA_e + sA_f + sA_g    ) //'F'大写 
#define  SEGA_G  ~( sA_a + sA_c + sA_d + sA_e + sA_f + sA_g  ) //'G'大写
#define  SEGA_G_  ~( sA_a + sA_b + sA_c + sA_d + sA_f + sA_g  ) //'g'小写 
#define  SEGA_H  ~( sA_b + sA_c + sA_e + sA_f + sA_g   ) //'H'大写 
#define  SEGA_H_  ~( sA_c + sA_e + sA_f + sA_g    ) //'h'小写
#define  SEGA_I  ~( sA_b + sA_c      ) //'I'大写 
#define  SEGA_I_  ~( sA_c       ) //'i'小写 
#define  SEGA_J  ~( sA_b + sA_c + sA_d     ) //'J'大写 
#define  SEGA_J_  ~( sA_c + sA_d      ) //'j'小写 
#define  SEGA_K  ~( sA_b + sA_d + sA_e + sA_f + sA_g   ) //'K'大写 
#define  SEGA_L  ~( sA_d + sA_e + sA_f     ) //'L'大写 
#define  SEGA_M  ~( sA_a + sA_c + sA_e + sA_g    ) //'M'大写 
#define  SEGA_N  ~( sA_a + sA_b + sA_c + sA_e + sA_f     ) //'N'大写 
#define  SEGA_N_  ~( sA_c + sA_e + sA_g     ) //'n'小写 
#define  SEGA_O  ~( sA_a + sA_b + sA_c + sA_d + sA_e + sA_f  ) //'O'大写 
#define  SEGA_O_  ~( sA_c + sA_d + sA_e + sA_g    ) //'o'小写 
#define  SEGA_P  ~( sA_a + sA_b + sA_e + sA_f + sA_g   ) //'P'大写 
#define  SEGA_Q_  ~( sA_a + sA_b + sA_c + sA_f + sA_g   ) //'q'小写 
#define  SEGA_R_  ~( sA_e + sA_g      ) //'r'小写 
#define  SEGA_S  ~( sA_a + sA_c + sA_d + sA_f + sA_g   ) //'S'大写 
#define  SEGA_T_  ~( sA_d + sA_e + sA_f + sA_g    ) //'t'小写 
#define  SEGA_U  ~( sA_b + sA_c + sA_d + sA_e + sA_f     ) //'U'大写 
#define  SEGA_U_  ~( sA_c + sA_d + sA_e     ) //'u'小写 
#define  SEGA_V  ~( sA_b + sA_c + sA_d + sA_e + sA_f     ) //'V'大写 
#define  SEGA_V_  ~( sA_c + sA_d + sA_e     ) //'v'小写 
#define  SEGA_W  ~( sA_b + sA_d + sA_f + sA_g    ) //'W'大写 
#define  SEGA_X  ~( sA_b + sA_c + sA_e + sA_f + sA_g   ) //'X'大写 
#define  SEGA_Y_  ~( sA_b + sA_c + sA_d + sA_f + sA_g   ) //'y'小写 
#define  SEGA_Z  ~( sA_a + sA_b + sA_d + sA_e + sA_g    ) //'Z'大写 
#define  SEGA_O__ ~( sA_a + sA_b + sA_f + sA_g    ) //'o'上半圈 
#define  SEGA_  ~( 0       ) //' '空格  
#define  SEGA__  ~( sA_d       ) //'_'下划线  
#define  SEGA___  ~( sA_g       ) //'-'中划线  
#define  SEGA____ ~( sA_a       ) //'-'上划线 


//****************************
//显示段码表(A类代码)
//****************************
tU08 LCD_TAB_A[]=
{ //代码    //地址
 SEGA_0 ,   //0
 SEGA_1 ,   //1
 SEGA_2 ,   //2
 SEGA_3 ,   //3
 SEGA_4 ,   //4
 SEGA_5 ,   //5
 SEGA_6 ,   //6
 SEGA_7 ,   //7
 SEGA_8 ,   //8
 SEGA_9 ,   //9
 SEGA_A ,   //10
 SEGA_B_ ,   //11
 SEGA_C_ ,   //12
 SEGA_D_ ,   //13
 SEGA_E ,   //14
 SEGA_F ,   //15
 SEGA_G_ ,   //16
 SEGA_H_ ,   //17
 SEGA_I_ ,   //18
 SEGA_J_ ,   //19
 SEGA_K ,   //20
 SEGA_L ,   //21
 SEGA_M ,   //22
 SEGA_N ,   //23
 SEGA_O ,   //24
 SEGA_P ,   //25
 SEGA_Q_ ,   //26
 SEGA_R_ ,   //27
 SEGA_S ,   //28
 SEGA_T_ ,   //29
 SEGA_U ,   //30
 SEGA_V ,   //31
 SEGA_W ,   //32
 SEGA_X ,   //33
 SEGA_Y_ ,   //34
 SEGA_Z ,   //35
 SEGA_O__,   //36
 SEGA_ ,   //37 
 SEGA__ ,   //38 
 SEGA___ ,   //39 
 SEGA____   //40
};

 


//--------------------------------------------------------
//显示初始化
//出口: DISP_QUEUE[] =待显示字符队列(低位存放个位数据,依次类推)
//--------------------------------------------------------
void display_init(void)
{
 DISP_QUEUE[0] = 1 ;   
 DISP_QUEUE[1] = 2 ;   
 DISP_QUEUE[2] = 3 ;   
 DISP_QUEUE[3] = 4 ;   
}

//--------------------------------------------------------
//刷新显示缓冲区
//出口: DISP_QUEUE[] =待显示字符队列(低位存放个位数据,依次类推)
//--------------------------------------------------------
void new_display(void)
{
 DISP_QUEUE[3] = 2 ; //2   
 DISP_QUEUE[2] = 1 ; //1  
 DISP_QUEUE[1] = 18 ; //I  
 DISP_QUEUE[0] = 12 ; //C  
}


//--------------------------------------------------------
//显示扫描处理
//说明: 建议每1MS调用本模块一次,每次调用,刷新一位数码管显示
//入口: DISP_QUEUE[] =待显示字符队列(低位存放个位数据,依次类推)
// DISP_QUEUE_IP =待显示字符队列指针(位选指针,0=个位,1=十位,2=百位,3=千位)
//--------------------------------------------------------
void display(void)
{

 //关位选信号(清除上次显示内容)
 LED_COM_0 = LED_OFF ;
 LED_COM_1 = LED_OFF ;
 LED_COM_2 = LED_OFF ;
 LED_COM_3 = LED_OFF ;

 //送段选信号
 LED_SEG = LCD_TAB_A[DISP_QUEUE[DISP_QUEUE_IP]] ;

 //送位选信号
 switch( DISP_QUEUE_IP )     
 {
  case  0:    //显示个位  
   LED_COM_0 = LED_ON ;  //送位选信号;
   break;  

  case  1:    //显示十位  
   LED_COM_1 = LED_ON ;  //送位选信号;
   break;  

  case  2:    //显示百位  
   LED_COM_2 = LED_ON ;  //送位选信号;
   break;  

  case  3:    //显示千位 
   LED_COM_3 = LED_ON ;  //送位选信号;
   break;  

  default:
   break; 
 } 

 //延时
 delay(20) ;  //说明: 如果是定时调用本程序,则可以不必软件延时

 //位选指针+1
 if ( ++DISP_QUEUE_IP > 3 ) DISP_QUEUE_IP=0 ; //位选指针+1,>3时,=0

}

 

//--------------------------------------------------------
//
// THE END
//
// 版权所有:程序匠人(引用者请保留原作者姓名)
//
//--------------------------------------------------------

 

mikezhong

   小组等级:    E币:173  (E币换礼)

#2

文章发表于:2008-05-28 12:12

这个在主循环中调用,如果用有延时的话,其它的功能模块将不能及时响应...这个只好放到定时中断中处理了,是吧.?

程序匠人

   小组等级:    E币:1300  (E币换礼)

#3

文章发表于:2008-05-29 08:54

mikezhong :该程序是由主程序调用,并用软件延时。只要进行很小的修改即可满足实时性要求。

方法:

1、开启一个1ms(或2ms、3ms都可以)的定时中断。每次中断发生时,设置一个“扫描使能标志(比如就定义为“display_en”)”

2、在主程序循环中,将原来的这句:  

display();    //显示扫描处理   

更改为:

if (display_en)

{

display();    

display_en = 0 ;

}

 

3、取消本程序中的下面这个软件延时

//延时
 delay(20) ;  //说明: 如果是定时调用本程序,则可以不必软件延时

 

------------------------------

经过以上3个方面的修改,即可提高系统的时效性。

 

mikezhong

   小组等级:    E币:173  (E币换礼)

#4

文章发表于:2008-05-29 13:57

是的,有道理.

彩云

   小组等级:    E币:9136  (E币换礼)

#5

文章发表于:2008-05-29 22:46

匠人辛苦啦。如果有时间,希望整理到单片机助学小组里一份。

整理到一个贴子就行,将链接直接拷过去就OK。

呵。。辛苦啦

程序匠人

   小组等级:    E币:1300  (E币换礼)

#6

文章发表于:2008-05-30 00:28

好的,遵命

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章