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

📄 7279按键显示.#1

📁 这是一个ha7279键盘显示的C语言源程序
💻 #1
字号:
3#include "c8051f020.h"                
#include <intrins.h>

sbit	HD7279_DAT=P1^7;
sbit	HD7279_CLK=P1^6;

#define NOSELECT7279  	P5 |= 0x80		//SPICS4(P57)=1
#define SELECT7279  	P5 &= ~(0x80)  	//SPICS4(P57)=0;
#define Set7279DAT  	HD7279_DAT=1
#define Clr7279DAT  	HD7279_DAT=0
#define Set7279CLK  	HD7279_CLK=1
#define Clr7279CLK  	HD7279_CLK=0
 
void SYSCLK_Init (void);             //初始化时钟
void Delay1us(unsigned char T);
void Delay1ms(unsigned char T);
void Delay1s(unsigned char T);
void Timer0_Init (void);             //初始化定时器
void PORT_Init (void);               //初始化IO口
void SPI0_Init (void);               //初始化SPI0
void Send7279Byte(unsigned char ch);
void Test7279(bit LoopFlag);
 
void main (void) 
{
	WDTCN = 0xde;
	WDTCN = 0xad;           //关看门狗
 	SYSCLK_Init ();         //初始化时钟
	Timer0_Init();			//初始化定时器
	PORT_Init ();           //初始化IO口
//	SPI0_Init ();           //初始化SPI0
	CPT1CN |= 0x80;			//使能比较器1
    REF0CN = 0x03;  		//使能片内参考电压
 	EA=1;					//开中断
	Test7279(1);
}


void SYSCLK_Init (void)  
{
   int i;                              // delay counter
   OSCXCN = 0x65;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   //while (!(OSCXCN & 0x80)) ;        // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
	OSCICN = 0x07;   //interal 16MHZ
}

                           
void PORT_Init (void)                  // 初始化IO口
{   
   XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   //EMI0TC  = 0x21;
   //P74OUT  = 0xFF;                                      
   //P0MDOUT = 0x15;
   //P1MDOUT |= 0x3C;  					//P1.2-P1.5推挽输出
   //P1 &= 0xc3;						//P1.2-P1.5=0
}

void SPI0_Init (void)                  //初始化SPI0
{
   SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
                                       // 8-bit data words
   SPI0CFG|=0xC0;	                   //CKPOL =1;

   SPI0CN = 0x03;                      // Master mode; SPI enabled; flags
                                       // cleared
   SPI0CKR = SYSCLK/2/8000000-1;       // SPI clock <= 8MHz (limited by 
                                       // EEPROM spec.)
}

unsigned char Count1ms;
void Timer0_Init (void)                //定时器0初始化,定时1ms
{
   	CKCON|=0x8;
   	TMOD|=0x1;    	                   //定时器0方式1,16Bit
	Count1ms=10;
   	TR0 = 0;                           // STOP Timer0
   	TH0 = (-SYSCLK/1000) >> 8;    	   // set Timer0 to overflow in 1ms
   	TL0 = -SYSCLK/1000;
   	TR0 = 1;   	                       // START Timer0
   	IE|= 0x2; 
}

void Timer0_ISR (void) interrupt 1     // 定时器0中断服务程序
{
	TH0 = (-SYSCLK/1000) >> 8;  
   	TL0 = -SYSCLK/1000;
	if (Count1ms) Count1ms--;
}

void Send7279Byte(unsigned char ch)
{	
	char i;
	SELECT7279;     	//置CS低电平 
	Delay1us(50);		//延时50μ
	
	for (i=0;i<8;i++)
	{	
		if (ch&0x80)	//输出7位到HD7279A的DATA端 
		{
			Set7279DAT;
		}
		else
		{
			Clr7279DAT;
		}
		Set7279CLK;		//置CLK高电平 
		ch=ch<<1;		//待发数据左移 
		Delay1us(8);	//延时8μ
		Clr7279CLK;		//置CLK低电平 
		Delay1us(8);	//延时50μ
	}
	Clr7279DAT;			//发送完毕,DATA端置低,返回 
}
unsigned char Receive7279Byte(void)
{
	unsigned char i,ch;
	ch=0;		
	Set7279DAT;			//DATA端置为高电平,输入状态
 	Delay1us(50);		//延时50μ
	for (i=0;i<8;i++)
	{
		Set7279CLK;		//置CLK高电平
		Delay1us(8);	//延时8μ
		ch=ch<<1;		//接收数据左移1位
		if (HD7279_DAT)
			ch+=1;		//接收1位数据
		Clr7279CLK;		//置CLK低电平
		Delay1us(8);	//延时8μ
	}                   
	Clr7279DAT;			//接收完毕,DATA端重新置成低电平(输出状态)
	return ch;
}

char GetKeyValue(void)
{
	char KeyValue;
	if (CPT1CN&0x40) return -1;	//无键按下 
	Send7279Byte(0x15);     	//发读键盘指令 
	KeyValue=Receive7279Byte();
	NOSELECT7279;           	//置CS高电平 
	return KeyValue; 
}

void WaitKeyOff(void)
{
	while  (!(CPT1CN&0x40));
}

void Test7279(bit LoopFlag)                                 
{
	char KeyValue;         
	Delay1ms(25);		//等待25ms复位时间 
	Send7279Byte(0xA4);	//发复位指令 
	NOSELECT7279;     	//置CS高电平 
	if (LoopFlag==0) return;
	
	for (;;)
	{	
		KeyValue=GetKeyValue();
         if(KeyValue!=-1)
          {
		    Send7279Byte(0xC8);	//发送键码值,按方式1译码下载显示 
		    Send7279Byte(KeyValue%16);
		    NOSELECT7279;     	//置CS高电平 
		    WaitKeyOff();
           }
	}
}


  void Delay1us(unsigned char us)
{
	while (us)
	{
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  --us;
	}
}

void Delay1ms(unsigned char T)
{
	Count1ms=T;
	while (Count1ms);
}

void Delay1s(unsigned char T)
{
	while (T)
	{
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		Delay1ms(200);
		T--;
	}
}

⌨️ 快捷键说明

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