n久前写的avr程序

一个自己编写的程序:

***********pg160128a.h*****************

#include<iom16v.h>
#include<stdarg.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char

#define STX   0x02
#define ETX   0x03
#define EOT   0x04
#define ENQ   0x05
#define BS    0x08
#define LF    0x0A
#define CR    0x0D
#define DLE   0x10
#define ETB   0x17
#define SPACE 0x20
#define COMMA 0x2C

#define TRUE  1
#define FALSE 0
#define HIGH  1
#define LOW   0

//T6963C端口定义
//#define LCMDW        XBYTE[0x8000]//数据口
//#define LCMCW        XBYTE[0x8100]//命令口
#define DIS_RAM_SIZE       0x7fff
#define TXT_START          0x0000
#define GR_START           0x6800
#define CG_RAM_START       0x7800

//T6963C命令定义
#define LC_CUR_POS         0x21//光标位置设置
#define LC_CGR_POS         0x22
#define LC_ADD_POS         0x24
#define LC_TXT_STP         0x40
#define LC_TXT_WID         0x41
#define LC_GRH_STP         0x42
#define LC_GRH_WID         0x43
#define LC_MOD_OR          0x80
#define LC_MOD_XOR         0x81
#define LC_MOD_AND         0x82
#define LC_MOD_TXT_CH      0x83//显示方式为文本特征模式
#define LC_DIS_SW          0x90//显示开关
       //D0=1/0:光标闪烁启动/禁用
       //D1=1/0:光标显示启动/禁用
       //D2=1/0:文本显示启动/禁用
       //D3=1/0:图形显示启动/禁用
#define LC_CUR_SHP          0xA0//光标形状选择:0xa0~0xa7表示光标占的行数
#define LC_AUT_WR           0xB0//自动写设置
#define LC_AUT_RD           0xB1
#define LC_AUT_OVR          0xB2//自动读/写结束
#define LC_INC_WR           0xC0//数据写,地址加1
#define LC_INC_RD           0xC1//数据读,地址加1
#define LC_DEC_WR           0xC2//数据写,地址减1
#define LC_DEC_RD           0xC3//数据读,地址减1
#define LC_NOC_WR           0xC4//数据写,地址不变
#define LC_NOC_RD           0xC5//数据读,地址不变
#define LC_SCN_RD           0xE0//屏读
#define LC_SCN_CP           0xE8//屏拷贝
#define LC_BIT_OP           0xF0//位操作:D0~D2定义:D0~D7位,D3:1置位/0清零

***********pg160128a.c********************

#include"pg160128a.h"
#include<iom16v.h>
#include<macros.h>
#include <stdio.h>
#include<math.h>
#include<string.h>
#include<stdarg.h>
#define uchar unsigned char
#define uint unsigned int
//控制引脚定义
#define wr PB0
#define rd PB1
#define cd PB2
#define lcd_com 1
#define lcd_dat 0
//ASCII字模宽度及高度定义
#define ASC_CHR_WIDTH 6
#define HZ_CHR_WIDTH 12
#define ASC_CHR_HEIGHT 12
#define HZ_CHR_HEIGHT 12
extern const uchar en_show[95*12];
const uchar cn_show0[]=
{
    ......

};

const uchar cn_show1[]=
{
/*--  文字:  精  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x21,0x00,0xAF,0xE0,0x71,0x00,0x27,0xC0,0xF1,0x00,0x2F,0xE0,0x74,0x40,0xA7,0xC0,
0xA4,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,

/*--  文字:  心  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x50,0x40,0x50,0x40,0x50,0x20,0x90,0xA0,
0x10,0x80,0x10,0x80,0x1F,0x80,0x00,0x00,

/*--  文字:  设  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x47,0x80,0x24,0x80,0x04,0x80,0x04,0xE0,0xE8,0x00,0x37,0xC0,
0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,

/*--  文字:  计  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x41,0x00,0x21,0x00,0x01,0x00,0x01,0x00,0xCF,0xE0,0x41,0x00,
0x41,0x00,0x41,0x00,0x51,0x00,0x61,0x00,0x41,0x00,0x00,0x00
};
const uchar cn_show2[]=
{
/*--  文字:  亿  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x10,0x00,0x1F,0xC0,0x20,0x80,0x21,0x00,0x62,0x00,0xA4,0x00,0x24,0x00,0x28,0x20,
0x28,0x20,0x28,0x20,0x27,0xE0,0x00,0x00,

/*--  文字:  瑞  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x01,0x00,0xE9,0x20,0x4F,0xE0,0x40,0x00,0xEF,0xE0,0x42,0x00,0x4F,0xE0,0x7A,0xA0,
0xCA,0xA0,0x0A,0xA0,0x08,0x60,0x00,0x00,

/*--  文字:  工  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x00,0x80,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,

/*--  文字:  作  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x12,0x00,0x12,0x00,0x27,0xE0,0x6A,0x00,0xB2,0x00,0x23,0xC0,0x22,0x00,0x22,0x00,
0x23,0xE0,0x22,0x00,0x22,0x00,0x00,0x00,

/*--  文字:  室  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x04,0x00,0x7F,0xE0,0xC0,0x20,0x3F,0xC0,0x09,0x00,0x10,0x80,0x3F,0xC0,0x04,0x00,
0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,

/*--  文字:  制  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x10,0x20,0x54,0x20,0x7E,0xA0,0x90,0xA0,0xFE,0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,
0x52,0x20,0x56,0x20,0x10,0xE0,0x00,0x00,

/*--  文字:  作  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  宽度不是8的倍数,现调整为:宽度x高度=16x12  --*/
0x12,0x00,0x12,0x00,0x27,0xE0,0x6A,0x00,0xB2,0x00,0x23,0xC0,0x22,0x00,0x22,0x00,
0x23,0xE0,0x22,0x00,0x22,0x00,0x00,0x00
};


const uchar LCD_WIDTH=20;//以字节为单位的宽度(20*8=160像素)
const uchar LCD_HEIGHT=128;//以像素为单位的宽度
uchar g_cur_row,g_cur_col;
uchar t_cur_row,t_cur_col;
uchar show_mode;
uint thome,ghome;
uchar rd_port(uchar sel);
void wr_port(uchar sel,uchar dat);
uchar status_bit_1(void);
uchar status_bit_3(void);
uchar lcd_w_com_p1(uchar cmd,uchar para1);
uchar lcd_w_com_p2(uchar cmd,uchar para1,uchar para2);
uchar lcd_w_com(uchar cmd);
uchar lcd_w_dat(uchar dat);
uchar lcd_r_dat(void);
void set_lcd_pos(uchar row,uchar col);
void cls(void);
uchar lcd_init(void);
void pixel(uchar x,uchar y,uchar mod);
void line(uchar x1,uchar y1,uchar x2,uchar y2,uchar mode);
uchar display_string_at_xy(uchar x,uchar y,char *fmt);
void out_to_lcd(uchar d,uchar x,uchar y);
void draw_image(uchar start_row,uchar start_col,const uchar *g_buffer);
void draw_rect(uchar x,uchar y,uchar width,uchar height,uchar mode);
void cn_show_dis0(uchar x,uchar y);
void cn_show_dis1(uchar x,uchar y);
void cn_show_dis2(uchar x,uchar y);

uchar rd_port(uchar sel)
{
   uchar tmp;
   DDRB=0x07;
  PORTB=0X07;
  DDRA=0x00;//set input,read data 
  PORTA=0XFF;
  if(sel)
   PORTB|=BIT(cd);
  else
   PORTB&=~BIT(cd);
  PORTB&=~BIT(rd);//wr与rd引脚是低电平有效
  tmp=PINA;
  PORTB|=BIT(rd);
  return tmp;
}

void wr_port(uchar sel,uchar dat)
{
  DDRB=0x07;
 PORTB=0X07;
 DDRA=0xff;//set output,write data
 if(sel)
  PORTB|=BIT(cd);//com
 else
  PORTB&=~BIT(cd);//dat
 PORTB&=~BIT(wr);
 PORTA=dat;
 PORTB|=BIT(wr);
}
/*STA1指令读写状态,STA2,STA3数据读写状态 判断函数*/
uchar status_bit_1(void)//在写命令时使用
{
 uchar i;
 for(i=10;i>0;i--)
 {
  if((rd_port(lcd_com)&0x03)==0x03) break;
 }
 return i;//错误时返回0
}

/*STA3数据自动写状态 判断函数*/
uchar status_bit_3(void)//在写数据时使用
{
 uchar i;
 for(i=10;i>0;i--)
 {
  if((rd_port(lcd_com)&0x08)==0x08) break;
 }
 return i;//错误时返回0
}
uchar lcd_w_com_p2(uchar cmd,uchar para1,uchar para2)
{
 if(status_bit_1()==0) return 1;
 wr_port(lcd_dat,para1);//参数是以数据形式写入的,而不是以命令形式
 if(status_bit_1()==0) return 2;
 wr_port(lcd_dat,para2);
 if(status_bit_1()==0) return 3;
 wr_port(lcd_com,cmd);
 return 0;//成功时返回0
}
uchar lcd_w_com_p1(uchar cmd,uchar para1)
{
 if(status_bit_1()==0) return 1;
  wr_port(lcd_dat,para1);
 if(status_bit_1()==0) return 2;
  wr_port(lcd_com,cmd);
 return 0;//成功时返回0
}
uchar lcd_w_com(uchar cmd)
{
 if(status_bit_1()==0) return 1;
  wr_port(lcd_com,cmd);
 return 0;//成功时返回0
}
uchar lcd_w_dat(uchar dat)
{
 if(status_bit_3()==0) return 1;
  wr_port(lcd_dat,dat);
 return 0;//成功时返回0 
}
uchar lcd_r_dat(void)
{
 if(status_bit_1()==0) return 1;
 return rd_port(lcd_dat); 
}
void set_lcd_pos(uchar row,uchar col)
{
 uint pos;
 pos=row*LCD_WIDTH+col;
 lcd_w_com_p2(LC_ADD_POS,pos%256,pos/256);//将pos分解成前一个低字节和后一个高字节
 g_cur_row=row;g_cur_col=col;
}
void cls(void)
{
 uint i;
 lcd_w_com_p2(LC_ADD_POS,0x00,0x00);
 lcd_w_com(LC_AUT_WR);
 for(i=0;i<0x2000;i++)
 {
  status_bit_3();
  lcd_w_dat(0x00);
 }
 lcd_w_com(LC_AUT_OVR);
 lcd_w_com_p2(LC_ADD_POS,0x00,0x00);
 g_cur_row=0;g_cur_col=0;
}
uchar lcd_init(void)
{ 
// RESET=0;
// RESET=1;
 lcd_w_com_p2(LC_TXT_STP,0x00,0x00);
 lcd_w_com_p2(LC_TXT_WID,LCD_WIDTH,0x00);
 lcd_w_com_p2(LC_GRH_STP,0x00,0x00); 
 lcd_w_com_p2(LC_GRH_WID,LCD_WIDTH,0x00);
 lcd_w_com_p1(LC_CGR_POS,CG_RAM_START>>11);
 lcd_w_com(LC_CUR_SHP|0x01);
 lcd_w_com(LC_MOD_OR);
 lcd_w_com(LC_DIS_SW|0x08);
 ghome=GR_START;
 thome=TXT_START;
 return 0;
}


void draw_image(uchar start_row,uchar start_col,const uchar *g_buffer)
{
 uchar i,j;
 for(i=0;i<g_buffer[1];i++)
 {
  set_lcd_pos(start_row+i,start_col);
  lcd_w_com(LC_AUT_WR);
  for(j=0;j<g_buffer[0]/8;j++)
   lcd_w_dat(g_buffer[i*(g_buffer[0]/8)+j+2]);
  lcd_w_com(LC_AUT_OVR);  
 }
}

//画点函数
void pixel(uchar x,uchar y,uchar mod)
{

 uchar start_address,d;
 start_address=7-(x%8);
 d=LC_BIT_OP|start_address;
 if(mod) d|=0x08;
 set_lcd_pos(y,x/8);
 lcd_w_com(LC_BIT_OP|d);
}

void exchange(uchar *a,uchar *b)
{
 uchar t;
 t=*a;*a=*b;*b=t;
}
//画线函数
void line(uchar x1,uchar y1,uchar x2,uchar y2,bit mode)
{
 uchar x,y;
 float k,b;
 if(abs(y1-y2)<=abs(x1-x2))
 {
  k=((float)y2-y1)/((float)x2-x1);
  b=y1-k*x1;
  if(x1>x2) exchange(&x1,&x2);
  for(x=x1;x<=x2;x++)
  {
   y=(uchar)(k*x+b);
   pixel(x,y,mode);
  }
 }
 else
 {
  k=((float)x2-x1)/((float)y2-y1);
  b=x1-k*y1;
  if(y1>y2) exchange(&y1,&y2);
  for(y=y1;y<=y2;y++)
  {
   x=(uchar)(k*y+b);
   pixel(x,y,mode);
  }
 } 
}

uchar display_string_at_xy(uchar x,uchar y,char *fmt)
{
 char c1,c2,c_data;
 uchar i=0,j,ulen;
 ulen=strlen(fmt);
 while(i<ulen)
 {
  c1=fmt[i];
  c2=fmt[i+1];
  set_lcd_pos(y,x/8);
  if(c1>=0) //ASCII码值
  {
   if(c1<0x20)
   {
    switch(c1)
    {
     case CR:
     case LF:
       i++; x=0;
       if(y<52) y+=HZ_CHR_HEIGHT;//因为lcd为pg12864f显示,所以要64-12=52
       continue;
     case BS:
       i++;
       if(y>ASC_CHR_WIDTH) y-=ASC_CHR_WIDTH;
       c_data=0x00; break;
    }
   }
   for(j=0;j<ASC_CHR_HEIGHT;j++)
   {
    if(c1>=0x1f) //0x1f+1=0x20
    {
     c_data=en_show[(c1-0x1f-1)*ASC_CHR_HEIGHT+j];
     set_lcd_pos(y+j,x/8);
     if((x%8)==0)
     {
      lcd_w_com(LC_AUT_WR);
      lcd_w_dat(c_data);
      lcd_w_com(LC_AUT_OVR);
     }
     else
      out_to_lcd(c_data,x,y+j);
    }
    set_lcd_pos(y+j,x/8);
   }
   if(c1!=BS) x+=ASC_CHR_WIDTH;
  }
  i++;
 }
 return ulen;
}
//对于输出起点x不是8的倍数时,原字节分成两部分输出到lcd上
void out_to_lcd(uchar d,uchar x,uchar y)
{
 uchar d1,d2,a,b;
 b=x%8;a=8-b;
 set_lcd_pos(y,x/8);
 lcd_w_com(LC_AUT_RD);
 d1=lcd_r_dat();
 d2=lcd_r_dat();
 d1=(d1&(0xff<<a))|(d>>b);
 d2=(d2&(0xff>>b))|(d<<a);
 lcd_w_com(LC_AUT_OVR);
 
 set_lcd_pos(y,x/8);
 lcd_w_com(LC_AUT_WR);
 lcd_w_dat(d1);
 lcd_w_dat(d2);
 lcd_w_com(LC_AUT_OVR);
}
void draw_rect(uchar x,uchar y,uchar width,uchar height,uchar mode)
{
  if(mode)
 {
   line(x,y,x+width-1,y,1);
  line(x+width-1,y,x+width-1,y+height-1,1);
  line(x,y,x,y+height-1,1);
  line(x,y+height-1,x+width-1,y+height-1,1);
 }
 else
 {
   line(x,y,x+width-1,y,0);
  line(x+width-1,y,x+width-1,y+height-1,0);
  line(x,y,x,y+height-1,0);
  line(x,y+height-1,x+width-1,y+height-1,0);
 }
}
void cn_show_dis0(uchar x,uchar y)
{
 uchar i=0,j,d;
 while(i<3)
 {
  for(j=0;j<12;j++)//注意:每个字占用24个字节数据,写完12行后再回到第一行。
  {
   d=cn_show0[i*24+j*2];//每个字占用24个字节数据,即j*2<24
   set_lcd_pos(y+j,x/8);//在一行中把奇数个字节写在前,
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x,y+j);

   if(j>0) d=cn_show0[i*24+(2*j-1)];//注意:每个字占用24个字节数据
   if(j==0) d=cn_show0[i*24+1];
   set_lcd_pos(y+j-1,(x+8)/8);//在一行中把将偶数个字节写在后,写完12行后再回到第一行。
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x+8,y+j-1);
  }
  x+=17;
  i++;
 }
}

void cn_show_dis1(uchar x,uchar y)
{
 uchar i=0,j,d;
 while(i<4)
 {
  for(j=0;j<12;j++)
  {
   d=cn_show1[i*24+j*2];
   set_lcd_pos(y+j,x/8);
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x,y+j);

   if(j>0) d=cn_show1[i*24+(2*j-1)];
   if(j==0) d=cn_show1[i*24+1];
   set_lcd_pos(y+j-1,(x+8)/8);
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x+8,y+j-1);
  }
  x+=12;
  i++;
 }
}
void cn_show_dis2(uchar x,uchar y)
{
 uchar i=0,j,d;
 while(i<7)
 {
  for(j=0;j<12;j++)
  {
   d=cn_show2[i*24+j*2];
   set_lcd_pos(y+j,x/8);
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x,y+j);

   if(j>0) d=cn_show2[i*24+(2*j-1)];
   if(j==0) d=cn_show2[i*24+1];
   set_lcd_pos(y+j-1,(x+8)/8);
   if((x%8)==0)
   {
    lcd_w_com(LC_AUT_WR);
    lcd_w_dat(d);
    lcd_w_com(LC_AUT_OVR);
   }
   else
    out_to_lcd(d,x+8,y+j-1);
  }
  x+=12;
  i++;
 }
}

************************password.c**********************

#include"pg160128a.h"
#include<iom16v.h>
#include<macros.h>
#include <stdio.h>
#include<math.h>
#include<string.h>
#include<stdarg.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler tmr1_int:iv_TIMER1_OVF

extern const uchar start_image[160*128];

extern uchar lcd_w_com_p1(uchar cmd,uchar para1);
extern uchar lcd_w_com_p2(uchar cmd,uchar para1,uchar para2);
extern uchar lcd_w_com(uchar cmd);
extern uchar lcd_w_dat(uchar dat);

extern void set_lcd_pos(uchar row,uchar col);
extern void cls(void);
extern uchar lcd_init(void);
extern void pixel(uchar x,uchar y,uchar mod);
extern void line(uchar x1,uchar y1,uchar x2,uchar y2,uchar mode);
extern uchar display_string_at_xy(uchar x,uchar y,char *fmt);
extern void out_to_lcd(uchar d,uchar x,uchar y);
extern void draw_image(uchar start_row,uchar start_col,const uchar *g_buffer);
extern void iic_init(void);
extern uchar iic_write(uchar addrh,uchar addrl,uchar data);
extern uchar iic_read(uchar addrh,uchar addrl);
extern uchar iic_writes(uchar addrh,uchar addrl,uchar *s,uchar count);
extern uchar iic_reads(uchar addrh,uchar addrl,uchar count);
extern void draw_rect(uchar x,uchar y,uchar width,uchar height,uchar mode);
extern void cn_show_dis0(uchar x,uchar y);
extern void cn_show_dis1(uchar x,uchar y);
extern void cn_show_dis2(uchar x,uchar y);
extern uchar dat[18];

uchar password[18],temp[18];
uchar key,key_flag=0,press_flag=0,count_flag=0;
uchar ok_flag=1,re_flag=1,ch_flag=1,bk_flag=1;
uchar page_f=1,pw_flag=0,sv_flag=1,success_f=0;
uchar input=1,input_same=0;

void delay1(uint z)
{
  uint x,y;
 for(x=0;x<z;x++)
  for(y=0;y<150;y++);
} 
void key_scan(void)
{
   DDRD=0x0f;
  PORTD=0xf0;//表示输入引脚内部带上拉电阻
  if(((PIND&0xf0)!=0xf0)&&(press_flag==0))//按键按下时该语句只能进入一次,只有按键松手才能再次进入。
  {
     delay1(3);
   if((PIND&0xf0)!=0xf0)
   {
     key_flag=1;press_flag=1;count_flag=1;
      switch(PIND&0xf0)
   {
     case 0xe0:key=0;break;
    case 0xd0:key=1;break;
    case 0xb0:key=2;break;
    case 0x70:key=3;break;
   }
   DDRD=0xf0;
   PORTD=0x0f;//表示输入引脚内部带上拉电阻
   switch(PIND&0x0f)
   {
     case 0x0e:key+=0;break;
    case 0x0d:key+=4;break;
    case 0x0b:key+=8;break;
    case 0x07:key+=12;break;
   }
   }
  }
  if((PIND&0xf0)==0xf0)//没有键按下
  {
    delay1(5);
  if((PIND&0xf0)==0xf0) 
  {
    press_flag=0;
   
  }
  }
}

void init(void)
{
  lcd_init();
 iic_init();
 set_lcd_pos(0,0);
 cls();
 draw_image(0,0,start_image);
 delay1(10000);
 cls();
 display_string_at_xy(36,2,"  Information");
 draw_rect(0,17,160,111,1);
 display_string_at_xy(20,24," MCU:ATmega16");
 display_string_at_xy(20,41," LCD:PG160128A");
 display_string_at_xy(20,58," eeprom:24LC256");
 display_string_at_xy(20,75," key:4*4keyboard");
 display_string_at_xy(4,96,"wait...");
 display_string_at_xy(4,113,"   into password test!");
 
 delay1(10000);
 cls();
 display_string_at_xy(4,2,"   password test mode!");
 line(0,17,159,17,1);
 display_string_at_xy(20,50,"input password:");
 draw_rect(15,66,130,16,1);
 display_string_at_xy(16,68,"|");
}
void t1_init(void)
{
  TCCR1B=0x03;    //64分频
 TCNT1H=0; 
 TCNT1L=0;     
 TIMSK|=BIT(TOIE1);
 SREG|=BIT(7);  
}
uchar cnt_flag=1,w=0;
void tmr1_int(void)
{
 if(cnt_flag)
 {
   cnt_flag=0;
   display_string_at_xy(16+w,68,"|");
 }
 else
 {
   cnt_flag=1;
   display_string_at_xy(16+w,68," ");
 }
}


void main(void)
{
  
  uchar temp,i,j,sum_flag=0,k;
 uchar pw[18],tmp[18];
 uchar a[18];
label1:
  init();
 t1_init();
 //iic_write(0,0,2);
 while(1)
 {
   key_scan();
  if(key_flag==1)
  {
    key_flag=0;
    if(key==12)
   {
     if((ok_flag)&&(page_f==3))//save password
    {
      bk_flag=1;
      ok_flag=0;TCCR1B=0x00;//timer0 stop work
      if(i>0)
     {
       if(i>3)
      {
        if(input==1)
       {
        for(k=0;k<i;k++)
         tmp[k]=pw[k];
        
        w=0;     i=0;
        page_f=3;ok_flag=1;
        for(k=0;k<18;k++)
        {
          a[k]='';pw[k]='';
        }
         cls();
        display_string_at_xy(4,2,"   password test mode!");
        line(0,17,159,17,1);
        display_string_at_xy(20,50,"input again:");
        draw_rect(15,66,130,16,1);
        TCCR1B=0x03;    //timer0 start work
       }
       if(input==2)
       {
        for(k=0;k<i;k++)
        {
          if(pw[k]!=tmp[k])
         {
            input_same=0;
          input=1;
          break;
         }
         if(k==(i-1))
         {
           input_same=1;
          input=1;
         }
        }
        
        if(input_same)
        {
         iic_write(0,0,i);
         delay(100);
         iic_writes(0,0x01,pw,i);
         cls();
         display_string_at_xy(20,67,"  password saved!");
         draw_rect(15,50,130,50,1);
         delay(10000);
         goto success_label;
        }
        else
        {
         goto label3;//防止程序执行到下面input=2;这条语句,下次按钮按下时,就不执行if(input==1)条件了。
        }
       }
       input=2;
      }
      else
      {
        if(input==1)
       {
        cls();
        display_string_at_xy(26,52,"    save fail!");
        display_string_at_xy(20,66,"password must");
        display_string_at_xy(20,82,"     more than 3!");
        draw_rect(15,50,130,50,1);
        page_f=2;re_flag=1;success_f=0;ch_flag=0;sv_flag=0;input=1;
       }
       if(input==2)
       {
       label3:
         cls();
        display_string_at_xy(26,52,"    error!");
        display_string_at_xy(20,66,"input is");
        display_string_at_xy(20,82,"  not same twice!");
        draw_rect(15,50,130,50,1);
        page_f=2;re_flag=1;success_f=0;ch_flag=0;sv_flag=0;input=1;
       }
      }
     }
     else
     {
       if(input==1)
      {
        cls();
       display_string_at_xy(26,52,"      error!");
       display_string_at_xy(20,66," Can not input");
       display_string_at_xy(20,82,"  blank password!");
       draw_rect(15,50,130,50,1);
       page_f=2;re_flag=1;success_f=0;ch_flag=0;sv_flag=0;input=1;
      }
      if(input==2)
      {
        goto label3;
      }
     }
    }
     if((ok_flag)&&(page_f==1))//input password
    {
      bk_flag=1;
      ok_flag=0;TCCR1B=0x00;//timer0 stop work
     temp=iic_read(0,0);
     if(temp!=i)
     {
       cls();
      display_string_at_xy(20,67,"  password error!");
      draw_rect(15,50,130,50,1);
      page_f=2;re_flag=1;success_f=0;ch_flag=0;sv_flag=1;input=1;
     }
     else
     {
       delay(10);
         iic_reads(0,0x01,i);
      for(k=0;k<i;k++)
      {
       if(pw[k]!=dat[k])
       {
         pw_flag=1;
        break;
       }
       if(k==(i-1)) pw_flag=0;
      }
      if(pw_flag==1)
      {
        cls();
       display_string_at_xy(20,67,"  password error!");
       draw_rect(15,50,130,50,1);
       page_f=2;re_flag=1;success_f=0;ch_flag=0;sv_flag=1;input=1;
      }
      else
      {
        cls();
       display_string_at_xy(20,60,"      success!");
       display_string_at_xy(18,75,"  into wait for...");
       draw_rect(15,50,130,50,1);
       delay(10000);
      success_label:
       cls();
       display_string_at_xy(0,0,"**************************");
       display_string_at_xy(0,16,"   made by Chen Qianyi!   ");
       display_string_at_xy(0,32,"**************************");
       page_f=2;re_flag=0;success_f=1;ch_flag=1;sv_flag=1;
       cn_show_dis0(55,56);
       cn_show_dis1(55,73);
       cn_show_dis2(35,90);
      }
     }
    }
   }
   if(key==13)
   {
     if(re_flag==1)
    {
      re_flag=0;
     if(sv_flag==1)
     {
     label0:
       ok_flag=1;bk_flag=1;sum_flag=0;
      w=0;    i=0;
      page_f=1;
      for(k=0;k<18;k++)
      {
        a[k]='';pw[k]='';
      }
      cls();
      display_string_at_xy(4,2,"   password test mode!");
      line(0,17,159,17,1);
      display_string_at_xy(20,50,"input password:");
      draw_rect(15,66,130,16,1);
      TCCR1B=0x03;    //timer0 start work
     }
     else
     {
       goto label2;
     }
    }
   }
   if(key==14)
   {
     if(ch_flag==1)
    {
      ch_flag=0;bk_flag=1;
     if(success_f==1)
     {
     label2:
       w=0;     i=0;
      page_f=3;ok_flag=1;
      for(k=0;k<18;k++)
      {
        a[k]='';pw[k]='';
      }
       cls();
      display_string_at_xy(4,2,"   password test mode!");
      line(0,17,159,17,1);
      display_string_at_xy(20,50,"input new password:");
      draw_rect(15,66,130,16,1);
      TCCR1B=0x03;    //timer0 start work
     }
     else
     {
       TCCR1B=0x00;//timer0 stop work
       cls();
      display_string_at_xy(28,67,"     No Right!");
      draw_rect(15,50,130,50,1);
      delay(10000);
      goto label0;
     }
    }
   }
   if(key==15)
   {
     if(bk_flag==1)
    {
      bk_flag=0;TCCR1B=0x00;//timer0 stop work
     w=0;     i=0;
     page_f=1;ok_flag=1;
     for(k=0;k<18;k++)
     {
      a[k]='';pw[k]='';
     }
       goto label1;
    }
   }
    if((sum_flag==0)&&(key<12))
   {
     if((page_f==1)||(page_f==3))
    {
        a[i]='*';
     pw[i]=key+'';
     display_string_at_xy(16,68,a);
       i++;
     key_flag=0;
     if(i>15)
     {
          sum_flag=1;
     }
    }
   }
  }
  if((count_flag==1)&&(key<12))
  {
    count_flag=0;
   w+=6;
   if(w>96)
     TCCR1B=0x00;//timer0 stop work
  }
 }
}

 ************************iic.c**************************

#include <iom16v.h>   //包含型号头文件
#include <macros.h>   //包含"位"操作头文件
#include <stdio.h>   //标准输入输出头文件
#define uchar unsigned char
#define uint unsigned int
#define Fclk 8000000UL
#define bitrate 100000UL
void delay(uint z);
void iic_init(void);
uchar iic_write(uchar addrh,uchar addrl,uchar data);
uchar iic_read(uchar addrh,uchar addrl);
uchar iic_writes(uchar addrh,uchar addrl,uchar *s,uchar count);
uchar iic_reads(uchar addrh,uchar addrl,uchar count);

void delay(uint z)
{
 uint x,y;
 for(x=0;x<z;x++)
  for(y=0;y<100;y++);
}

void iic_init(void)
{
  TWSR=0x00;
  if((TWSR&0x03)==0)
   TWBR=(Fclk/bitrate-16)/8;
 if((TWSR&0x03)==0x01)
   TWBR=(Fclk/bitrate-16)/32;
 if((TWSR&0x03)==0x02)
   TWBR=(Fclk/bitrate-16)/128;
 if((TWSR&0x03)==0x03)
   TWBR=(Fclk/bitrate-16)/512;
}
//single write
uchar iic_write(uchar addrh,uchar addrl,uchar data)
{
  TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//start
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x08) return 0;
 TWDR=0xa0;            //write iic_device address+write bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x18) return 0;
 TWDR=addrh;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWDR=addrl;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWDR=data;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN);//stop
}
//single read
uchar iic_read(uchar addrh,uchar addrl)
{
   uchar dat;
  TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//start
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x08) return 0;
 TWDR=0xa0;            //write iic_device address+write bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x18) return 0;
 TWDR=addrh;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWDR=addrl;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//restart
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x10) return 0;
 TWDR=0xa1;            //write iic_device address+read bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x40) return 0;
 TWCR=BIT(TWINT)|BIT(TWEN);
 
 TWCR=BIT(TWEN);//no_ack
 while(!(TWCR&BIT(TWINT)));
 dat=TWDR;
 if((TWSR&0xf8)!=0x58) return 0;
 TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN);//stop
 return dat;
}

//more write
uchar iic_writes(uchar addrh,uchar addrl,uchar *s,uchar count)
{
  uchar i;
  TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//start
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x08) return 0;
 TWDR=0xa0;            //write iic_device address+write bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x18) return 0;
 TWDR=addrh;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWDR=addrl;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 for(i=0;i<count;i++)
 {
   TWDR=*s++;
  TWCR=BIT(TWINT)|BIT(TWEN);
  while(!(TWCR&BIT(TWINT)));
  if((TWSR&0xf8)!=0x28) return 0;
 }
 TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN);//stop
}
//more read
uchar dat[18];
uchar iic_reads(uchar addrh,uchar addrl,uchar count)
{
  uchar i;
  TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//start
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x08) return 0;
 TWDR=0xa0;            //write iic_device address+write bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x18) return 0;
 TWDR=addrh;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWDR=addrl;
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x28) return 0;
 TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);//restart
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x10) return 0;
 TWDR=0xa1;            //write iic_device address+read bit
 TWCR=BIT(TWINT)|BIT(TWEN);
 while(!(TWCR&BIT(TWINT)));
 if((TWSR&0xf8)!=0x40) return 0;
 for(i=0;i<count;i++)
 {
     TWCR=BIT(TWINT)|BIT(TWEN);
  if(i<(count-1))
  {
   TWCR=BIT(TWEA)|BIT(TWEN);//send ack
   while(!(TWCR&BIT(TWINT)));
   if((TWSR&0xf8)!=0x50) return 0;
  }
  else
  {
   TWCR=BIT(TWEN);//not send ack
   while(!(TWCR&BIT(TWINT)));
   if((TWSR&0xf8)!=0x58) return 0;
  }
  dat[i]=TWDR;
 }
 TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN);//stop
}

/*
void main(void)
{
  iic_init();
 iic_write(0,0,0xaa);
 delay(100);
 iic_read(0,0);
 while(1);
}*/



说明:有一些数据性的文件没有贴出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
#include <iom16v.h> #include <macros.h> #define RS_0 PORTD &= ~(1 << PD3) #define RS_1 PORTD |= (1 << PD3) #define RW_0 PORTD &= ~(1 << PD4) #define RW_1 PORTD |= (1 << PD4) #define EN_0 PORTD &= ~(1 << PD6) #define EN_1 PORTD |= (1 << PD6) //微秒级延时程序晶振8MHZ void delay_us(int time) { do { time--; } while (time>1); } //毫秒级延时程序晶振8MHZ void delay_ms(unsigned int time) { while(time!=0) { delay_us(1000); time--; } } /*显示屏命令入函数*/ void LCD_write_com(unsigned char com) { RS_0; RW_0; PORTB = com; EN_1; delay_us(20); EN_0; } /*显示屏命令入函数*/ void LCD_write_data(unsigned char data) { RS_1; RW_0; PORTB = data; EN_1; delay_us(200); EN_0; } /*显示屏清空显示*/ void LCD_clear(void) { LCD_write_com(0x01); delay_ms(5); } /*显示屏字符串入函数*/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } while (*s) { LCD_write_data( *s); s ++; } } /*显示屏单字符入函数*/ void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); } else { LCD_write_com(0xC0 + x); } LCD_write_data( data); } /*显示屏初始化函数*/ void LCD_init(void) { DDRB = 0xFF; /*I/O口方向设置*/ DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6); LCD_write_com(0x38); /*显示模式设置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/ LCD_write_com(0x06); /*显示光标移动设置*/ delay_ms(5); LCD_write_com(0x0C); /*显示开及光标设置*/ } void main(void) { unsigned char i; unsigned char *p; PORTA = 0xFF; /*打开上拉*/ DDRA = 0x00; /*方向输入*/ PORTB = 0xFF; /*电平设置*/ DDRB = 0xFF; /*方向输出*/ PORTC = 0x7F; DDRC = 0x80; PORTD = 0xFF; DDRD = 0x00; delay_ms(100); LCD_init(); while (1) { i = 1; p = "yixiangongren"; //LCD_clear(); LCD_write_str(1,0,"www.eehome.cn"); delay_ms(50); while (*p) { LCD_write_char(i,1,*p); i ++; p ++; //delay_ms(50); } delay_ms(500); } } 本文来自: 电子工程师之家http://www.eehome.cn

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值