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

📄 ch451c54.c

📁 这是单片机实验板比较齐全的程序
💻 C
字号:
//CH451
//功能  开机后在最低位置1,其余清零;按下键后,左移两位,在低两位显示
//十进制键值,如果按住键不放,最低位小数点点亮,释放后小数点熄灭。
#include <Winbond\W77C32.H>
#include "sybxt1.h"
//如果使用键盘中断请定义
#define  USE_KEY  1
#define  uchar unsigned char
//须主程序定义的参数
uchar  ch451_key;		                // 存放键盘中断中读取的键值
sbit ch451_dclk=P1^1;                            //串行数据时钟上升延激活
sbit ch451_din=P1^0;		                    // 串行数据输出,接CH451的数据输入
sbit ch451_load=P1^2;                            //串行命令加载,上升延激活
sbit ch451_dout=P3^3;        	                     //INT1,键盘中断和键值数据输入,接CH451的数据输出
#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显示
//初始化子程序
code uchar ucch451[][2]={0,0x40,1,0x41,2,0x42,3,0x43,4,0x48,5,0x49,6,0x4a,7,0x4b,8,0x50,9,0x51,10,0x52,11,0x53,12,0x58,13,0x59,14,0x5a,15,0x5b};
uchar getch451code(uchar uccode)
{
	uchar i;
	uchar rtn=1;
	for(i=0;i<16;i++)
	{
		if(ucch451[i][1]==uccode)
		{rtn=ucch451[i][0];
		break;
		}
		
	}
	return rtn;
}
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
//*************************************************
//中断子程序  使用中断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;				    //清中断标志
}
//***********************************************
//*************************************************
//延时程序
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++);
}
//************************************************
void ch451init()
{
	
	ch451_init();                                  //调用初始化
	ch451_write(0x403);
	ch451_write(0x580);                           //测试送入命令
	
	ch451_write(CH451_DIG0|0X01);                 //最低位显示1
	ch451_write(CH451_DIG1|0X02);                 //最低位显示1
	ch451_write(CH451_DIG2|0X03);                 //最低位显示1
	EA=1;
	ch451_key=0x0ff;
}
void testch451(){
	uchar a;
    while(ch451_key==0xff && !(uccmd=='q'||uccmd=='Q'));	                //等待中断
	if(!(uccmd=='q'||uccmd=='Q'))
	{
		a=ch451_key;
		ch451_key=0x0ff;
		ch451_write(0x300);		              //左移两位
		a&=0x7f;			             //显示十进制数据
		a=getch451code(a);
		ch451_write(CH451_DIG0|a);
		delay();
		
	}
}
#endif 

⌨️ 快捷键说明

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