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

📄 lesson7.c

📁 8051模拟I2C
💻 C
字号:

/************************************************/
/*单位名称:华南理工大学电信学院*/
/*模块:1位共阴数码管,CD4511驱动,使用反极法的键盘,串行EEPROM24C02*/
/*创建人:景永年   日期:2006年6月7日*/
/*修改人:*/

/*功能描述:写6bit EEPROM,再读出并显示在6个LED数码管*/
/*其他说明:*/
/*版本号:*/
/*************************************************/
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int
//#define _Nop() _nop_()

uchar volatile xdata g_sec_disp _at_ 0xFFFF;
uchar volatile xdata g_min_disp _at_ 0xEFFF;
uchar volatile xdata g_hr_disp  _at_ 0xDFFF;


void keypad_scan(void);
void keypad_response(uchar key_number);
void display_led(void);
void delay(uchar m, uchar n);


data uchar g_uc_sec_cnt,g_uc_min_cnt,g_uc_hr_cnt;
data uchar g_uc_key_number,g_uc_disp_cnt;/*g_uc_disp_cnt*/
data uchar g_uc_key_B_cnt;/*按键B按下的次数*/
code uchar g_uc_key_number_all[12]={0xF3,0xEB,0xDB,0xBB,0xF5,0xED,0xDD,0xBD,0xF6,0xEE,0xDE,0xBE};

extern void Start_I2C(void);
extern void Stop_I2C(void);
extern void SendB(unsigned char c);
extern unsigned char RcvB(void);
extern void Ack_I2C(bit a);
//bit ISendB(unsigned char sla, unsigned char c);
//bit IRcvB(unsigned char sla, unsigned char * c);
extern bit ISendStr(unsigned char sla, unsigned char suba, unsigned char * s,unsigned char no);
extern bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char * s,unsigned char no);

sbit P1_7 = P1^7;//beep


main()
{
		
	g_uc_sec_cnt = 0;
	g_uc_min_cnt = 0;
	g_uc_hr_cnt = 0;
	
	g_uc_disp_cnt = 0;
	g_uc_key_B_cnt = 0;
	
	while(1)
	{
		keypad_scan();
	}
	
}

/*************************************************/
/*
name:keypad_scan()
function: scan the keypad, get the key number
使用反极法检测键值
output:uc_key_number
*/
/*************************************************/
void keypad_scan(void)
{
	P1 = 0XF8;
	
	ACC = P1;
	ACC &= 0XF8;
	if(!(ACC == 0XF8))
	{
		delay(2,255);
		P1 = 0XF8;
		ACC = P1;
		ACC &= 0XF8;
		if(!(ACC == 0XF8))/*note:if(ACC != 0XF8) ACC XOR 0xF8;if(!(ACC == 0XF8)) the value of the ACC don't change*/
		{
			g_uc_key_number = ACC;/*get the row number*/

			P1 = 0X07;
			
			ACC = P1;
			ACC &= 0X07;
			if(!(ACC == 0X07))
			{
				delay(2,255);
				P1 = 0X07;
				ACC = P1;
				ACC &= 0X07;/*contains the column number*/
				if(!(ACC == 0X07))
				{
					g_uc_key_number |= ACC;/*combine to the key number*/
					keypad_response(g_uc_key_number);
				}
			}
		}
	}
}

/*************************************************/
/*
name:keypad_response()
function:response to the key number 
input:uc_key_number
*/
/*************************************************/
void keypad_response(uchar key_number)
{
	data uchar k;
	data uchar uc_device_addr,uc_device_sub_addr,uc_data_send[3];
	
lab:P1 = 0X07;/*release the key or not?*/
	ACC = P1;
	ACC &= 0X07;

	if((ACC == 0X07))/*release the key*/
	{
		for(k=0;k<=11;k++)
		{
			if(key_number == g_uc_key_number_all[k])
			  break;
		}
		switch(k)
		{
			case 10:/*A*/
					if(g_uc_disp_cnt == 6)
					{
						uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
						uc_device_sub_addr = 0x00;//EEPROM 首地址
						uc_data_send[0] = g_uc_hr_cnt;//存储的数据保存在数组uc_data_send中
						uc_data_send[1] = g_uc_min_cnt;
						uc_data_send[2] = g_uc_sec_cnt;
						
						ISendStr(uc_device_addr,uc_device_sub_addr,uc_data_send,3);//以页方式存储
						
						g_uc_hr_cnt = 0xFF;//清屏
						g_uc_min_cnt = 0xFF;
						g_uc_sec_cnt = 0xFF;
						display_led();
					}
				break;
			case 11:/*B*/
					g_uc_key_B_cnt++;//需要对uc_key_B_cnt赋初始值,否则uc_key_B_cnt得到随机数
					switch(g_uc_key_B_cnt)
					{
						case 1:
							uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
							uc_device_sub_addr = 0x00;//EEPROM 首地址
							IRcvStr(uc_device_addr,uc_device_sub_addr,uc_data_send,3);//以页方式读取
							g_uc_hr_cnt = uc_data_send[0];//读出的数据保存在数组uc_data_send中
							g_uc_min_cnt = uc_data_send[1];
							g_uc_sec_cnt = uc_data_send[2];

							g_hr_disp = g_uc_hr_cnt | 0x0F;//显示hr high
							break;
						case 2:
							g_hr_disp = g_uc_hr_cnt;//显示hr high和hr low
							break;
						case 3:
							g_min_disp = g_uc_min_cnt | 0x0F;//显示min high							
							break;
						case 4:	
							g_min_disp = g_uc_min_cnt;//显示min high和min low
							break;
						case 5:	
							g_sec_disp = g_uc_sec_cnt | 0x0F;//显示sec high
							break;
						case 6:
							g_sec_disp = g_uc_sec_cnt;//显示hr high和hr low

							g_uc_key_B_cnt = 0;
							g_uc_disp_cnt = 0;//允许接收按键0~9
							break;
						default:
							break;
					}
				break;

			default:/*k = 0~9*/
				if(g_uc_disp_cnt < 7)//the maximal number is 6
				{
					g_uc_disp_cnt++;
					switch(g_uc_disp_cnt)
					{
						case 1:/*hr high*/
								g_uc_hr_cnt = k << 4;
								g_hr_disp = g_uc_hr_cnt;/*using OR can't mask the hr_low,so hr equal to 0*/						
							break;
						case 2:/*hr low*/
								g_uc_hr_cnt += k;
								g_hr_disp = g_uc_hr_cnt;
							break;
						case 3:/*min high*/
								g_uc_min_cnt = k << 4;
								g_min_disp = g_uc_min_cnt;
							break;
						case 4:/*min low*/
								g_uc_min_cnt += k;
								g_min_disp = g_uc_min_cnt;
							break;
						case 5:/*sec high*/
								g_uc_sec_cnt = k << 4;
								g_sec_disp = g_uc_sec_cnt;
							break;
						case 6:/*sec low*/
								g_uc_sec_cnt += k;
								g_sec_disp = g_uc_sec_cnt;

								//g_uc_disp_cnt = 7;/*avoid setting incorrectly*/
							break;
						default:		
							break;
					}
				}
				break;
		}
	}
	else/*not release the key; continue wait*/
	{
		delay(2,255);
		goto lab;
	}
}
/*************************************************/
/*
name:display_led
function:display the number
*/
/*************************************************/
void display_led(void)
{
	g_sec_disp = g_uc_sec_cnt;//显示sec
	g_min_disp = g_uc_min_cnt;//显示min
	g_hr_disp = g_uc_hr_cnt;//显示hr
}
/*************************************************/
/*
name:delay
function: 
*/
/*************************************************/
void delay(uchar m, uchar n)
{
	data uchar i, j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++);
	}
}


⌨️ 快捷键说明

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