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

📄 key1.c

📁 好东西 关于单片机的一些重要的代码本程序是操作系统中比较典型的线程同步算法中的哲学家进餐问题,为防止死锁,采取了两个条件(筷子空闲)同时满足时再允许进餐的办法来解决。期望与大家一起学习交流!
💻 C
字号:
/****************************************Copyright (c)**************************************************/
/**                                
;**                                 西南科技大学计算机学院
;**                                   
;**                                  http://cs.swust.edu.cn
;**            
;**             日期:   2004.10.15
;**             功能:   键盘扫描程序,利用定时器定时扫描,将扫描的扫描码转换为显示码,
;**                      利用一个数码管将扫描的数据显示出来
;**             扩展:    利用定时器延迟去抖  
;**             本程序作用:键盘扫描原理显示。逐行扫描,低电平扫描
;**             数码管段码:0------F 对应 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
;**                                        0x77,0x7c,0x39,0x5e,0x79,0x71 ,可采用查表实现   
;**             硬件连接,连接数码管显示模块中的两组跳线,一组为8位数据线,一组为6位位选线,
;**                       默认连接,数据:p00----p07,位选:P10----P15 ,数码管共阴级,键盘模块中
;**                       连接键盘行信号线和列信号线,以及SHIFT,(连P27)
;**             
;**
;**-------------.c文件
;**------------------------------------------------------------------------------------------------------*/

/**------------------------------------------------------------------------------------------------------*/
#include <at89x52.h>
const char Discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const char ScanData[]={0xfe,0xfd,0xfb,0xf7};
void timer0_init(void);
char scancount=0;
void keyscan(void);
void PortInit(void);
void keyscan(void);
char key_x,key_y;
char keydata;
unsigned int count=0;
/***********************************************************************************
定时器0中断服务函数
作    用: 添加服务函数,由定时器中断统一调用
入口参数: 无
中断向量: 1
***********************************************************************************/
void int_t0(void) interrupt 1
   { 
      count++;
	 // if(count==0x8ff)
	  {
         keyscan();
		 count=0;
  	  }
	  TH0=0Xff;
   }
/***********************************************************************************
主函数
作    用: 程序入口
入口参数: 无
***********************************************************************************/
void main(void)
{
   PortInit();
   timer0_init();
   while(1);
}
/***********************************************************************************
键盘扫描函数
作    用: 逐行扫描方式扫描键盘
入口参数: 无
***********************************************************************************/
void keyscan(void)
{   
    P2=ScanData[scancount];// 扫描数据
	key_y=scancount*4;
	scancount++;
	if(scancount==4)
	 {
	   scancount=0;
	 }
    if((P2&0xf0)!=0xf0)
	{ 
	   
       switch(P2&0xf0)
	     {
	        case 0xe0: key_x=0x03;
	                   break;
	        case 0xd0: key_x=0x02;
	                   break;
	        case 0xb0: key_x=0x01;
	                   break;
	        case 0x70: key_x=0x00;
	                   break;
	        default:   break;
	   }
      keydata=key_x+key_y;
	  P0=Discode[keydata];

   }

}
/***********************************************************************************
定时器初始化函数
作    用: 初始化定时器,设置定时器中断,定时长度,定时器工作方式
入口参数: 无
***********************************************************************************/
void timer0_init(void)
{
 IE|=0X82;
 TL0=0X00;
 TH0=0X00;
 TMOD=01;
 TCON|=0X10;
}
/***********************************************************************************
端口初始化函数
作    用: 设置上电后端口某些特殊状态。
入口参数: 无
***********************************************************************************/
void PortInit(void)
{
  P1=0xfe;
  P0=0X00;
}

⌨️ 快捷键说明

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