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

📄 keyp.c

📁 实现单片机与键盘和液晶的人机交互
💻 C
字号:
#include<2.h> 
#include<math.h>
#include<stdio.h>
#include<intrins.h>                  
#include <absacc.h>
#include <setjmp.h>
#include<string.h>
 void main(void)
{   
   ssp=20; 
   ver=1;  
   
   initLCD();
   LCDwriteByte(0x01,0); 
   CPRST=NORM;
    FLASHADDR=0xffff;
     disp_page();
   Timer4_Init(N);
    while(1) {  
     check_key();
      
	  if (FLASHADDR!=0xFFFF)        //有闪烁
		      {
                  if (numm%2==0)
			           DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB]; 
		          else
			          DATALCD[FLASHADDR]=' ';  
					}
      LCDwritePage();  
 } 
}
void initLCD(void)
{
	delayus(40000);          //wait 40ms     								   
    CLRBIT(P4,RSTLCD);    //power on to reset >50ns  
 	delayus(1000);	         //1ms,reset pulse width >10us
	SETBIT(P4,RSTLCD);
    delayus(1000);
	CLRBIT(P4,CSLCD);
	delayus(1000);     
	CLRBIT(P4,SCKLCD);
	delayus(1000);
	LCDwriteByte(0x30,0);    //base instruction set,功能设定,基本指令集操作
	LCDwriteByte(0x30,0);    //base instruction set
	LCDwriteByte(0x01,0);    //clr screen,>10ms,清除显示屏幕,把DDRAM位址计数器调整为“00H”
 	delayus(10000);
	LCDwriteByte(0x06,0);    //move direction of cursor & screen,光标右移,整体显示不移动
	LCDwriteByte(0x0C,0);    //display on,no cursor,整体显示ON, 游标OFF,游标位置OFF
}
void check_busyLCD(void)
{ unsigned char ctemp;
   unsigned char dat;
    unsigned char LCDctr=0xFC;
    
   for (ctemp=8;ctemp>0;ctemp--)    //syn bit string
	   {
	   CLRBIT(P4,SCKLCD); //上升沿写
	   if (ISBITSET(LCDctr,ctemp-1))
	      SETBIT(P4,STDLCD);
	   else
	      CLRBIT(P4,STDLCD);
 	   delayus(2);           //SCLK width>0.3us
       SETBIT(P4,SCKLCD);
	   delayus(2);
	   }
     dat=STDLCD; 
 while((dat&0x80)==0x80);
}
 //LCDctrl=1 for data,  =0 for command
void LCDwriteByte(unsigned char LCDdata,unsigned char LCDctrl)
{
    unsigned int itemp;
	unsigned char ctemp;
	if (LCDctrl==1) LCDctrl=0xFA;     
	 else  LCDctrl=0xF8;   
    itemp=(LCDdata&0xF0)*256+(LCDdata&0x0F)*16;// 把数据转化为16位的十进制数
	SETBIT(P4,CSLCD); //选中液晶 
//写同步字符   
	for (ctemp=8;ctemp>0;ctemp--)    //syn bit string
	   {
	      CLRBIT(P4,SCKLCD); //上升沿写
	   if (ISBITSET(LCDctrl,ctemp-1))
	      SETBIT(P4,STDLCD);
	   else
	      CLRBIT(P4,STDLCD);
 	      delayus(2);           //SCLK width>0.3us
          SETBIT(P4,SCKLCD);
	      delayus(2);
	   }
//写数据或指令
	for (ctemp=16;ctemp>0;ctemp--)    //1 byte
	   {
	      CLRBIT(P4,SCKLCD);
	   if (ISBITSET(itemp,ctemp-1))
	      SETBIT(P4,STDLCD);
	   else
	      CLRBIT(P4,STDLCD);
 	      delayus(2);
          SETBIT(P4,SCKLCD);
	      delayus(2);
	   }
	CLRBIT(P4,CSLCD);

}

void LCDwritePage(void)
{
    unsigned char ctemp;
	check_busyLCD();
    for (ctemp=0;ctemp<32;ctemp++)
	   {
	   LCDwriteByte(LCDgetPos(ctemp),0);            //position
	   LCDwriteByte(DATALCD[2*ctemp],1); //high byte 
        delayus(1000);
	   LCDwriteByte(DATALCD[2*ctemp+1],1); //low byte
	   }
}
  
unsigned char LCDgetPos(unsigned char LCDpos)
{
    unsigned char row,col;
    row=LCDpos/8;        //row=0-3
	col=LCDpos-row*8;  //col=0-8  
    return (HZpos[row]+col);
}
//重载,不复制字符串结束符0x00(\0)
void ncstrcpy(unsigned char *dst, const unsigned char *src)
{
	while (*src!=0x00)
	   *dst++=*src++;
}
void Initial(void)
{
  
    P3MDOUT=0x00;
    P74OUT =0x00;
    WDTCN   =0x07;   //WATCHDOG TIMER CONTROL,Set WDT max interval
     WDTCN   =0xDE;   //disable WDT
    WDTCN   =0xAD;
     RSTSRC =0x00;                                               
      PCON=0x90;
      XBR0=0x04;
       XBR1=0x00;
      XBR2=0x40;//允许交叉开关和弱上拉
	  EA=1;
    OSCXCN =0x67;  //外部时钟为晶体振荡器方式
    OSCICN =0x08;      //选择外部振荡器作为系统时钟,内部振荡典型值为2MHZ;
      P0MDOUT|=0x01;
       
    
  //REF0CN=0X03;//允许内部VREF发生器
}
 
   void Timer4_Init(unsigned int counts)
{ 
    T4CON=0;             //停止定时器,设置为自动重载方式
    CKCON=0x00;         //定时器4使用系统时钟的12分频; 
    EIE2=0x04;           //允许定时器4溢出产生中断;
 	EIP2=0x04;         //设置定时器4中断为高优先级;
    RCAP4L=counts;
	RCAP4H=counts>>8;
    TH4=RCAP4H;
	TL4=RCAP4L;

    T4CON=0x04; //允许定时器4,并设置为自动重载方式;
	}               
 	void Timer4_ISR (void) interrupt 16 
{
   
   T4CON &=~0x80; //清除溢出标志位
   num++;
   if(num%100==0)
  { numm++;
 }
   
} 
 void delayus (unsigned long tdelay) 
{	 							  
    tdelay=tdelay/2;                                                                                                                                                                                                                                                                    
    while (tdelay>0)
	    tdelay--; 
} 
 
//-------------key-----------------------
void check_key(void)
{    
     SETBIT(P3,keyenter);
     SETBIT(P3,keyesc);
     SETBIT(P3,keyadd);
     SETBIT(P3,keysub);
	 ckey=((~P3)&0xF0);
	  if(ckey!=0){   
      if (keyenterflag==0)
        {   msg_key();
            keyenterflag=1;
            
        }
    
   else
        keyenterflag=0;
} 
}
 
	  
void msg_key(void)
{   unsigned char i1;
    i1=0;
    IKEYSTUS=TBSTUS[i1];
    while  (IKEYSTUS!=CPRST) 
    {
	 i1+=4;
         IKEYSTUS=TBSTUS[i1];
    }
    i1++;
    IKEYSTUS=TBSTUS[i1];
    while(IKEYSTUS!=0&&(IKEYSTUS!=ckey))
    {
	 i1+=4;
         IKEYSTUS=TBSTUS[i1];
    }
    CPRST=TBSTUS[i1+2];
    CPRAMADDR=TBSTUS[i1+1];
	switch(CPRAMADDR)
	{
	 
	 case NEXTTRIGLE1:disp_sigle();break;
	 case NEXTTRIGLE2:disp_cunchu();break;
     case NEXTTRIGLE3:disp_page();break;
     case SETSUB:set_SUB();break;

     case SETCLEAR:set_CLEAR();break;
     case SETNEXT:set_NEXT();break;
     case SETADD: set_ADD();break;
    // case NEXTPAGE3:disp_page0();break;
	 //case SETNEXT2:set_NEXT();break;
	// case SETADD2:set_ADD1();break;
	 }
  ckey=0;
}
  void set_CLEAR(void)
{   
   disp_page();
}
 void disp_page (void) 
 {  
     LCDwriteByte(0x01,0);
     sprintf(DATALCD+26,"%2d",ssp);
     sprintf(DATALCD+44,"%3f",ver);
     ncstrcpy(DATALCD+4,"数字示波器");
     ncstrcpy(DATALCD+16,"扫描速度     s
");
     ncstrcpy(DATALCD+32,"垂直灵敏度     v");
     ncstrcpy(DATALCD+48,"连续显示        ");
	  LCDwritePage();
     FLASHADDR=0XFFFF;
 }
 void disp_sigle(void)
 {  
   ncstrcpy(DATALCD+48,"单次触发        ");
    LCDwritePage();
 } 
void disp_cunchu(void)
{ 
  ncstrcpy(DATALCD+48,"存储            ");
    LCDwritePage();
}

⌨️ 快捷键说明

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