一个自己编写的程序:
***********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);
}*/
说明:有一些数据性的文件没有贴出来。