|
給你改了,對(duì)比一下就知道哪里錯(cuò)了。
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define delaynop() {_nop_;_nop_;_nop_;_nop_;}
- sbit LCD_RS = P2^0; //寄存器選擇(RS=0,命令寄存器;RS=1,數(shù)據(jù)寄存器)
- sbit LCD_RW = P2^1; //讀寫(xiě)端(RW=1,讀;RW=0,寫(xiě))
- sbit LCD_EP = P2^2;
- void delay(int ms)
- { //延時(shí)子程序
- int i;
- while(ms--)
- {
- for(i = 0; i< 120; i++) ;
- }
- }
- /****************查忙函數(shù)************************/
- bit lcd_bz()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EP = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0 & 0x80); //檢測(cè)P0最高位是否為1
- LCD_EP = 0;
- return result;//返回查忙結(jié)果
- }
- /****************寫(xiě)命令函數(shù)************************/
- void lcd_wcmd(uchar cmd)
- { // 寫(xiě)入指令數(shù)據(jù)到LCD
- while(lcd_bz());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EP = 0;
- _nop_();
- _nop_();
- P0 = cmd; //將8位指令通過(guò)P0口傳給1602
- _nop_();
- _nop_(); //用于產(chǎn)生一個(gè)脈沖寬度
- _nop_();
- _nop_();
- LCD_EP = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 0;
- }
- /*****設(shè)定顯示位置***********/
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80);
- }
- /****************寫(xiě)數(shù)據(jù)函數(shù)************************/
- void lcd_wdat(uchar dat)
- { //寫(xiě)入字符顯示數(shù)據(jù)到LCD
- while(lcd_bz());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EP = 0;
- P0 = dat; //將8位數(shù)據(jù)通過(guò)P0口傳給1602
- _nop_();
- _nop_(); //用于產(chǎn)生一個(gè)脈沖寬度
- _nop_();
- _nop_();
- LCD_EP = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EP = 0;
- }
- /*******LCD初始化設(shè)定*********/
- void lcd_init()
- {
- lcd_wcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
- delay(1);
- lcd_wcmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)
- delay(1);
- lcd_wcmd(0x06); //移動(dòng)光標(biāo)
- delay(1);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
- delay(1);
- }
- sbit k1=P1^0;
- sbit k2=P1^1;
- uchar keycount=0;
- uchar code msg1[]={"second watch 0"};
- uchar code msg2[]={">>>> "};
- uchar code prompts[][16]={
- {"::1----> "},
- {"::1---->::2" },
- {"::1->2::3--> "},
- {"::1->2::3-->4 "},
- };
- uchar time_buffer[]={0,0,0,0};
- uchar LCD_display_buffer[]={"00:00:00:00"};
- void show_second()
- {
- uchar i;
- lcd_pos(0x45);
- for(i=3;i!=0xff;i--)
- {
- LCD_display_buffer[2*i+1]=time_buffer[i]/10+'0';
- LCD_display_buffer[2*i]=time_buffer[i]%10+'0';
- lcd_wdat(LCD_display_buffer[2*i+1]);
- lcd_wdat(LCD_display_buffer[2*i]);
- lcd_wdat(':');
- }
- }
- void time0() interrupt 1 using 0
- {
- TH0=-10000/256;
- TL0=-10000%256;
- time_buffer[0]++;
- if (time_buffer[0]==100)
- {
- time_buffer[0]=0;
- time_buffer[1]++;
- }
- if (time_buffer[1]==60)
- {
- time_buffer[1]=0;
- time_buffer[2]++;
- }
- if (time_buffer[2]==60)
- {
- time_buffer[2]=0;
- time_buffer[3]++;
- }
- if (time_buffer[3]==24)
- {
- time_buffer[3]=0;
- }
- }
- void display_string(uchar * str,uchar lineno)
- {
- uchar k;
- lcd_pos(lineno);
- for(k=0;k<16;k++)
- lcd_wdat(str[k]);
- }
- void main()
- {
- uchar i;
-
- IE=0x82;
- TMOD=0x01;
- TH0=-10000/256;
- TL0=-10000%256;
- lcd_init();
- display_string(msg1,0x00);
- display_string(msg2,0x40);
- EA=1;
- ET0=1;
- while(1)
- {
- if(k1==0)
- {
- delay(100);
- i=++keycount;
- switch(i)
- {
- case 1:
- case 3: TR0=1;
- display_string(prompts[i-1],0);
- break;
- case 2:
- case 4: TR0=0;
- display_string(prompts[i-1],0);
- break;
- default:TR0=0;
- break;
- }
- while(k1==0);
- }
- else
- if(k2==0)
- {
- TR0=0;
- keycount=0;
- for(i=0;i<4;i++)
- time_buffer[i]=0;
- display_string(msg1,0);
- delay(100);
- while(k2==0);
- }
- show_second();
- }
- }
復(fù)制代碼 |
|