void LCD_Write_half_char(void) {PORTC &= 0x0F; //portc0~3=0
PORTC |= (data_temp<<4)&0xF0; //send LOW 4bit
PORTC |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD delay(2);
PORTC &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD PORTC &= 0X0F;
delay(2);
}
_
void LCD_write_char(uint command,uint data) {
PORTC &= ~LCD_EN; if (command == 0)
PORTC &=~LCD_RS; //RS=0 发送命令
else
PORTC |=LCD_RS; //RS=1 发送数据
data_temp = data;
data_temp=data_temp >>4;
LCD_Write_half_char();
data_temp = data;
LCD_Write_half_char(); }
void LCD_init(void) {
LCD_write_char(0,0x38); delay(1);
LCD_write_char(0,0x02); delay(1);
delay(1);
_
LCD_write_char(0,0x28); // 显示模式设置(不检测忙信号) delay(1);
LCD_write_char(0,0x08); // 显示关闭 delay(1);
LCD_write_char(0,0x01); // 显示清屏 delay(1);
LCD_write_char(0,0x06); delay(1);
LCD_write_char(0,0x0c); delay(5); }
uchar key_read(void) { uchar i;
DDRA = 0x0E; PORTA = 0x0E; i = PINA;
DDRA = 0xf0; PORTA = 0xf0; i |= PINA;
DDRA = 0x00; switch (i) // 显示光标移动设置 // 显示开及光标设置 //获取列地址 //获取行地址 //输出复位 //将按键码转换成键值
_
{ case 0x7d: return 0x31; case 0xbd: return 0x32; case 0xdd: return 0x33; case 0xed: return 0x34; case 0x7b: return 0x35; case 0xbb: return 0x36; case 0xdb: return 0x37; case 0xeb: return 0x38; case 0x77: return 0x2a; case 0xb7: return 0x39; case 0xd7: return 0x30; case 0xe7: return 0x23; default : return 0x00; delay(10); } }
void chush(void) {
uchar i=0,k,j,temp=0x00,m,n;
_
uchar x[8]={0};
uint add1[8]={0x85,0x86,0x87,0x88,0x,0x8a,0x8b,0x8c};
DDRC=0xff; PORTC=0x00;
LCD_init(); }
void main(void) {
uchar i=0,k,j,temp=0x00,m,n,l,w=0,y=0,z,v,t=0,dkz; LCD_write_char(0,0x80); for(k=0;k<5;k++)
LCD_write_char(1,title[k]); LCD_write_char(0,0x80+0x40); for(j=0;j<5;j++)
LCD_write_char(1,title1[j]);
uchar x[8]={0},dec[8]={0},p[16]={0},c[8]={0};
uint add1[8]={0x85,0x86,0x87,0x88,0x,0x8a,0x8b,0x8c};
_
uint add2[16]={0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9, 0xca,0xcb,0xcc,0xcd,0xce,0xcf}; DDRD=0xFF; PORTD=0xF0; DDRC=0xff; PORTC=0x00; LCD_init();
LCD_write_char(0,0x80); for(k=0;k<9;k++)
LCD_write_char(1,title7[k]);
while(i<8) {
c[i]=key_read();
if(c[i]!=0&&c[i]!=temp) {
LCD_write_char(0,add2[i]); LCD_write_char(1,0x2a); temp=key_read(); i++; }
/*delay(2);
_
dkz=PIND; if(dkz==0x70) } if(i==8) { temp=0;
i=0;
for(m=0;m<8;m++) {
void_init(); { i=8; }*/
eeprom_w(add[m],c[m]); //将数据写入EEPROM中的单元 PORTB=eeprom_r(add[m]);//读取EEPROM中的数据,送显
dec[m]=eeprom_r(add[m]);
delay(20); } while(1) {
delay(2); }
_
dkz=PIND;
if(dkz==0xE0)
{
LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);
for(k=0;k<5;k++)
LCD_write_char(1,title[k]);
LCD_write_char(0,0x80+0x40);
for(j=0;j<5;j++)
LCD_write_char(1,title1[j]); }
x[i]=key_read();
if(x[i]!=0&&x[i]!=temp) {
LCD_write_char(0,add1[i]); LCD_write_char(1,0x2a); temp=key_read();
i++; } if(i==8) { temp=0; i=0;
_
for(m=0;m<8;m++) {
if(x[m]==dec[m])
{ w++; }
} if(w==8) {
LCD_write_char(0,0x80+0x45);
for(n=0;n<3;n++)
LCD_write_char(1,title3[n]);
PORTD^=BIT(5);
delay(100); PORTD^=BIT(5);
w=0; delay(200);
LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);
for(k=0;k<16;k++)
LCD_write_char(1,title8[k]);
}
_
else }
{
LCD_write_char(0,0x80+0x45);
for(n=0;n<6;n++)
LCD_write_char(1,title2[n]);
for(l=0;l<6;l++)
{
PORTD^=BIT(5); delay(50); } y++;
}
if(y==3)
{ y=0;
LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);
for(z=0;z<9;z++)
LCD_write_char(1,title4[z]);
dkz=PIND;
while(dkz==0xF0||dkz==0x70);
_
} delay(2); dkz=PIND; if(dkz==0x70) {
chush(); }
else if(dkz==0xB0) {
LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);
for(z=0;z<11;z++) LCD_write_char(1,title5[z]);
while(i<16) {
p[i]=key_read();
if(p[i]!=0&&p[i]!=temp) {
LCD_write_char(0,add2[i]);
_
LCD_write_char(1,0x2a); temp=key_read();
i++; } } if(i==16) { temp=0; i=0;
for(m=0;m<16;m++) {
if(p[m]==sc[m])
{ t++; } }
} if(t==16) {
LCD_write_char(0,0x01); // 显示清屏
LCD_write_char(0,0x80);
for(z=0;z<15;z++) LCD_write_char(1,title6[z]);
_
while(i<8)
{
c[i]=key_read();
if(c[i]!=0&&c[i]!=temp) {
LCD_write_char(0,add2[i]); LCD_write_char(1,0x2a); temp=key_read(); i++; }
}
if(i==8) { temp=0;
i=0;
for(m=0;m<8;m++) {
void_init();
eeprom_w(add[m],c[m]); //将数据写入EEPROM中
的0x0100单元
PORTB=eeprom_r(add[m]);//读取EEPROM中0x0100
单元的数据,送显
dec[m]=eeprom_r(add[m]);
_
}
delay(20);
}
} }
} }
五、实验心得
通过本次课程设计,我对使用ICC进行编程以及程序调试有了进一步的掌握,并且对AVR单片机片上外设功能及其使用有了一个清晰的了解,较熟悉的掌握了单片机学习板上矩阵键盘、1602液晶、蜂鸣器、EEPROM(AT24C02)等外设的使用以及和单片机间的通信。而且通过本次课程设计的完成,我对基于单片机的设计更加有兴趣,有信心了。