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

📄 showkeynumber.c

📁 薔介绍单片机的彩色液晶显示器开发里程。手把手
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "iom128v.h"
#include "macros.h"
#define CMD_READ 0x15
#define ada (*(volatile unsigned char*) 0x1118)//外部存储器地址映射,ada是读写地址
#define adb (*(volatile unsigned char*) 0x111a)//adb是横坐标
#define adc (*(volatile unsigned char*) 0x1119)//adc是纵坐标


//液晶读写操作函数
void write(unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3);//液晶输入程序
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3);//读取一个字节位的数据
void clrall(char color);//清屏操作
//液晶汉字输出
void hz_write(char x,char y,char *hz,char color);//将输入的黑白格式转换为给lcd可以识别的彩色字模
void lettershow(char x,char y,char *hz,char color);//按照列位置显示任意大小颜色的字符
void showchar(char x,char y,char a,char letter,char color);//在任意位置显示a所表示的值
//void showchars(char x,char y,char *a,char letter,char color);//在任意位置显示字符串a所表示的值
/******液晶的基本输入输出,一次写入或读出横向八个点*******/
char a;
char keydown;
char weizi=10;
char tempa=0XFF;
char tempb;
//按键延时

void short_delay(void);
void long_delay(void);
void delay_1ms(void);

unsigned char key_number=0Xff;
//******T1长延时******
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++) 
;
}

//*********T2,T3,T6,T7短延时*******
void short_delay(void)
{ 
unsigned char i;
for(i=0;i<8;i++)
;
}

//*******按键延时***** 
void delay_1ms(void)
{
 	 	unsigned int i,j;
		 for(j=1;j<20;j++)
		 {
		  for(i=1;i<200;i++)
		  ;
		  }
}
//************发送键盘指令*******	 
void send_byte(unsigned char out_byte)
{

  unsigned char i;
  DDRD=0xFd;
  PORTD&=0xEF;     //使CS=0
  long_delay(); //T1  50us
    for(i=0;i<8;i++)
    {
         if (out_byte&0x80)
         {
          PORTD|=0x08;     //使DAT=1
	     }
         else
        {
          PORTD&=0xF7;      //使DAT=0
        }    
	PORTD|=0x04;      //使CLK=1 
    short_delay();//T2     8us
    PORTD&=0xFB;     //使CLK=0
    short_delay();//T3     8us
    out_byte=out_byte*2;
    }
  PORTD&=0xF7;
  
}  


unsigned char receive_byte(void)
{
   unsigned char i, in_byte;
   DDRD=0xF5;      //dat=1输入状态    HGFHJGH
   PORTD|=0X08;     
   long_delay();    //T5   25us
     for (i=0;i<8;i++)
     {
      PORTD|=0x04;      //使CLK=1
      short_delay();//T6   8us
      in_byte=in_byte*2;

           if ((PIND&0x08)==0x08)    //判断DAT是否为1  JHJGH
	       {
            in_byte=in_byte|0x01;
		    PORTB=0x01;
	       }
	   short_delay(); //T7    8us
       PORTD&=0xFB;     //使CLK=0
       short_delay();   //T7  8us
     }
   PORTD&=0xF7;     //使DAT=0
   return (in_byte);
   
}


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


#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{  
   
   CLI();
   EIMSK=0X00;
   delay_1ms();
   key_number=read7279(CMD_READ);
	 if(tempa!=key_number)
	 {
   	  		
        	 	if(key_number==0x09)
     			{
   				 	 	a=1;			 						
	 			}
	 		 	else if(key_number==0x08)
	 			{
	        		a=2;
	 			}
     			else if(key_number==0x0B)
	 			{
	        		a=3;
	 			}
	 			else if(key_number==0x01)
	 		 	{
	        		a=4;
	 			}
	  			else if(key_number==0x00)
	 			{
	        		a=5;
	 			}				
	  			else if(key_number==0x03)
	 			{
	        		a=6;
	 			}
	  			else if(key_number==0x19)
	 			{
	        		a=7;
	 			}
	  			else if(key_number==0x18)
	 			{
	        		a=8;
	 			}				 		
	  			else if(key_number==0x1B)
	 			{
	        		a=9;
	 			}
	  			else if(key_number==0x10)
	 			{
	        		a=0;
	 			}		 
	        	tempa=key_number;
				keydown=keydown%4;
			if(tempb%2==0)
			{
				if(keydown==0)//只按下一次案件,显示数字
						showchar(weizi,130,a,0,7);
				else
				{
					   a=(a-1)*3+keydown+58;
					   showchar(weizi,130,a,1,7);
				}
				showchar(weizi,140,keydown,0,7);
     		 	weizi++;
				keydown=0;
				
			}
			tempb++;
	} 
       keydown++;
	   EIMSK=0X02;
       SEI();
	   
		

}


void WDT_off(void)
{
   WDTCR=(1<<WDCE)|(1<<WDE);//write logical one to WDCE and WDE
   WDTCR=(0<<WDE);// turn off WDT
}


void main(void)
{  
   MCUCR=0X80;//选择外部存储器
   DDRA=0XFF;
   PORTA=0X14;//将a口的第3、5口输出
   DDRC=0X00;
   PORTC=0XFF;//前面的几步都是在选择和初始化液晶
   clrall(0x00);//用黑色清屏
   clrall(0x01);//用黑色清屏
   EICRA=0X08;
   WDT_off();
   SEI();
   DDRD=0xFd;
   PORTD=0x12;
   EIMSK=0X02;
   //for(;;);
}  
   
void write (unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3)
{ 
   
   DDRA=0xff;//a口为输出
   adb=x;
   adc=y;
   ada=buffer1;
   ada=buffer2;
   ada=buffer3;
}

void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3)
{

⌨️ 快捷键说明

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