[经验] 多功能调试测试助手-LED点阵屏人机面板

蓝雨夜   2013-12-17 11:12 楼主
多功能调试测试助手-LED点阵屏人机面板环境说明:CubeSuites+
  
文件:
r_cg_port.c
r_cg_port_user.c
r_cg_timer.c
r_cg_timer_user.c
函数:
void R_TMR_RJ0_Create(void)//定时器rj0初始化 1ms定时

__interrupt static void r_tmr_rj0_interrupt(void) //1ms定时器RJ0中断函数
void Display(void)//LED点阵屏刷新显存
void SEL_line(unsigned char line) //选LED点阵屏, 送“行”数据
void Write_595(unsigned char data)//同步移位, 送“列”数据

细列:


//定时器rj0初始化 1ms定时

void R_TMR_RJ0_Create(void)
{
    TRJ0EN = 1U;    /* enable input clock supply */
    TRJCR0 &= (uint8_t)~_01_TMRJ_COUNT_START;    /* disable TMRJ0 operation */
    TRJMK0 = 1U;    /* disable INTTRJ0 interrupt */
    TRJIF0 = 0U;    /* clear INTTRJ0 interrupt flag */
    /* Set INTTRJ0 high priority */
    TRJPR10 = 0U;
    TRJPR00 = 0U;
    TRJMR0 = _00_TMRJ_MODE_TIMER | _00_TMRJ_COUNT_SOURCE_FCLK;
    TRJIOC0 = _00_TMRJ_TRJIOC_INITIAL_VALUE;
    TRJ0 = _7CFF_TMRJ_TRJ0_VALUE;
}

//1ms定时器RJ0中断函数

__interrupt static void r_tmr_rj0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
    static unsigned char i=0;
    static unsigned int k=0;
    i++;
    if(i>20)//1ms*20=20ms  Refresh
    {
            i=0;
        Display();
    }

    k++;
    if(k>200)
    {
            k=0;
        sec=1;sec_200=1;
    }

    /* End user code. Do not edit comment generated here */
}


//刷新显存
void Display(void)
{
        unsigned char line=0,k=0;
         
        for(line=0;line<16;line++)//16 line
        {
                SEL_line(line);   //行选
               
                for(k=0;k<8;k++)//8 byte wigth
                {
                        Write_595(~display_buf[k+line*8]); //送显存数据
                }
                CLR_HC595_RCK;
                SET_HC595_RCK;//锁存输出
                CLR_HC595_RCK;

                CLR_HC595_OE; //显示有效
                delay(200);
                SET_HC595_OE;//显示关闭
        }
        CLR_HC154_EO;
}

//单片送8位列数据
void Write_595(unsigned char data)
{
        unsigned char i=0;

        for(i=0;i<8;i++)
        {         
                CLR_HC595_SCK;
               
                if((data&0x80)==0x80)
                {SET_HC595_SI;}
                else
                {CLR_HC595_SI;}        
                SET_HC595_SCK;
                 
                data<<=1;
        }     
}

回复评论 (7)

//显示5*7字符串
unsigned char xPosition:X轴坐标
unsigned char yPosition:Y轴坐标
unsigned char* string;字符串
unsigned char bigFont

void Put_String(unsigned char xPosition,
                   unsigned char yPosition,
                   unsigned char* string,
                   unsigned char bigFont)
{
    while(*string)
    {
        /* Send each character of the string. */
        Put_Char5x7(xPosition, yPosition, *string++, bigFont);
        xPosition += 6;
    }
}


//显示5*7字符
unsigned char xPosition:X轴坐标
unsigned char yPosition:Y轴坐标
unsigned char* string;字符


void Put_Char5x7(unsigned char xPosition,
                 unsigned char yPosition,
                 unsigned char character,
                 unsigned char bigFont)
{
        unsigned char row=0,columns=0;
        unsigned char temp;
        unsigned char Reverse_x;
        for(columns=0;columns<5;columns++)//(5)*8  读5列
        {
                temp=Font[character - 32][columns];//读字符点阵数据;索引字符内码偏移地址-0x20
         
                for(row=0;row<8;row++)//(8)*5    //8行
                {      
                        Reverse_x=(xPosition+columns);//?63
                        paste_dot(&display_buf[0],Reverse_x,yPosition*8+row,(temp>>row)&0x01);
                       
                }  
        }
}

//复制显存x,y某点
unsigned char copy_dot(unsigned char *P,unsigned char x,unsigned char y)
{

        unsigned char line=0,data=0,d1=0,d2=0;
               
        d1=7-x/8;        //reg address   7- ? :7~0  change 0~7
        d2=x%8;                //reg bit
       
        line=y*8;
        data=P[line+d1];
       
        if(data&(1<         {return 1;}
        else
        { return 0; }
}
//粘贴显存x,y某点
void paste_dot(unsigned char *P,unsigned char x,unsigned char y,unsigned char data)
{

        unsigned char line=0,d1=0,d2=0;
        unsigned char xx;
       
        xx=(x);
        d1=7-xx/8;        //reg address 7- ? :7~0  change 0~7
        d2=xx%8;        //reg bit
       
        line=y*8;
         
        if(data==1)
        {
                P[line+d1]|=1<         }
        else
        {
                P[line+d1]&=~(1<         }
}
点赞  2013-12-17 13:15
/*设置变量值
unsigned char xPosition:变量显示初始X坐标
unsigned char yPosition:变量显示初始Y坐标
long * number:指向变量指针
long  min:变量最小值
long  max:变量最大值
unsigned char Total_width,:变量10进制数总位数                  如变量=25000000   ,这里就是8位
unsigned char Decimals_width:变量10进制小数位数             小数位为0;
*/
void Set_value(        unsigned char xPosition,
                unsigned char yPosition,
                long * number,
                long  min,
                long  max,
                unsigned char Total_width,
                unsigned char Decimals_width)
{
         
         long temp_number;
         
         static signed char e_bit=0,f_bit;
         //int
            unsigned long mask     = 0;
            unsigned char chIndex  = 0;
         
        if(e_bit>(Total_width-1))  //移位标志位超位就 ,置0,最高位
        {e_bit=0;}
       
        //右移位键盘
        if(system.key_value==KEY_RIGHT)
        {
                Put_Char5x7(xPosition+e_bit*6,1,' ',0);//清除提示位标志“^”
               
                if(e_bit<(Total_width-1))//没过数据宽度(最低位)就右移
                {
                        e_bit++;       
                }
                 
        }
       
        //左移位键盘
        if(system.key_value==KEY_LEFT)
        {
                Put_Char5x7(xPosition+e_bit*6,1,' ',0);//清除提示位标志“^”
                if(e_bit>0)//没过到数据最高位就左移
                {
                        e_bit--;
                }
        }
       
       
        switch(Total_width-e_bit)//根据移位标志,确定编辑某位值
            {
                            case 1:temp_number=1;break;
                        case 2:temp_number=10;break;
                        case 3:temp_number=100;break;
                        case 4:temp_number=1000;break;
                        case 5:temp_number=10000;break;
                        case 6:temp_number=100000;break;
                        case 7:temp_number=1000000;break;
                        case 8:temp_number=10000000;break;
            }
       
        //数据加
        if(system.key_value==KEY_UP)
        {
               
                 (*number)+=temp_number;
                 if((*number)>max)//数据限制最大数
                 {(*number)=max;}
        }
       
        //数据减
        if(system.key_value==KEY_DOWN)
        {
                (*number)-=temp_number;
                 if((*number)                  {(*number)=min;}
        }
       
        if(sec==1)//编辑位下方,提示位标志“^” 闪显
        {
                sec=0;
                if(f_bit==0)
                {f_bit=1;Put_Char5x7(xPosition+e_bit*6,1,' ',0);}
                else
                {f_bit=0;Put_Char5x7(xPosition+e_bit*6,1,'^',0);}
                                 
        }

        switch(Total_width)
            {
                            case 1:mask=1;break;
                        case 2:mask=10;break;
                        case 3:mask=100;break;
                        case 4:mask=1000;break;
                        case 5:mask=10000;break;
                        case 6:mask=100000;break;
                        case 7:mask=1000000;break;
                        case 8:mask=10000000;break;
                        case 9:mask=100000000;break;
                        case 10:mask=1000000000;break;
            }
       
        //转换数据,分解每位,显示数据
        for(chIndex = 0; chIndex < Total_width; chIndex++)
            {
                Put_Char5x7(xPosition, yPosition, (((*number) / mask) % 10) + 0x30, 0);
                mask /= 10;
                xPosition += 6 ;
            }
}
点赞  2013-12-17 13:31
//显示浮点数:特别注意变量类型。
//变量乘除计算,类型的强制转换问题!


/*功能:显示+10.000
                     - 10.000   浮点数
xPosition:显示X轴坐标
yPosition:显示Y轴坐标
number:变量
chNumber:总数值宽度
resolution:小数值宽度
min:最小值
max:最大值
*/


double  Edit_Number(unsigned char xPosition,
                   unsigned char yPosition,
                   double number,
                   unsigned char chNumber,
                   unsigned char resolution,
                   long min,
                   long max,
                   unsigned char bigFont)
{
        //int
            unsigned long mask     = 0;
            unsigned char chIndex  = 0;
            //float
            signed long           display        = 1;
            unsigned long           multiplication = 1;
        unsigned char index;
       
        //Calculate
        static signed char e_bit=0,f_bit,shift_b=0;
        unsigned long temp_number;
        double temp_d;
       
        //zoom  in
        for(index = 0; index < resolution; index++)
        {
                multiplication *= 10;
        }
        //根据小数位数放大
            display = (long)(number* multiplication);        //Integer + decimal

         
        //*****************************************************************************
        //+ - cal
        //编辑位,右移位
        if(system.key_value==KEY_RIGHT)
        {
                Put_Char5x7(xPosition+6+shift_b*6,1,' ',0);
                if(e_bit<(chNumber-1))
                {
                        e_bit++;
                }
                 
        }
       //编辑位,左移位
        if(system.key_value==KEY_LEFT)
        {
                Put_Char5x7(xPosition+6+shift_b*6,1,' ',0);
                if(e_bit>0)
                {
                        e_bit--;
                }
        }
         
        if(e_bit>(chNumber-resolution-1))
        {
                                shift_b=e_bit+1;
        }
        else
        {shift_b=e_bit;}
          
         
        switch(chNumber-e_bit)//index)//e_bit
        {
                case 1:temp_number=1;break;
                case 2:temp_number=10;break;
                case 3:temp_number=100;break;
                case 4:temp_number=1000;break;
                case 5:temp_number=10000;break;
                case 6:temp_number=100000;break;
                case 7:temp_number=1000000;break;
                case 8:temp_number=10000000;break;
                case 9:temp_number=100000000;break;
        }
         
        //数值+
        if(system.key_value==KEY_UP)
        {
                 display+=temp_number;
                 if(display>max)
                 {display=max;}//编辑数,限制超限
                 
        }
        //数值-
        if(system.key_value==KEY_DOWN)
        {
                display-=temp_number;
                 if(display                  {display=min;}//编辑数,限制超限
        }
       
        //闪显,编辑位标志
        if(sec==1)
        {
                sec=0;  
                if(f_bit==0)
                {f_bit=1;Put_Char5x7(xPosition+6+(shift_b)*6,1,' ',0);}
                else
                {f_bit=0;Put_Char5x7(xPosition+6+(shift_b)*6,1,'^',0);}
                                 
        }
       
        temp_d=( (double)display /  (double)multiplication);        //Integer + decimal
       
        //显示正,负符号
            if(display < 0)//Negate
            {
                Put_Char5x7(xPosition, yPosition, '-', bigFont);
                xPosition += 6;
                display *= -1;
            }
            else
            {
                Put_Char5x7(xPosition, yPosition, ' ', bigFont);
                xPosition += 6 ;
            }
       
         
         
         
        //*number=temp_d;
        //****************************************************************************
        switch(chNumber)
            {
                            case 1:mask=1;break;
                        case 2:mask=10;break;
                        case 3:mask=100;break;
                        case 4:mask=1000;break;
                        case 5:mask=10000;break;
                        case 6:mask=100000;break;
                        case 7:mask=1000000;break;
                        case 8:mask=10000000;break;
                        case 9:mask=100000000;break;
                        case 10:mask=1000000000;break;
            }
         
        //数据拆分,显示
            for(chIndex = 0; chIndex < chNumber; chIndex++)
            {
                 if(chIndex==(chNumber-resolution))
                {
                        Put_Char5x7(xPosition, yPosition, '.', bigFont);
                        xPosition += 6 ;
                }   
                        Put_Char5x7(xPosition, yPosition, ((display / mask) % 10) + 0x30, bigFont);
                        mask /= 10;
                        xPosition += 6 ;
                 
            }
         return temp_d;
}
点赞  2013-12-17 14:23
//读5方向操作杆按键
unsigned char Read_key(void)
{
        static unsigned char old_key=0,new_key=0;
        unsigned char temp_key=0;
       
       
        old_key=new_key;
        new_key=P7&0x1F;
       
        if(new_key!=old_key)
        {
                if(new_key                 {temp_key=new_key^old_key; }
        }
        else
        {temp_key=0;}
        return temp_key;
}
点赞  2013-12-17 15:22
这可以用来借鉴一下!
点赞  2013-12-18 08:40

回复 6楼huoshen_daren 的帖子

如果增加 旋转增量编码器 会更方便!
点赞  2013-12-18 08:43
//5*7点阵字符 取模数据
const unsigned char Font[95][5] =
{
    {0x00, 0x00, 0x00, 0x00, 0x00}, // sp
    {0x00, 0x00, 0x2f, 0x00, 0x00}, // !
    {0x00, 0x07, 0x00, 0x07, 0x00}, // "
    {0x14, 0x7f, 0x14, 0x7f, 0x14}, // #
    {0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $
    {0xc4, 0xc8, 0x10, 0x26, 0x46}, // %
    {0x36, 0x49, 0x55, 0x22, 0x50}, // &
    {0x00, 0x05, 0x03, 0x00, 0x00}, // '
    {0x00, 0x1c, 0x22, 0x41, 0x00}, // (
    {0x00, 0x41, 0x22, 0x1c, 0x00}, // )
    {0x14, 0x08, 0x3E, 0x08, 0x14}, // *
    {0x08, 0x08, 0x3E, 0x08, 0x08}, // +
    {0x00, 0x00, 0x50, 0x30, 0x00}, // ,
    {0x10, 0x10, 0x10, 0x10, 0x10}, // -
    {0x00, 0x60, 0x60, 0x00, 0x00}, // .
    {0x20, 0x10, 0x08, 0x04, 0x02}, // /
    {0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0
    {0x00, 0x42, 0x7F, 0x40, 0x00}, // 1
    {0x42, 0x61, 0x51, 0x49, 0x46}, // 2
    {0x21, 0x41, 0x45, 0x4B, 0x31}, // 3
    {0x18, 0x14, 0x12, 0x7F, 0x10}, // 4
    {0x27, 0x45, 0x45, 0x45, 0x39}, // 5
    {0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6
    {0x01, 0x71, 0x09, 0x05, 0x03}, // 7
    {0x36, 0x49, 0x49, 0x49, 0x36}, // 8
    {0x06, 0x49, 0x49, 0x29, 0x1E}, // 9
    {0x00, 0x36, 0x36, 0x00, 0x00}, // :
    {0x00, 0x56, 0x36, 0x00, 0x00}, // ;
    {0x08, 0x14, 0x22, 0x41, 0x00}, // <
    {0x14, 0x14, 0x14, 0x14, 0x14}, // =
    {0x00, 0x41, 0x22, 0x14, 0x08}, // >
    {0x02, 0x01, 0x51, 0x09, 0x06}, // ?
    {0x32, 0x49, 0x59, 0x51, 0x3E}, // @
    {0x7E, 0x11, 0x11, 0x11, 0x7E}, // A
    {0x7F, 0x49, 0x49, 0x49, 0x36}, // B
    {0x3E, 0x41, 0x41, 0x41, 0x22}, // C
    {0x7F, 0x41, 0x41, 0x22, 0x1C}, // D
    {0x7F, 0x49, 0x49, 0x49, 0x41}, // E
    {0x7F, 0x09, 0x09, 0x09, 0x01}, // F
    {0x3E, 0x41, 0x49, 0x49, 0x7A}, // G
    {0x7F, 0x08, 0x08, 0x08, 0x7F}, // H
    {0x00, 0x41, 0x7F, 0x41, 0x00}, // I
    {0x20, 0x40, 0x41, 0x3F, 0x01}, // J
    {0x7F, 0x08, 0x14, 0x22, 0x41}, // K
    {0x7F, 0x40, 0x40, 0x40, 0x40}, // L
    {0x7F, 0x02, 0x0C, 0x02, 0x7F}, // M
    {0x7F, 0x04, 0x08, 0x10, 0x7F}, // N
    {0x3E, 0x41, 0x41, 0x41, 0x3E}, // O
    {0x7F, 0x09, 0x09, 0x09, 0x06}, // P
    {0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q
    {0x7F, 0x09, 0x19, 0x29, 0x46}, // R
    {0x46, 0x49, 0x49, 0x49, 0x31}, // S
    {0x01, 0x01, 0x7F, 0x01, 0x01}, // T
    {0x3F, 0x40, 0x40, 0x40, 0x3F}, // U
    {0x1F, 0x20, 0x40, 0x20, 0x1F}, // V
    {0x3F, 0x40, 0x38, 0x40, 0x3F}, // W
    {0x63, 0x14, 0x08, 0x14, 0x63}, // X
    {0x07, 0x08, 0x70, 0x08, 0x07}, // Y
    {0x61, 0x51, 0x49, 0x45, 0x43}, // Z
    {0x00, 0x7F, 0x41, 0x41, 0x00}, // [
    {0x55, 0x2A, 0x55, 0x2A, 0x55}, // /
    {0x00, 0x41, 0x41, 0x7F, 0x00}, // ]
    {0x04, 0x02, 0x01, 0x02, 0x04}, // ^
    {0x40, 0x40, 0x40, 0x40, 0x40}, // _
    {0x00, 0x01, 0x02, 0x04, 0x00}, // '
    {0x20, 0x54, 0x54, 0x54, 0x78}, // a
    {0x7F, 0x48, 0x44, 0x44, 0x38}, // b
    {0x38, 0x44, 0x44, 0x44, 0x20}, // c
    {0x38, 0x44, 0x44, 0x48, 0x7F}, // d
    {0x38, 0x54, 0x54, 0x54, 0x18}, // e
    {0x08, 0x7E, 0x09, 0x01, 0x02}, // f
    {0x0C, 0x52, 0x52, 0x52, 0x3E}, // g
    {0x7F, 0x08, 0x04, 0x04, 0x78}, // h
    {0x00, 0x44, 0x7D, 0x40, 0x00}, // i
    {0x20, 0x40, 0x44, 0x3D, 0x00}, // j
    {0x7F, 0x10, 0x28, 0x44, 0x00}, // k
    {0x00, 0x41, 0x7F, 0x40, 0x00}, // l
    {0x7C, 0x04, 0x18, 0x04, 0x78}, // m
    {0x7C, 0x08, 0x04, 0x04, 0x78}, // n
    {0x38, 0x44, 0x44, 0x44, 0x38}, // o
    {0x7C, 0x14, 0x14, 0x14, 0x08}, // p
    {0x08, 0x14, 0x14, 0x18, 0x7C}, // q
    {0x7C, 0x08, 0x04, 0x04, 0x08}, // r
    {0x48, 0x54, 0x54, 0x54, 0x20}, // s
    {0x04, 0x3F, 0x44, 0x40, 0x20}, // t
    {0x3C, 0x40, 0x40, 0x20, 0x7C}, // u
    {0x1C, 0x20, 0x40, 0x20, 0x1C}, // v
    {0x3C, 0x40, 0x30, 0x40, 0x3C}, // w
    {0x44, 0x28, 0x10, 0x28, 0x44}, // x
    {0x0C, 0x50, 0x50, 0x50, 0x3C}, // y
    {0x44, 0x64, 0x54, 0x4C, 0x44}, // z
    {0x08, 0x3e, 0x41, 0x41, 0x00}, // {
    {0x00, 0x00, 0x77, 0x00, 0x00}, // |
    {0x00, 0x41, 0x41, 0x3e, 0x08}, // }
    {0x02, 0x01, 0x02, 0x01, 0x00}  // ~
};
点赞  2013-12-20 09:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复