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

📄 demo451.c

📁 是IC,CH451的处理程序,连接有LED灯.可用.
💻 C
字号:
//CH451/ch452
//AT89C51 C语言程序
//Web: http//minrel.com
//Author: pdy  2007.3
/*
1	4	7	*
40h 41h	42h	43h
2	5	8	0
48h 49h 4ah 4bh
3	6	9	#
50h 51h 52h 53h
*/
//功能  开机后在最低位置1,其余清零;按下键后,左移两位,在低两位显示
//十进制键值,如果按住键不放,最低位小数点点亮,释放后小数点熄灭。 
//功能 按键显示,输入操作码.
#include <my51.h>
#define uchar unsigned char
#define uint  unsigned int
//如果使用键盘中断请定义
#define  USE_KEY  0
//根据硬件电路来设定主程序参数
sbit   ch451_dclk=P1^1;                          //串行数据时钟上升延激活
sbit   ch451_din=P1^0;		                // 串行数据输出,接CH451的数据输入
sbit   ch451_load=P1^5;                        //串行命令加载,上升延激活
sbit   ch451_dout=P3^3;                        //INT1,键盘中断和键值数据输入,接CH451的数据输出
sbit   speak=P1^4;                        //串行命令加载,上升延激活
uchar  ch451_key;		                // 存放键盘中断中读取的键值

bit	start;

extern void serial_data_to_main(unsigned char xdata *pcmd, unsigned char nlen);
extern unsigned char serial_data_from_main(unsigned char xdata *pcmd);
extern void timer0_init();
extern void serial_init();
//=============================================================================================
//键盘输入码存放于
unsigned char xdata store[5];
//=============================================================================================
#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显示

//===================================================
//功能:延时1秒
//输入:时间长度
void delay_s ( uint time )
{
	int idata i,j,k;

	if ( time == 0x00 )
		return;
	
	for ( i = 0; i < time; i ++ )
		for (j = 0; j < 100; j ++ )
			for ( k = 0; k < 100; k ++ );	
}
//=========================================
//********************************************

//初始化子程序

void ch451_init()
{
  ch451_din=0;                                     //先低后高,选择4线输入
  ch451_din=1;  
#ifdef USE_KEY
  IT1=0;			                  //设置下降沿触发
  IE1=0;			                  //清中断标志
  PX1=0;			                  //设置低优先级
  EX1=1;			                  //开中断
#endif

}
//*****************************************************
//输出命令子程序
//定义一无符号整型变量存储12字节的命令字。
 void ch451_write(unsigned int command)
{
  unsigned char i;
#ifdef USE_KEY
  EX1=0;			                 //禁止键盘中断
#endif	
  ch451_load=0;                                  //命令开始       
  for(i=0;i<12;i++){                             //送入12位数据,低位在前
    ch451_din=command&1;				
    ch451_dclk=0;
    command>>=1;
    ch451_dclk=1;                               //上升沿有效
  }
  ch451_load=1;                                 //加载数据
#ifdef USE_KEY
  EX1=1;
#endif
}

#ifdef USE_KEY

//*************************************************
//输入命令子程序,MCU从451读一字节
 unsigned char ch451_read()
{
  unsigned char i;
  unsigned char command,keycode;		//定义命令字,和数据存储器
  EX1=0;			               		//关中断
  command=0x07;			               //输入读451命令字	
  ch451_load=0;
  for(i=0;i<4;i++){
 
    ch451_din=command&1;		      //送入最低位
    ch451_dclk=0;			 
    command>>=1;			      //右移一位,低位在前
    ch451_dclk=1;			      //产生时钟上升沿锁通知CH451输入位数据
 }
  ch451_load=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);			     //反回键值
}
//*************************************************
//中断子程序  使用中断2,寄存器组1

void ch451_inter() interrupt 2 using 1
{
  unsigned char i;			      //定义循环变量
  unsigned char command,keycode;	      //定义控制字寄存器,和中间变量定时器
  command=0x07;				      //读取键值命令的高4位0111B
  ch451_load=0;				      //命令开始
  for(i=0;i<4;i++){
    ch451_din=command&1;		     //低位在前,高位在后
    ch451_dclk=0;
    command>>=1;			     //右移一位
    ch451_dclk=1;			     //产生时钟上升沿锁通知CH451输入位数据
 }
  ch451_load=1;				     //产生加载上升沿通知CH451处理命令数据
  keycode=0;				     //清除keycode
  for(i=0;i<7;i++){
    keycode<<=1;			     //数据作移一位,高位在前,低位在后
    keycode|=ch451_dout;		     //从高到低读入451的数据
    ch451_dclk=0;			     //产生时钟下升沿通知CH451输出下一位
    ch451_dclk=1;
 }
  ch451_key=keycode;			    //保存上次的键值
  IE1=0;				    //清中断标志
}

//***********************************************

#endif 
//==========================================================================================
/*********************************************/
//延时n毫秒
/*********************************************/
/*
void delay_ms(uchar n)
{
	uchar i, j;
	for (i = 0; i < n; i++)
		for (j = 0; j < 229; j++);
}*/
//*************************************************
 //延时程序
 void delay(){					//在12P下延时十毫秒
   uchar i,j,k;
   for(i=0;i<10;i++)
     for(j=0;j<40;j++)
       for(k=0;k<120;k++);
  }
//*****************************************************
uchar show_key(){
	uchar temp;
	if (ch451_key == 0x43) //* 
 	    temp = 0x14;
	 else if (ch451_key == 0x53) //#
  	    temp = 0x15;
	 else if (ch451_key == 0x4b) //0
 	    temp = 0x00;
	 else if (ch451_key == 0x40) //1
 	    temp = 0x01;
	 else if (ch451_key == 0x48) //2
 	    temp = 0x02;
	 else if (ch451_key == 0x50) //3
 	    temp = 0x03;
	 else if (ch451_key == 0x41) //4
 	    temp = 0x04;
	 else if (ch451_key == 0x49) //5
 	    temp = 0x05;
	 else if (ch451_key == 0x51) //6
 	    temp = 0x06;
	 else if (ch451_key == 0x42) //7
 	    temp = 0x07;
	 else if (ch451_key == 0x4a) //8
 	    temp = 0x08;
	 else if (ch451_key == 0x52) //9
 	    temp = 0x09;
 	 else 
	 	temp = 0x05;
	 return (temp);
}
//set ch451,rest init,bcd
void work_set()
{
	timer0_init();
	serial_init();
	ch451_init();                                  //init

⌨️ 快捷键说明

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