|
各位老大,我想做一個(gè)按鍵計(jì)數(shù)存儲(chǔ)在2402里面再通過串口發(fā)生,也可以通過1602顯示,搞了好多天,實(shí)在搞不了,請求大神們看看我的程序好嗎?
目前已完成的功能有:
1、按鍵計(jì)數(shù)可以通過1602顯示出來。
2、按鍵計(jì)數(shù)也可以通過串口發(fā)送。
請問怎么就是不能存儲(chǔ)到24C02里面呢?2402存儲(chǔ)的程序我是參照宋雪松老師的課程改寫的,是不是哪里不對呀?
有條件的朋友可以幫忙調(diào)試下,硬件接口如下:
#define LCD1602_DB P0
sbit LCD1602_RS = P2^7;
sbit LCD1602_RW = P2^6;
sbit LCD1602_E = P2^5;
sbit key1=P3^2;
sbit LED=P3^3;
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;
再次多謝大家了!
*****************************************/
#include <reg52.h>
#include "uart.h"
#include "lcd1602.h"
#include "I2C.h"
#include <intrins.h>
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
unsigned char date;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit LED=P3^3;
unsigned char count;
unsigned char dat;
unsigned int i;
unsigned char buf[5];
unsigned char str[10];
unsigned char uart_buf; //接收數(shù)據(jù)寄存器
unsigned char distate[12];//計(jì)數(shù)緩沖區(qū)數(shù)組 .
/* 函數(shù)申明 -----------------------------------------------*/
void delay(uint z);
//void Initial_com(void);
//***********************************************************
/*
********************************************************************************
** 函數(shù)名稱 : delay(uint z)
** 函數(shù)功能 : 延時(shí)函數(shù)
********************************************************************************
*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/***************************************************
* 外部中斷0初始化子函數(shù)
* 下降沿觸發(fā),開啟INT0中斷,開總中斷
****************************************************/
void int0_init(void)
{
IT0 = 1; //下降沿觸發(fā)
EX0 = 1; //開啟INT0中斷
EA = 1; //開啟總中斷
}
/* 將按鍵計(jì)數(shù)賦值給數(shù)組,便于液晶顯示---------------- */
void display()
{
buf[1] = count/1000+0x30;
buf[2] = count%1000/100+0x30; //0x30就是把十進(jìn)制換成十六進(jìn)制
buf[3] = count%1000%100/10+0x30;
buf[4] = count%1000%100%10+'0'; // '0'=0x30
}
/* 讀取EEPROM中的一個(gè)字節(jié),addr-字節(jié)地址 */
unsigned char E2ReadByte(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CWrite(0x50<<1); //尋址器件,后續(xù)為寫操作
I2CWrite(addr); //寫入存儲(chǔ)地址
I2CStart(); //發(fā)送重復(fù)啟動(dòng)信號
I2CWrite((0x50<<1)|0x01); //尋址器件,后續(xù)為讀操作
dat = I2CReadNAK(); //讀取一個(gè)字節(jié)數(shù)據(jù)
I2CStop();
return dat;
}
/* 向EEPROM中寫入一個(gè)字節(jié),addr-字節(jié)地址 */
void E2WriteByte(unsigned char addr, unsigned char dat)
{
I2CStart();
I2CWrite(0x50<<1); //尋址器件,后續(xù)為寫操作
I2CWrite(addr); //寫入存儲(chǔ)地址
I2CWrite(dat); //寫入一個(gè)字節(jié)數(shù)據(jù)
I2CStop();
}
/* E2讀取函數(shù),buf-數(shù)據(jù)接收指針,addr-E2中的起始地址,len-讀取長度 */
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
{
do { //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作
I2CStart();
if (I2CWrite(0x50<<1)) //應(yīng)答則跳出循環(huán),非應(yīng)答則進(jìn)行下一次查詢
{
break;
}
I2CStop();
} while(1);
I2CWrite(addr); //寫入起始地址
I2CStart(); //發(fā)送重復(fù)啟動(dòng)信號
I2CWrite((0x50<<1)|0x01); //尋址器件,后續(xù)為讀操作
while (len > 1) //連續(xù)讀取len-1個(gè)字節(jié)
{
*buf++ = I2CReadACK(); //最后字節(jié)之前為讀取操作+應(yīng)答
len--;
}
*buf = I2CReadNAK(); //最后一個(gè)字節(jié)為讀取操作+非應(yīng)答
I2CStop();
}
/* E2寫入函數(shù),buf-源數(shù)據(jù)指針,addr-E2中的起始地址,len-寫入長度 */
void E2Write(unsigned char *buf, unsigned char addr, unsigned char len)
{
while (len--)
{
do { //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作
I2CStart();
if (I2CWrite(0x50<<1)) //應(yīng)答則跳出循環(huán),非應(yīng)答則進(jìn)行下一次查詢
{
break;
}
I2CStop();
} while(1);
I2CWrite(addr++); //寫入起始地址
I2CWrite(*buf++); //寫入一個(gè)字節(jié)數(shù)據(jù)
I2CStop(); //結(jié)束寫操作,以等待寫入完成
}
}
//*************************
//**********主函數(shù)*********
//*************************
main()
{
UART_INIT(); // 串口初始化
int0_init() ; // 外部中斷初始化
InitLcd1602();
while(1)
{
E2Read(buf, 0x22, sizeof(buf)); //從E2中讀取一段數(shù)據(jù)
display(); // 將按鍵計(jì)數(shù)賦值給數(shù)組,便于液晶顯示
LcdShowStr(0, 0, "ji shu :"); //顯示在液晶上
LcdShowStr(1,1,&buf[1]); //buf數(shù)量里面對應(yīng)count,是外部中斷得到的按計(jì)數(shù)
E2Write(buf, 0x22, sizeof(buf)); //再寫回到E2中
// while(1);
}
}
/***************************************************
* 中斷響應(yīng)子函數(shù)
* 響應(yīng)外部中斷0,按鍵低電平一次就加一,中斷標(biāo)志位自動(dòng)清零
****************************************************/
void int0_process() interrupt 0
{
dat+=1; //進(jìn)入一次中斷 就加一次
count = dat;
while(key1 == 0);
delay(200);
IE0 = 0; // 外部中斷標(biāo)志位
// uart_send_byte(count) ; // 發(fā)送按鍵次數(shù)到串口
// delay(200);
}
/***************************************************
* 中斷服務(wù)子函數(shù)
* 清除RI,同時(shí)判斷接到的數(shù)據(jù)
****************************************************/
void uart(void) interrupt 4
{
// unsigned char uart_buf; //接收數(shù)據(jù)寄存器
if(RI) //是否收到數(shù)據(jù)
{
RI=0; //清中斷請求
uart_buf = SBUF;
if(uart_buf == 0xaa) //判斷
{
uart_send_byte(count) ; // 發(fā)送按鍵次數(shù)到串口
delay(200);
}
if(uart_buf == 0x11) //判斷
{
//uart_send_byte(count) ; // 發(fā)送按鍵次數(shù)到串口
LED =0; // (在這里和串口中斷都可以發(fā)送數(shù)據(jù)的,區(qū)別:是否連續(xù))
delay(200);
}
if(uart_buf == 0x22) //判斷
{
//uart_send_byte(count) ; // 發(fā)送按鍵次數(shù)到串口
LED =1;
delay(200);
}
}
}
|
|