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

📄 keytest.c

📁 7219显示8个数码管和64位键盘
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

//*** 函数定义 ***
void long_delay(void);							// 长延时
void short_delay(void);							// 短暂延时
void write7279(unsigned char, unsigned char);	// 写入到HD7279
unsigned char read7279(unsigned char);			// 从HD7279读出
void send_byte(unsigned char);					// 发送一个字节
unsigned char receive_byte(void);				// 接收一个字节
void delay_us(int);                              // 微秒延时
void dely_ms(unsigned int);                      // 毫秒延时

//*** 变量及I/O口定义 ***
unsigned char digit[5];
unsigned char key_number, j, k;
unsigned int tmr;
unsigned long wait_cnter;

//***I/O口初始化***
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x07;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88

//****** 位定义 ******
#define PORTB0 0  
#define PORTB1 1
#define PORTB2 2
#define PORTB3 3
#define PORTB4 4
#define PORTB5 5
#define PORTB6 6
#define PORTB7 7

//*** 主程序 ***
main()
{   
    port_init();
	while (1)
	{
		for (tmr=0;tmr<0x2000;tmr++);	// 上电延时
		send_byte(CMD_RESET);			// 复位HD7279A

//******************************************
//              测试指令演示
//******************************************
		send_byte(CMD_TEST);				// 测试指令
		dely_ms(100);
		send_byte(CMD_RESET);				// 清除显示

//**********************************************
//        闪烁指令及键盘接口测试
// 将用户按键的键码显示出来, 如果10秒内无按键
// 或按S0键即进入下一步演示
//**********************************************
		wait_cnter=0;
		key_number=0xff;
		write7279(BLINKCTL,0xfc);			// 第1、2两位设为闪烁显示
		write7279(UNDECODE,0X08);			// 在第1位显示下划线'_'
		write7279(UNDECODE+1,0x08);			// 在第2位显示下划线'_'
		do
		{   
			if ((PINB&0x08)==0)					// 如果有键按下
			{
				key_number=read7279(CMD_READ);			// 读出键码
				write7279(BLINKCTL,0xff);               // 清除闪烁设置
				write7279(DECODE1+1,key_number/16);		// 在第2位显示键码高8位
				write7279(DECODE1,key_number&0x0f);		// 在第1位显示键码低8位
				while ((PINB&0x08)==0);			// 等待按键放开
				wait_cnter=0;
			}
			wait_cnter++;
		} while (key_number!=0 && wait_cnter<0x8000);	// 如果按键为‘0’和超时则进入下一步演示
								
     }
} 
		
void write7279(unsigned char cmd, unsigned char dta)
{
	send_byte (cmd);
	send_byte (dta);
}

unsigned char read7279(unsigned char command)
{
	send_byte(command);
	return(receive_byte());
}

void send_byte(	unsigned char out_byte)
{
	unsigned char i;
	PORTB&=~BIT(PORTB0);
	long_delay();
	for (i=0;i<8;i++)
	{
		if (out_byte&0x80)
		{
			PORTB|=BIT(PORTB2);
		}
		else
		{
			PORTB&=~BIT(PORTB2);
		}
		PORTB|=BIT(PORTB1);
		short_delay();
		PORTB&=~BIT(PORTB1);
		short_delay();
		out_byte=out_byte*2;
	}
	PORTB&=~BIT(PORTB2);
}

unsigned char receive_byte(void)
{
	unsigned char i, in_byte;
	PORTB|=BIT(PORTB2);				// set to input mode
	long_delay();
	for (i=0;i<8;i++)
	{
		PORTB|=BIT(PORTB1);
		short_delay();
		in_byte=in_byte*2;
		DDRB&=~BIT(PORTB2);
		_NOP();
		if ((PINB&(1<<2))==(1<<2))
		{
			in_byte=in_byte|0x01;
		}
		DDRB|=BIT(PORTB2);
	    _NOP();
		PORTB&=~BIT(PORTB1);
		short_delay();
	}
	PORTB&=~BIT(PORTB2);
	return (in_byte);
}

void long_delay(void)
{
	unsigned char i;
	for (i=0;i<0x30;i++);
}

void short_delay(void)
{
	unsigned char i;
	for (i=0;i<8;i++);
}

// ************************* 延时 n*ms *************************

void delay_us(int time)    //微秒级延时
 {
 do
 time--;
 while(time>1);
 }

void dely_ms(unsigned int time)
 {
 while(time!=0)
  {
  delay_us(1000);
  time--;
  }
 }

⌨️ 快捷键说明

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