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

📄 ch451sa.c

📁 CH451键盘和数码管结合程序
💻 C
字号:
#include <reg52.h>  
#define uchar unsigned char    
#define uint  unsigned int                                        
#define CH451_RESET 0x0201 //复位,根据硬件电路来设定主程序参数
#define CH451_LEFTMOV 0x0300 //设置移动方式_左移 
#define CH451_LEFTCYC 0x0301 //设置移动方式-左循 
#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移 
#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循 
#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗 
#define CH451_SYSON1 0x0401 //开显示 
#define CH451_SYSON2 0x0403 //开显示、键盘 
#define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能 
#define CH451_DSP 0x0500 //设置默认显示方式 
#define CH451_BCD 0x0580 //设置BCD译码方式 
#define CH451_TWINKLE 0x0600 //设置闪烁控制 
#define CH451_DIG0 0x0800 //数码管位0显示 
#define CH451_DIG1 0x0900 //数码管位1显示 
#define CH451_DIG2 0x0a00 //数码管位2显示 
#define CH451_DIG3 0x0b00 //数码管位3显示 
#define CH451_DIG4 0x0c00 //数码管位4显示 
#define CH451_DIG5 0x0d00 //数码管位5显示 
#define CH451_DIG6 0x0e00 //数码管位6显示 
#define CH451_DIG7 0x0f00 //数码管位7显示                      //串行命令加载,上升延激活    
 sbit   ch451_dclk=P1^6;                         //串行数据时钟上升延激活    
sbit   ch451_din=P1^5;                      // 串行数据输出,接CH451的数据输入    
sbit    ch451_load0=P2^4;                    //数码管显示芯片片选
sbit    ch451_load1=P2^5;   				   //键盘和LED控制芯片片选
uchar  ch451_key; 
sbit   ch451_dout=P3^3;					  //键盘中断输出
sbit   sy=P1^7;							 //蜂鸣器控制,高时输出声音
uchar   flag;							 //中断标志
typedef unsigned char byte;				 //按键定义
//CH451初始化
void ch451_init()
{
 ch451_din=0;
 ch451_din=1;
 ch451_load0=1;
 ch451_load1=1;
  IT1=0;                   //设置下降沿触发
  IE1=0;                   //清中断标志
  PX1=0;                   //设置低优先级
  EX1=1;                   //开中断
   EA=1;					//开启CPU中断
   sy=0;					 //初始化
}
void ch451_write(unsigned int command)
{
    uchar i;
    EX1=0;                          //禁止键盘中断
  ch451_load0=0;                                  //命令开始           
  for(i=0;i<12;i++){                             //送入12位数据,低位在前    
    ch451_din=command&1;                   
    ch451_dclk=0;   
    command>>=1;   
    ch451_dclk=1;                               //上升沿有效    
  }   
  ch451_load0=1; 
   EX1=1;
  }

 
//输入命令子程序,MCU从451读一字节
 unsigned char ch451_read()
{
  unsigned char i;
  unsigned char command,keycode; //定义命令字,和数据存储器
  EX1=0;                         //关中段 
  command=0x07;                  //输入读451命令字 
  ch451_load1=0;
  for(i=0;i<4;i++){
 							  
    ch451_din=command&1;         //送入最低位
    ch451_dclk=0;  
    command>>=1;                //往右移一位
    ch451_dclk=1;              //产生时钟上升沿锁通知CH451输入位数据
 }
  ch451_load1=1;              //产生加载上升沿通知CH451处理命令数据
  keycode=0;                 //清除keycode
  for(i=0;i<7;i++){
    keycode<<=1;            //数据移入keycode,高位在前,低位在后
    keycode|=ch451_dout;       //从高到低读入451的数据
    ch451_dclk=0;          //产生时钟下升沿通知CH451输出下一位
    ch451_dclk=1;
 }
  IE1=0;                  //清中断标志	
  EX1=1;				 //开中断
  return(keycode);      //反回键值
}
//键盘扫描和LED显示驱动芯片另外一片CH451的数据写入
void ch451_write1(unsigned int command)
{
    uchar i;
    EX1=0;                          //禁止键盘中断
  ch451_load1=0;                                  //命令开始           
  for(i=0;i<12;i++){                             //送入12位数据,低位在前    
    ch451_din=command&1;                   
    ch451_dclk=0;   
    command>>=1;   
    ch451_dclk=1;                               //上升沿有效    
  }   
  ch451_load1=1; 
   EX1=1;
  }
//*************************************************
//中断子程序  使用中断2,寄存器组1

void ch451_inter() interrupt 2 using 1
{
 flag=1;	  //按键输入置位
  IE1=0;     //清中断标志
}
void keysmiao(byte k)
{
   switch(k)
	{     
	      case 0x68:ch451_write(CH451_DIG3|0xed) 	 ;break; //0
		  case 0x6c:ch451_write(CH451_DIG3|0x84)     ;break; //1
		  case 0x6b:ch451_write(CH451_DIG3|0xd9)     ;break; //2
		  case 0x6a:ch451_write(CH451_DIG3|0xdc) 	 ;break;//3
		  case 0x74:ch451_write(CH451_DIG3|0x7d) 	 ;break; //6
		  case 0x73:ch451_write(CH451_DIG3|0xc4) 	 ;break; //7
		  case 0x72:ch451_write(CH451_DIG3|0xfd)	 ;break; //8
		  case 0x7c:ch451_write(CH451_DIG7|0xed)     ;break;//0
		  case 0x7b:ch451_write(CH451_DIG6|0x84)     ;break;//1
		  case 0x7a:ch451_write(CH451_DIG5|0xd9)      ;break;//2
		  case 0x69:ch451_write(CH451_DIG3|0xb4) 	 ;break;  //4
		  case 0x70:ch451_write(CH451_DIG3|0x7c) 	 ;break; //5
		  case 0x71:ch451_write(CH451_DIG3|0xfc) 	 ;break; //9
		  case 0x78:ch451_write(CH451_DIG3|0xf5) 	 ;break; //a
		  case 0x79:ch451_write(CH451_DIG4| 0xdc)     ;break;
		  case 0x61:ch451_write(CH451_DIG3|0x3d) 	 ;break;  //b
		  case 0x64:ch451_write(CH451_DIG3|0x19)     ;break;	   //c
		  case 0x60:ch451_write(CH451_DIG3|0x9d)      ;break;		  //d
		  default:  break;
	}


}
   void main(void)
{
 uchar r1;
 byte k;
 ch451_init();
 ch451_write(CH451_RESET);
 ch451_write(CH451_SYSON1);
 ch451_write(CH451_DSP);
 ch451_write1(CH451_RESET);
 ch451_write1(CH451_SYSON2);
 ch451_write1(CH451_DSP);
 while(1) 
 {  if(flag==1)                      //有键按下?    
   { flag=0;
	 k=ch451_read(); 	  
   do{r1=ch451_read();}while(r1&0x40);
	keysmiao(k);
     
	 }
   
     
 else
   { 
 	 ch451_write(CH451_DIG0|0xfd);
 
 
   }
  }
 }                             //加载数据    

⌨️ 快捷键说明

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