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

📄 task_165_595.c

📁 利用C8051F020为控制单元
💻 C
字号:
#include  "c8051f020.h"
#include  "config.h"
#include  "stdio.h"
#include  "intrins.h"

bit flag_165;	//按键存在标志,为1表示有键按下,否则没有键按下

sbit A0=ACC^0;
sbit A1=ACC^1;
sbit A2=ACC^2;
sbit A3=ACC^3;
sbit A4=ACC^4;
sbit A5=ACC^5;
sbit A6=ACC^6;
sbit A7=ACC^7;

sbit SCLK	= P3^5;	//移位寄存器时钟输入:11脚
sbit RCLK 	= P3^4;	//存储寄存器时钟输入:12脚
sbit SER 	= P3^3;	//串行数据输入:14脚

sbit SH_LD	= P3^2;	//移位控制/置入控制(低电平有效):1脚
sbit CLK	= P3^1;	//时钟输入端(上升沿有效):2脚
sbit QH		= P3^0;	//输出端 :9脚

/**************************************************
>>>函数名称: IN_165(void)
>>>函数功能: 串行输出给ACC
>>>入口参数: 无
>>>出口参数: return(ACC);8个键盘码
>>>调用模块: 无
>>>建立时间: 08_07_25
/**注意事项:是先将QH值赋值给An,因为在SH_LD上升沿到来时候Qh已经输出,在CLK上升沿来的时候输出Qg值
***************************************************/
UCHAR IN_165(void)
{
	//按HGFEDCBA顺序串行输出
	A7=QH;CLK	=	0;CLK	=	1;
	A6=QH;CLK	=	0;CLK	=	1;
	A5=QH;CLK	=	0;CLK	=	1;
	A4=QH;CLK	=	0;CLK	=	1;
	A3=QH;CLK	=	0;CLK	=	1;
	A2=QH;CLK	=	0;CLK	=	1;
	A1=QH;CLK	=	0;CLK	=	1;
	A0=QH;
	return(ACC);
}

/**************************************************
>>>函数名称: TASK_165(void)
>>>函数功能: 采集键盘码
>>>入口参数: 无
>>>出口参数: 有键按下:return(DATA_165);  无键按下:return(0);
>>>调用模块: UCHAR IN_165(void);
>>>建立时间: 08_07_25
/**注意事项:
***************************************************/
UCHAR TASK_165(void)
{
	UCHAR DATA_165;
	DATA_165=0;
	CLK	=	0;
	ACC=0;
	SH_LD	=	0;	//74LS165将并行数据置入寄存器中
	SH_LD	=	1;	//并行置数功能被禁止
	DATA_165=IN_165();
	if(DATA_165)
	{
	 	flag_165=1;
	 	return(DATA_165);
	 }
	 else
	 {
	 	flag_165=0;
		return(0);
	 }
}


/**************************************************
>>>函数名称: LED_595_TASK(UCHAR d)
>>>函数功能: 74HC595驱动发光二极管LED
>>>入口参数: UCHAR d:对应的8个数码管的亮灭,位为1亮,位为0灭
>>>出口参数: 无
>>>调用模块: 无
/**建立时间:2008年7月20号
/**注意事项:串行到并行的数据转换
***************************************************/
void Write_595(UCHAR d)
{
	UCHAR i,Serial;
	Serial	=	d;
	for(i=0;i<8;i++)
    {
		SCLK = 0;
		SER=Serial&0X80;//因为串口输入是最低位先输入,所以,先右移一位使得最低位变为CY,再执行SER=CY;
		Serial=Serial<<1;
		SCLK = 1;		//数据在SCLK的上升沿输入到移位寄存器中
		_nop_();
	}
	//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令
	RCLK = 0;	
	_nop_();
	RCLK = 1;	//数据在RCLK的上升沿输输出
} 


void main(void)
{
	UCHAR KEY_165;
	UCHAR tab[8]={0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80};
	config();
	for(;;)
	{
		KEY_165=TASK_165();
		switch(KEY_165)
		{
			case 0x01:	Write_595(0x01);break;
			case 0x02:	Write_595(0x02);break;
			case 0x04:	Write_595(0x04);break;
			case 0x08:	Write_595(0x08);break;
			case 0X10:	Write_595(0x10);break;
			case 0X20:	Write_595(0x20);break;
			case 0X40:	Write_595(0x40);break;
			case 0X80:	Write_595(0x80);break;
			default: break;
		}
	}
}

⌨️ 快捷键说明

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