⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch452.lst

📁 PIC单片机控制CH452的数码管显示程序
💻 LST
字号:
     1: /********************************************************************************************

     2: CH452驱动程序

     3: 与单片机接口方式:4线

     4: ********************************************************************************************/

     5: #include <pic.h>

     6: 

     7: typedef unsigned int uint;

     8: typedef unsigned char uchar;

     9: unsigned int Led_seg[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,

    10: 0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x02,0x01}; //*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,.的字符码*/ 

    11: unsigned int Bitmap[]={0xc00,0xd00,0xe00,0xf00,0x800,0x900,0xa00,0xb00}; //显示用位码列表

    12: //管脚定义

    13: #define  CH452_DCLK  RD0                     // 串行数据时钟上升沿激活

    14: #define  CH452_DIN   RD1                                // 串行数据输出,接CH452的数据输入

    15: #define  CH452_LOAD  RD2                     // 串行命令加载,上升沿激活

    16: #define  CH452_DOUT  RB0                     // INT0,键盘中断和键值数据输入,接CH452的数据输出          

    17: // 4线接口的位操作,与单片机有关 

    18: #define CH452_DCLK_SET          (CH452_DCLK=1)

    19: #define CH452_DCLK_CLR          (CH452_DCLK=0)

    20: #define CH452_DIN_SET           (CH452_DIN=1)

    21: #define CH452_DIN_CLR           (CH452_DIN=0)

    22: #define CH452_LOAD_SET          (CH452_LOAD=1)

    23: #define CH452_LOAD_CLR          (CH452_LOAD=0)

    24: // 与单片机有关,与中断连接方式有关 

    25: #define DISABLE_INTERRUPT       (INTE=0)

    26: #define ENABLE_INTERRUPT        (INTE=1)

    27: #define CLEAR_INTER_FLAG        (INTF=0)

    28: 

    29: //命令码

    30: #define CH452_NOP               0x0000                          // 空操作

    31: #define CH452_RESET     0x0201                          // 复位

    32: #define CH452_LEVEL             0x0100                          // 加载光柱值

    33: #define CH452_CLR_BIT   0x0180                          // 段位清0

    34: #define CH452_SET_BIT   0x01C0                          // 段位置1

    35: #define CH452_SLEEP             0x0202                          // 进入睡眠状态

    36: #define CH452_LEFTMOV   0x0300                //设置移动方式-左移

    37: #define CH452_LEFTCYC   0x0301                //设置移动方式-左循

    38: #define CH452_RIGHTMOV  0x0302                //设置移动方式-右移

    39: #define CH452_RIGHTCYC  0x0303                //设置移动方式-右循       

    40: #define CH452_SELF_BCD  0x0380                          //自定义BCD码

    41: #define CH452_SYSOFF    0x0400                          //关显示、键盘(设置系统参数)

    42: #define CH452_SYSON1    0x0401                          //开显示                (设置系统参数)

    43: #define CH452_SYSON2    0x0403                          //开显示、键盘 (设置系统参数)

    44: #define CH452_SYSON2W   0x0423                          //开显示、键盘, 真正2线接口 (设置系统参数)

    45: #define CH452_DSP       0x0500                          //设置默认显示方式 (设置显示参数)

    46: #define CH452_BCD       0x0580                          //设置BCD译码方式

    47: #define CH452_TWINKLE   0x0600                //设置闪烁控制

    48: #define CH452_GET_KEY   0x0700                          // 获取按键

    49: 

    50: 

    51: void InitCh452();

    52: void WrietCh452(uint da);

    53: void DelayUs();

    54: void Bit_Display_Num(uint bite,uint buf);

    55: void Display_Reset();

    56: void Flash_SingleBit(uint bitnumber);

    57: uint ReadCh452();

    58: void Flash_AllBit();

    59: void display(uint keyda);

    60: void  IntKey();

    61: //系统初始化函数*/

    62: void initial()

    63: {

    64:         INTCON=0x00;

    65:         ADCON1=0x07;

    66:         PIE1=0;

    67:         PIE2=0;

    68:         }

    69: 

    70: /********************************************************************************************

    71: 初始化

    72: ********************************************************************************************/

    73: void InitCh452()

    74: {

    75:         WrietCh452(CH452_SYSON2);       //打开显示

    76:         WrietCh452(CH452_DSP);          //设置默认方式

    77:     ENABLE_INTERRUPT;

    78:          //Display_Reset();

    79: }

    80: 

    81: /********************************************************************************************

    82: 向CH452发送指令和数据

    83: da;指令和数据

    84: ********************************************************************************************/

    85: void WrietCh452(uint da)

    86: {

    87:         uint iq0;

    88:     DISABLE_INTERRUPT;       //关闭键盘中断

    89:         CH452_LOAD_CLR;                 //复位LOAD信号

    90:         for(iq0=0;iq0<12;iq0++)

    91:         {

    92:                 if((da&0x0001)==1)

    93:                         CH452_DIN_SET;

    94:                 else

    95:                         CH452_DIN_CLR;

    96:                 CH452_DCLK_CLR;

    97:                 da >>=1;

    98:                 CH452_DCLK_SET;         //CH452上升沿读取数据

    99:         }

   100:         CH452_LOAD_SET;      //加载数据,LOAD上升沿

   101:         DelayUs();

   102:    ENABLE_INTERRUPT;                    //打开键盘中断

   103: }

   104: /*--------------------------------------------------------------------------------------------

   105:                                     单个位上显示数据

   106: ---------------------------------------------------------------------------------------------*/

   107: void Bit_Display_Num(uint bite,uint buf)

   108: {

   109:         WrietCh452(Bitmap[bite]+Led_seg[buf]);

   110: }

   111: /****************************************************************

   112: 显示复位

   113: ****************************************************************/

   114: void Display_Reset()

   115: {

   116: 

   117:    WrietCh452(0x201);

   118: }

   119: /*--------------------------------------------------------------------------------------------

   120:                                     单个位的闪烁操作

   121: ---------------------------------------------------------------------------------------------*/

   122: void Flash_SingleBit(uint bitnumber)

   123: {

   124:         WrietCh452(CH452_TWINKLE+(0x01<<bitnumber));

   125: }

   126: /*--------------------------------------------------------------------------------------------

   127:                                     全闪操作

   128: ---------------------------------------------------------------------------------------------*/

   129: void Flash_AllBit()

   130: {

   131:         WrietCh452(CH452_TWINKLE+0xff);

   132: }

   133: /***************************************************************************************

   134: 从CH452读取按键值

   135: 返回:读取的按键值

   136: ***************************************************************************************/

   137: uint ReadCh452()

   138: {

   139:         uchar q0;

   140:         uint cmd,keycode;       //定义命令字,和数据存储器

   141:         DISABLE_INTERRUPT;      //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输    

   142:         cmd=0x07;                          //输入读451命令字

   143:         CH452_LOAD_CLR;

   144:         for(q0=0;q0<4;q0++)

   145:         {

   146:                 if ((cmd&0x1)==1) 

   147:                         CH452_DIN_SET;

   148:                 else 

   149:                         CH452_DIN_CLR;  //输出位数据

   150:         CH452_DCLK_CLR;                  

   151:         cmd>>=1;                            //向右移一位

   152:         CH452_DCLK_SET;  //产生时钟上升沿锁通知CH451输入位数据

   153:         }

   154:         CH452_LOAD_SET;          //产生加载上升沿通知CH451处理命令数据

   155:         keycode=0;                                //清除按键码

   156:         for(q0=0;q0<7;q0++)

   157:         {

   158:                 keycode<<=1;                    //数据移入keycode,高位在前,低位在后

   159:         keycode|=CH452_DOUT; //从高到低读入451的数据

   160:         CH452_DCLK_CLR;         //产生时钟下降沿通知CH451输出下一位

   161:         CH452_DCLK_SET;

   162:         }

   163:         CLEAR_INTER_FLAG;                       //清中断标志

   164:         ENABLE_INTERRUPT;

   165:         return(keycode);                        //返回键值

   166: }

   167: void display(uint keyda)

   168: {

   169:   Bit_Display_Num(0,keyda);

   170: }

   171: /***************************************************************************************

   172: 按键中断函数

   173: ***************************************************************************************/

   174: void interrupt IntKey()

   175: {

   176:         uint key;

   177:         key=ReadCh452();

   178:    

   179:    display(key);

   180: }

   181: /***************************************************************************************

   182: 延时

   183: ***************************************************************************************/

   184: void DelayUs()

   185: {

   186: asm("nop");

   187: asm("nop");

   188: asm("nop");

   189: 

   190: }

   191: 

   192: void main()

   193: { 

   194:    uint i;

   195:     TRISD=0x00;

   196:   CLEAR_INTER_FLAG;

   197:    initial(); 

   198:         InitCh452();

   199:     GIE=1;

   200:  for(i=0;i<8;i++)       

   201: {

   202:       Bit_Display_Num(i,i);

   203:    }

   204:         

   205: }

   206: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -