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

📄 取款机程序1.txt

📁 这是一个取款机应用程序
💻 TXT
字号:
//密码琐调试程序
#include <iom16v.h>
#include <macros.h>
#define lcd_data_port PORTD
#define lcd_data_ddr DDRD
#define lcd_busy_pin PIND
#define lcd_busy_ddr DDRD
#define lcd_control_port PORTA
#define lcd_control_ddr DDRA

#define lcd_RS 0x01 //PORTA^0

#define lcd_RW 0x02 //PORTA^1
                                                                                   
#define lcd_EN 0x04 //PORTA^2

#define busy 0x80 //LCD_DB7

#define uchar unsigned char
#define uint unsigned int
unsigned char  table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,
66};
unsigned char   buff[]={0,0,0,0,0,0};
unsigned char   buff0[]={0x36,0x36,0x36,0x36,0x36,0x36};
unsigned  int  count1=6,count=0, second=0,minute=0,hour=12,year=2005,month=11,day=06,week=7;
unsigned  char   string1[]="welcome use ATM ";
unsigned  char   string2[]="2.enter password";
unsigned  char   string3[]="3.set  password!";
unsigned  char   string4[]="input password! ";
unsigned  char   string5[]="new  password ! ";
//unsigned  char   string6[]=" @@@ PASS! @@@@ ";
unsigned  char   string61[]="1.fetch  money  ";
unsigned  char   string62[]="2.check  money  ";
unsigned  char   string63[]="Sorry!ATM is bus";
unsigned  char   string631[]="-ying now!      ";
unsigned  char   string621[]="$199.888.888.00 ";
unsigned  char   string620[]=" Name :Liwei    ";
unsigned  char   string7[]=" password wrong!  ";
unsigned  char   string8[]=" please close !   ";
/*------------------------------------液晶驱动函数-------------------------------------*/
//液晶初始化
void lcd_init(void)
{
 delay_ms(15);
 lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
 delay_ms(5);
 lcd_write_command(0x38,0);
 delay_ms(5);
 lcd_write_command(0x38,0);
 delay_ms(5);
 
 lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
 lcd_write_command(0x08,1);//显示关闭
 lcd_write_command(0x01,1);//显示清屏
 lcd_write_command(0x06,1);//显示光标移动设置
 lcd_write_command(0x0c,1);//显示开及光标设置
}

//写指令函数: E=高脉冲 RS=0 RW=0
void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
{
 if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
 lcd_control_port&=~lcd_RS;//RS=0
 lcd_control_port&=~lcd_RW;//RW=0
 lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
 NOP();
 lcd_control_port|=lcd_EN;//E=1
 lcd_data_port=command;
 lcd_control_port&=~lcd_EN;//重设E=0
}

//写数据函数: E =高脉冲 RS=1 RW=0
void lcd_write_data(unsigned char char_data)
{
 wait_enable();//等待LCD空闲
 lcd_control_port|=lcd_RS;//RS=1
 lcd_control_port&=~lcd_RW;//RW=0
 lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
 NOP();
 lcd_control_port|=lcd_EN;//E=1
 lcd_data_port=char_data;
 lcd_control_port&=~lcd_EN;//重设E=0
}

//正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
//检测忙信号,等待LCD空闲函数
void wait_enable(void)
{
 lcd_busy_ddr&=~busy;//设置busy口为输入
 lcd_control_port&=~lcd_RS;//RS=0
 lcd_control_port|=lcd_RW;//RW=1
 NOP();
 lcd_control_port|=lcd_EN;//E=1
 while(lcd_busy_pin&busy);//等待LCD_DB7为0
 lcd_control_port&=~lcd_EN;//重设E=0
 lcd_busy_ddr|=busy;//设置busy口为输出
}

//指定位置显示一个字符:第一行位置0~15,第二行16~31
//显示一个字符函数
void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
{
 unsigned char position_tem;
 if(position>=0x10)
 position_tem=position+0xb0;
 else
 position_tem=position+0x80;
 lcd_write_command(position_tem,1);
 lcd_write_data(char_data);//送数据;
}

//指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
//显示一行连续字符串函数
void display_a_string(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
{
 unsigned char col_tem,i;
 col_tem=col<<4;//若col为1(即在LCD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
 for(i=0;i<16;i++)
 display_a_char(col_tem++,*(ptr+i));
}

void delay_us(uint time)
{
 do
 time--;
 while(time>1);
}

void delay_ms(uint time)
{
 while(time!=0)
     {
	  delay_us(1000);
	  time--;
	 }
 }
 //********************跑马灯程序****************************//
void paomadeng(void)
	{
	    int i;
	    DDRB = 0xFF;	/* 定义B口为输出*///方向
	    PORTB = 0xFF;	/* 关闭全部LED *///数据
		for (i = 0; i < 8; i++)
			{PORTB=~(1<<i);	
	        delay_ms(20);}
		for (i = 8; i > 0; i--)
			{PORTB=~(1<<i);	
	        delay_ms(20);}
		for (i = 0; i < 8; i++)
			{PORTB=~(1<<i);	
	        delay_ms(20);}
		for (i = 8; i > 0; i--)
			{PORTB=~(1<<i);	
	        delay_ms(20);}
		for (i = 0; i < 8; i++)
			{PORTB=~(1<<i);	
	        delay_ms(20);}	
		for (i = 8; i > 0; i--)
			{PORTB=~(1<<i);	
	        delay_ms(20);}
		for (i = 0; i < 8; i++)
		   {PORTB=0xff;
		   delay_ms(40);}
	    for (i = 0; i < 8; i++)
		    {PORTB=0x00;
		    delay_ms(40); }  
		for (i = 0; i < 8; i++)
		   {PORTB=0xff;
		   delay_ms(40);}
	    for (i = 0; i < 8; i++)
		  { PORTB=0x00;
		   delay_ms(40);}	
		for (i = 0; i < 8; i++)
		  {PORTB=0xff;
		  delay_ms(40);}
	    for (i = 0; i < 8; i++)
		  { PORTB=0x00;
		   delay_ms(40); }    
		}
	
 
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 TCCR1A=0X00;
 TCCR1B=0X05;//1024
 TCNT1H=0XFb;
 TCNT1L=0Xbe;
 TIMSK=0X04;
  second=second+1;
  if(second==60)
  { second=0;
     minute=minute+1;
   if(minute==60)
    { minute=0;
     hour=hour+1;
     if(hour==24)
      { hour=0;}  
	 }
   } 
 }

void disply1(void)//开机界面显示
 {
 display_a_string(0,string1);
 display_a_char(16,table[hour/10]);  
 display_a_char(17,table[hour%10]); 
 display_a_char(18,58);
 display_a_char(19,table[minute/10]);
 display_a_char(20,table[minute%10]);
 display_a_char(21,58);
 display_a_char(22,table[second/10]);
 display_a_char(23,table[second%10]);
 display_a_char(25,49);//1.enter
 display_a_char(26,42);
 display_a_char(27,69);
 display_a_char(28,78);
 display_a_char(29,84);
 display_a_char(30,69);
 display_a_char(31,82);
}
void disply2(void)//按ENTER后的界面
{
 display_a_string(0,string2);
 display_a_string(1,string3);
}
void disply3(void)//按1键的界面
 {
 display_a_string(0,string4);
 }
void disply4(void)//按2键的界面
 {
 display_a_string(0,string5);
 }
void disply5(void)//显示取钱还是查寻余额
 {
 display_a_string(0,string61);//
 display_a_string(1,string62);
 } 
void disply6(void)//显示取钱
 {
 display_a_string(0,string63);//ATM忙,不能服务
 display_a_string(1,string631);
 } 
void disply7(void)//显示查询余额
 {
 display_a_string(0,string620);//姓名
 display_a_string(1,string621);//钱数
 }
 void disply8(void)//输入错误的界面
 {
 display_a_string(0,string7);
 display_a_string(1,string8);
 }
 //********************键盘函数***********************************//
uchar scan_key(void)
{
 uchar i,temp;
 DDRC=0x0f;
 PORTC=0xff;
 for(i=0;i<4;i++)
    {
	PORTC=~(1<<i);
	
	delay_us(100);
	temp=PINC&0xf0;
	if(temp!=0xf0)
	  {
	   delay_ms(1);
	   temp=PINC&0xf0;
	   if(temp!=0xf0)
	     {
	     delay_ms(1);
	     temp=temp&0xf0;
         switch(temp)
		      {
			  case 0x70:temp=11-(3-i)*3;break;
			  case 0xb0:temp=10-(3-i)*3;break;
			  case 0xd0:temp=9-(3-i)*3;break;
			 
			  default:break;
			  }
	 	    return   table[temp];
			//return   temp;
	    }
	}
	}
	}
 
	
/**********************************************/
	          /*查键盘*/
/**********************************************/	
unsigned char ks(void)
{
 unsigned char m,n;
 DDRC=0x0f;	
 PORTC=0xff;
 for(n=0;n<4;n++)
 {
 PORTC=~(1<<n);
 delay_ms(50);
 m=PINC&0xf0;
 if(m!=0xf0)
  return 0xff;
 }
 return 0x00;
}
//*******************主函数******************************//
main()
{ int i;
 lcd_data_port=0xff;
 lcd_data_ddr=0xff; //数据口
 lcd_control_port=0x07;
 lcd_control_ddr=0x07;//控制置位
 TCCR1A=0X00;
 TCCR1B=0X05;//1024
 TCNT1H=0XFb;
 TCNT1L=0Xbe;
 TIMSK=0X04;
 SREG|=0X80;//使能全局中段
 lcd_init();
 lcd_write_command(0x01,1);
 while(1)
 {
    disply1();
    
   while((ks()==0xff)&&(scan_key()==0x31))// 修改或输入
 {   while(ks()==0xff);
    lcd_write_command(0x01,1);
    for(;;)
     {
     disply2();
     if(ks()==0xff)
	  {lcd_write_command(0x01,1);
	 break;}
     }
	 
     while((ks()==0xff)&&(scan_key()==0x32))//输入密码
     {while(ks()==0xff);
      lcd_write_command(0x01,1);
      for(;;)
      {
      disply3();
	   if((ks()==0xff)&&(scan_key()>=0x30)&&(scan_key()<=0x39))
	   {while(ks()==0xff);
	    count++;
	    if(count==1)  
	    {buff[0]=scan_key();
	    display_a_char(31,buff[0]);
	     }
       if(count==2)
	    {buff[1]=scan_key();
	    display_a_char(30,buff[0]);
	    display_a_char(31,buff[1]);
	    }   
	   if(count==3) 
	    {buff[2]=scan_key();
	     display_a_char(29,buff[0]);
	     display_a_char(30,buff[1]);
		 display_a_char(31,buff[2]);
	    } 
	   if(count==4) 
	    {buff[3]=scan_key();
	    display_a_char(28,buff[0]);
	    display_a_char(29,buff[1]);
	     display_a_char(30,buff[2]);
		display_a_char(31,buff[3]);
	    } 
	   if(count==5) 
	    {buff[4]=scan_key();
		 display_a_char(27,buff[0]);
	     display_a_char(28,buff[1]);
	     display_a_char(29,buff[2]);
	     display_a_char(30,buff[3]);
		  display_a_char(31,buff[4]);
	    }       
	  if(count==6) 
	     {buff[5]=scan_key();
		 display_a_char(26,buff[0]);
		 display_a_char(27,buff[1]);
	     display_a_char(28,buff[2]);
	     display_a_char(29,buff[3]);
	     display_a_char(30,buff[4]);
		 display_a_char(31,buff[5]);
	     }	
		if(count==7) 
	     {buff[6]=scan_key();
		 display_a_char(25,buff[0]);
		 display_a_char(26,buff[1]);
		 display_a_char(27,buff[2]);
	     display_a_char(28,buff[3]);
	     display_a_char(29,buff[4]);
	     display_a_char(30,buff[5]);
		 display_a_char(31,buff[6]);
	     }	  
		if(count==8) 
	     {buff[7]=scan_key();
		 display_a_char(24,buff[0]);
		 display_a_char(25,buff[1]);
		 display_a_char(26,buff[2]);
		 display_a_char(27,buff[3]);
	     display_a_char(28,buff[4]);
	     display_a_char(29,buff[5]);
	     display_a_char(30,buff[6]);
		 display_a_char(31,buff[7]);
	     }	 	 
		if(count==9) 
	     {buff[8]=scan_key();
		 display_a_char(23,buff[0]);
		 display_a_char(24,buff[1]);
		 display_a_char(25,buff[2]);
		 display_a_char(26,buff[3]);
		 display_a_char(27,buff[4]);
	     display_a_char(28,buff[5]);
	     display_a_char(29,buff[6]);
	     display_a_char(30,buff[7]);
		 display_a_char(31,buff[8]);
		         
	     }
		 
		
		 
		}
	 while((ks()==0xff)&&(scan_key()==0x41)) //确定键
	   {
	    if(count==6)
		 { 
		   lcd_write_command(0x01,1);
			paomadeng();
			delay_ms(1000);
		    while(1)
		     {
			  for(;;)
			   {
			   disply5();//显示取钱还是查询余?
			   if((ks()==0xff))
			     break;
			   }
			    
			   while((ks()==0xff)&&(scan_key()==0x31))//取钱
                  {while(ks()==0xff);
                   lcd_write_command(0x01,1);
                     for(;;)
                    {
                     disply6();
	                 if((ks()==0xff)&&(scan_key()==66))//取消
			          break;
			         }
			       }
			   while((ks()==0xff)&&(scan_key()==0x32))//查询余额
                {while(ks()==0xff);
                 lcd_write_command(0x01,1);
                   for(;;)
                    {
                     disply7();
	                 if((ks()==0xff)&&(scan_key()==66))//取消
			          break;
			        }
			     }	
			  } 			  
		    }			
		  else
		   {lcd_write_command(0x01,1);
		    while(1)
		    {
			  disply8();//显示取钱还是查询余?
	            if((ks()==0xff)&&(scan_key()==66))//取消	
			          break;
			  }
		    }
		  }
	    }	    
       }	   
	 }//与输入密码相对应
	//**************************	*******************	 
			   
   while((ks()==0xff)&&(scan_key()==0x33)) //修改密码
    { while(ks()==0xff);
     lcd_write_command(0x01,1);
     for(;;)
      { 
       disply4();
      }
  
     }
	//}

	 
	
	
	
	
	
	
	
	
	
  }
   
}
   

  

⌨️ 快捷键说明

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