编程实战之:段码屏的程序设计

条件:中颖SH88F4051芯片 + HT1621 + 自己开模段码LCD屏
段码屏的驱动程序跟数码管的静态驱动程序一样,只要我们弄懂了怎样显示一个基本单位,根据此基本单位编写一个字库表,然后用与(&)和或(|)这两种位运算符就可以随心所欲编写我们要显示的数字或者形状。驱动方案为:单片机用3个IO口跟HT1621进行通讯,用 HT1621驱动段码屏。
HT1621有4个COM,分别是com3,com2,com1,com0。有32个SEG,分别是SEG0,SEG1….SEG31。
什么是COM,什么是SEG?我的思路解释是: COM就是横向上的X坐标,SEG就是纵向上的Y坐标。X坐标与Y坐标组合成一张表格,每格代表一个显示点。比如HT1621,有4个COM,32个SEG,组成一个32行,每行装4个点的表格,一共有128个点,也就是最多可以显示128个点,用数码管的思路,最多可以显示128个LED灯。128个点已经可以满足大多数的段码屏了。
一、 硬件连接


编程实战之:段码屏的程序设计_第1张图片

二、 看规格书,查段码缓存数据表


编程实战之:段码屏的程序设计_第2张图片

三、 程序设计

1、 初始化

/********************************************************
系统初始化
********************************************************/
void system_ini()
{
    RSTSTAT = 0;                                    //清看门狗
    IO_ini();                                       // I/O口初始化
    ht1621_Init();                                  // 1621初始化
}   
/************************************************************
I/O口初始化
************************************************************/
void  IO_ini()
{
    CLKCON &= 0x8f;     //系统时钟分频为1:1    
    P1M0 = 0x00;        //普通I/O口
    P1M1 = 0x00;        //普通I/O口
    P1 = 0x80;          //P1.7为模拟串口输入RX,接收脚。
    P3M0 = 0x00;
    P3M1 = 0x0fc;       //除了P3.0之外都设为推挽输出
    P3 = 0x01;          //P3.0设为输入,因为P3.0是RX脚
    P4M0 = 0x00;
    P4M1 = 0x00;
    P4 = 0xFF;
}
/******************************************************** 
h1621初始化
********************************************************/ 
#define ht1621_cs_high()    (P3_5 = 1)
#define ht1621_cs_low()     (P3_5 = 0)
#define ht1621_dat_high()   (P3_4 = 1)
#define ht1621_dat_low()    (P3_4 = 0)
#define ht1621_wr_high()    (P3_7 = 1)
#define ht1621_wr_low()     (P3_7 = 0)
void  ht1621_Init( void ) 
{ 
    ht1621_cs_high();
    ht1621_wr_high(); 
    ht1621_dat_high(); 
    delayms(200);                                    
    ht1621wr_cmd(BIAS); 
    ht1621wr_cmd(RC256);                         
    ht1621wr_cmd(SYSDIS); 
    ht1621wr_cmd(SYSEN); 
    ht1621wr_cmd(LCDON);    
}  

注:ht1621wr_data和ht1621wr_cmd 这两个函数就不写了,相信网上会有很多。
2、 显示段跟显示缓存的对应关系
说明:根据上面的段码缓存数据表制作一个buf[N]的缓存。

unsigned char idata  buf[16] = {0}; 
#define S1a_ON()        buf[0] |= 1<<3   
#define S1a_OFF()   buf[0] &= ~(1<<3)
#define S1b_ON()        buf[0] |= 1<<2
#define S1b_OFF()   buf[0] &= ~(1<<2)
#define S1c_ON()        buf[0] |= 1<<1
#define S1c_OFF()   buf[0] &= ~(1<<1)
#define S1d_ON()        buf[0] |= 1<<0
#define S1d_OFF()   buf[0] &= ~(1<<0)
#define S1e_ON()        buf[0] |= 1<<4
#define S1e_OFF()   buf[0] &= ~(1<<4)
#define S1f_ON()        buf[0] |= 1<<6
#define S1f_OFF()   buf[0] &= ~(1<<6)
#define S1g_ON()        buf[0] |= 1<<5
#define S1g_OFF()   buf[0] &= ~(1<<5)
。。。

3、数码管段码缓存

#define Sa  3  
#define Sb  2  
#define Sc  1  
#define Sd  0  
#define Se  4
#define Sf  5
#define Sg  6
const unsigned char segment [] = {
    (1<1<1<1<1<1<//0
    (1<1<//1
    (1<1<1<1<1<//2
    (1<1<1<1<1<//3
    (1<1<1<1<//4
    (1<1<1<1<1<//5
    (1<1<1<1<1<1<//6
    (1<1<1<//7
    (1<1<1<1<1<1<1<//8
    (1<1<1<1<1<1<//9
    (1<1<1<1<1<1<//a
    (1<1<1<1<1<//b
    (1<1<1<1<//c
    (1<1<1<1<1<//d
    (1<1<1<1<1<//e
    (1<1<1<1<//f 
    0,                                                      //0x10 
    (1<1<1<1<1<//0x11 
    (1<1<1<1<//0x12 
    0,                                                      //0x13  
    0,                                                      //0x14 
    0,                                                      //0x15 
    0,                                                      //0x16 
    0,                                                      //0x17 
    0,                                                      //0x18 
    0,                                                      //0x19 
    0,                                                      //0x1a 
    0,                                                      //0x1b 
    0,                                                      //0x1c 
    0,                                                      //0x1d 
    0,                                                      //0x1e 
    0,                                                      //0x1f 
    0,                                                      //0x20 
    0,                                                      //0x21 
};

4、在指定位置显示一个字符

void DispChar (unsigned char BCD,unsigned char x)  
{
    unsigned char seg;
    seg = segment[BCD]; 
    switch(x)
    {       
        case 0:
            break;      
        case 1:                                     
            if(seg & (1<else
            {
                S1a_OFF();
            }       
            if(seg & (1<else
            {
                S1b_OFF();
            }   
            if(seg & (1<else
            {
                S1c_OFF();
            }
            if(seg & (1<else
            {
                S1d_OFF();
            }
            if(seg & (1<else
            {
                S1e_OFF();
            }       
            if(seg & (1<else
            {
                S1f_OFF();
            }
            break;
    。。。
    default:
        break;
    }
}

5、显示固定的字符
例如固定显示“W”,共4个段码。

void display_w()
{
    T0_ON();S16_ON();
    K6_ON();S15_ON();
}

6、显示刷新

void main()
{   
    system_ini();  
    while(1)
{
    display_w();
        。。。
    RefreshDisp( buf );         //  显示刷新
}
}
/********************************************************
刷新全部液晶的显示
/********************************************************/
void  RefreshDisp(unsigned char *p)
{   
    unsigned char i;
    ht1621_cs_low();
    ht1621wr_data(0xa0,3);                      //写入命令标志101,写数据方式
    ht1621wr_data(0,6);                             //发写数据地址,
    for ( i = 0; i < 16;i++)
    {
        ht1621wr_data(*p++,8);                  
    }
    ht1621_cs_high();
}

你可能感兴趣的:(嵌入式DSP-ARM)