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

📄 shiyan82f.c

📁 本程序功能是利用单片机控制用户板上的小键盘
💻 C
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :LcdTest.c                                             */
/*  DATE        :Mon, Sep 06, 2004                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*                                                                     */
/*  This file is generated by Hitachi Project Generator (Ver.2.1).     */
/*                                                                     */
/***********************************************************************/
                  

#include <header3664.h>
#include <machine.h>

//端口5的P50--P57和LCD的DB0--DB7连接,端口8的P80,P81和P82连接LCD的E,RS,R/W;

#define E IO.PDR2.BIT.B0
#define RS IO.PDR2.BIT.B1
#define RW IO.PDR2.BIT.B2

void LCDupdate(void);			//LCD显示子程序
void LCDinit(void);				//LCD初始化
void LCD_Busy(void);			//LCD判忙子程序
void LCD_Print(void);			//LCD写程序
void LcdStrUpdate(void);		//LCD显示内容更新
void clear();

//unsigned char LcdStr[] = {"How are you!    "};
int LcdBusy = 0;
int delaya = 0;					//延时变量
int delayb = 0;
int delayc = 0;


//////
unsigned char tab[]={0x77,0x7b,0x7d,0x7e,0x0b7,0x0bb,0x0bd,0x0be, 
					0x0d7,0x0db,0x0dd,0x0de,0x0e7,0x0eb,0x0ed,0x0ee}; 	/*键码表*/ 

unsigned char LcdStr[]={"0123456789ABCDEF"};

unsigned char j;
//端口8的P80~P83与键盘的列Y4~Y1连,端口1的P14~P17与键盘的行X4~X0连

delay(unsigned long int i)
{	unsigned long int y;
	for (y=0;y<i;y++);
}


////


void main(void)
{
	unsigned char i,a,b;
	IO.PCR2 = 0x0ff;
	IIC.ICCR.BIT.ICE = 0;		//选择端口5为通用IO
	IO.PMR5.BYTE = 0;
	//

	while(1)
	{
	//进入查询是否有键按下
	//for (delaya=0;delaya<10000;delaya++);
	IO.PCR2 = 0x0ff;
	IIC.ICCR.BIT.ICE = 0;		//选择端口5为通用IO
	IO.PMR5.BYTE = 0;
	a=0xf0;				//键盘无输入时的初始值
	delay(1000);
	IO.PCR8 = 0x0f;       	//端口8低4位输出
	IO.PDR8.BYTE=0;         //端口8输出列线低电平
	while( a==0xf0)	
			
	{
		
		delay(5000);		//延时,去抖
        IO.PCR1=0x0f;          	//端口1高4位输入,低4位输出 
		a=IO.PDR1.BYTE;		//读入行线值
		a=a & 0xf0;               //保留高4位值
	
	};

	//有键按下
		b=a; 			//先保存高4位

		a=a|0x0f; 		//高4位不变,低4位置1,准备从行线输出

        IO.PCR1=0xff;          	//端口1高4位输出,低4位输出 		
		IO.PDR1.BYTE=a; 
		delay(5000);		//延时,去抖

		//读入列线的值
		IO.PCR8 = 0x00;        	//端口8低4位输入
		delay(5000);

		b=b|(IO.PDR8.BYTE&0x0f);   //合并行线与列线的值

//在键码表中查找相应的键码,并计算在段码中的位置
		i=0; 			   //计数器清零
		a=tab[0];
		while (i<16&b!=a)
		{
			i++;
		 	a=tab[i];
		 }	
		
		j=i;

	//

	LCDinit();
	LCDupdate();
	//delay(9999);
	}
}

void abort(void)
{
	
}
/*--------------------------------------------------------------------------

Function:					void LCD_Busy(void)
Purpose:					判断LCD是否可写	

---------------------------------------------------------------------------*/

void LCD_Busy(void)
{
	RS = 0;
	RW = 1;
	
	IO.PCR5 = 0;				//选择端口5为输入端口
	E = 1;
	LcdBusy = IO.PDR5.BIT.B7;
	E = 0;

	for(;LcdBusy == 1;)
	{
		IO.PCR5 = 0;
		E = 1;
		LcdBusy = IO.PDR5.BIT.B7;
		E = 0;
	}
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCD_Print(void)
Purpose:					LCD写程序	

---------------------------------------------------------------------------*/

void LCD_Print(void)
{
	delaya = 0;
	RW = 0;
	E = 1;
	E = 0;
	for(delaya = 0;delaya++<1000;);
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCDinit(void)
Purpose:					初始化LCD,准备接收输入	

---------------------------------------------------------------------------*/

void LCDinit(void)
{
	int i = 0;
		
	set_imask_ccr(1);
	RS = 0;
	RW = 0;
	
	IO.PCR5 = 0x0ff;				//选择端口5为输出管脚
	IO.PDR5.BYTE = 0x30;

	for(i = 3;i > 0;i--)
	{
		E = 1;
		E = 0;
		for(delayb = 0;delayb++<8000;);
	}

	IO.PDR5.BYTE = 0x38;
	LCD_Print();
	
	IO.PDR5.BYTE = 0x01;
	LCD_Print();

	IO.PDR5.BYTE = 0x06;
	LCD_Print();

	IO.PDR5.BYTE = 0x0f;
	LCD_Print();
	set_imask_ccr(0);
	return;
}

/*--------------------------------------------------------------------------

Function:					void LCDupdate(void)
Purpose:					使LCD显示相应内容	

---------------------------------------------------------------------------*/

void LCDupdate(void)
{
	int i = 0;
	set_imask_ccr(1);
	RS = 0;
	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x01;
	LCD_Print();

//	for(i = 0;i < 16; i++)
//	{
		LCD_Busy();
		
		RS = 1;
		//clear();
		IO.PCR5 = 0x0ff;
		IO.PDR5.BYTE = LcdStr[j];
		//IO.PDR5.BYTE = a;

		LCD_Print();
		delay(4000);
/*		if(i == 7)
		{
			for(delayc = 0;delayc++ <4000;);
			RS = 0;
			IO.PDR5.BYTE = 0x0c0;
			LCD_Print();
		}*/
//	}
	
	set_imask_ccr(0);
	return;
}
void clear()
{
	int i = 0;
	set_imask_ccr(1);
	RS = 0;
	IO.PCR5 = 0x0ff;
	IO.PDR5.BYTE = 0x01;
	LCD_Print();
	set_imask_ccr(0);
}

⌨️ 快捷键说明

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