程序目的 0-9,傳入eeprom后,讀取eeprom里面的內容,顯示到LCD1602里面,但是沒辦法顯示0求解釋:
- #include <reg52.h>
- #include "intrins.h"
- /*-----------------------宏定義----------------*/
- #define uint unsigned int
- #define uchar unsigned char
- #define RS_LOW RS=0
- #define RS_HIGH RS=1
- #define RW_LOW RW=0
- #define RW_HIGH RW=1
- #define EN_LOW EN=0
- #define EN_HIGH EN=1
- #define Read_ATadd 0xa1
- #define Write_ATadd 0xa0
- /***************設置特殊功能寄存器位變量**********/
- sbit SDA = P2^0;
- sbit SCL = P2^1;
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P2^5;
- sbit DU = P2^6;
- sbit WE = P2^7;
- /***************設置特殊功能寄存器位變量**********/
- Check_Busy();
- /*-----------------------宏定義----------------*/
- //unsigned char display[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//讀入的是ASCII碼,{"0123456789abcdef"}差別是什么?
- unsigned char display[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;
- /*-----------------------定時函數----------------*/
- void delay1ms()
- {
- uchar i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++);
- }
- void dalaynms(uchar n)
- {
- while(n--)
- {
- delay1ms();
- }
- }
- /*-----------------------定時函數----------------*/
- /*---------------寫指令-----------------------*/
- void WrAdress(uchar a)
- {
- while(Check_Busy());
- RS_LOW;
- RW_LOW;
- EN_HIGH;
- dalaynms(1);
- P0=a;
- EN_LOW;
- }
- /*---------------寫指令-----------------------*/
- /*---------------寫數據-----------------------*/
- void WrData(uchar a)
- {
- while(Check_Busy());
- RS_HIGH;
- RW_LOW;
- EN_HIGH;
- dalaynms(1);
- P0=a;
- EN_LOW;
- }
- /*---------------寫數據-----------------------*/
- /*---------------讀忙指令-----------------------*/
- Check_Busy()
- {
- uchar a;
- P0 = 0xff;
-
- RS_LOW;
- RW_HIGH;
- EN_LOW;
- dalaynms(1);
- EN_HIGH;
- a = P0;
- return (bit)(a&0x80);
- }
- /*---------------讀忙指令-----------------------*/
- /*---------------寫字符數據-----------------------*/
- void Lcd1602_Wrchar(uchar x,uchar y,uchar z)//定義為行標志,y定義為是第幾位,z定義為這個是字符串還是字符
- {
-
- if(x==0)
- {
- WrAdress(0x80 +y);
- }
- else
- WrAdress(0xC0 +y);
- WrData(z);
- WrAdress(0x0c);
-
- }
- /*---------------寫字符數據-----------------------*/
- /*-----------------------start----------------*/
- void start()
- {
- SCL = 1;
- SDA = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL = 0;//允許SDA進行變化
- }
- /*-----------------------start----------------*/
- /*-----------------------stop----------------*/
- void stop()
- {
- SDA = 0;
- SCL = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SDA = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*-----------------------stop----------------*/
- /*-----------------------應答----------------*/
- AT24C02_ack()
- {
- bit ack;
- SDA = 1;
- _nop_();
- _nop_();
- SCL =1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ack = SDA;
- SCL =0;
- // while(ack);
- return ack;
- }
- /*-----------------------應答----------------*/
- /*-----------------------讀一個字節----------------*/
- At24c02_Read_bit()
- {
- uchar i,x;
- for(i =0;i<8;i++)
- {
- SCL =1;
- x = (x<<1)|(uchar)SDA;
- SCL =0;//允許SDA進行變化
- }
- return(x);
- }
- /*-----------------------讀一個字節----------------*/
- /*-----------------------寫一個字節----------------*/
- void At24c02_write_bit(uchar y)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- SDA = (bit)(y&0x80);
- _nop_();
- y<<=1;
- SCL =1;
- _nop_();
- _nop_();
- SCL = 0;
- }
- }
- /*-----------------------寫一個字節----------------*/
- void init()
- {
- SDA = 1;
- SCL = 1;
- WE = 1;
- P0 = 0xff;
- WE = 0;
- WrAdress(0x01);//清屏同時,數據指針也會清零即變成0x80;
- WrAdress(0x38); //設置 16×2 顯示,5×7 點陣,8 位數據接口
- WrAdress(0x0f); // 顯示(1 有效)、C 光標顯示(1 有效)、B 光標閃爍(1 有效)
- WrAdress(0x06);//讀或寫一個字符后地址指針加 1 &光標加 1
- }
- /*-----------------------在特定位置讀字節----------------*/
- At24c02_Read(uchar add)
- {
- uchar date;
- start();
- At24c02_write_bit(Write_ATadd);
- AT24C02_ack();
- At24c02_write_bit(add);
- AT24C02_ack();
- start();
- At24c02_write_bit(Read_ATadd);
- AT24C02_ack();
- date = At24c02_Read_bit();
- stop();
- return(date);
- }
- /*-----------------------在特定位置讀字節----------------*/
- /*-----------------------在特定位置寫字節----------------*/
- void At24c02_write(uchar x,uchar addr )
- {
- start();
- At24c02_write_bit(Write_ATadd);
- AT24C02_ack();
- At24c02_write_bit(addr);
- AT24C02_ack();
- At24c02_write_bit(x);
- AT24C02_ack();
- stop();
- }
- void main()
- {
- uchar i,j;
- init();
- while(1)
- {
- for(i=0;i<10;i++)
- {
- At24c02_write(display[i],i);
- }
-
- for(i=0;i<10;i++)
- {
- j = At24c02_Read(i);
- Lcd1602_Wrchar(0,8,j);
- dalaynms(200);
- dalaynms(200);
- dalaynms(200);
-
- }
- }
- }
-
復制代碼 |